diff -Naur ns-3.23/AUTHORS ns-3.24/AUTHORS
--- ns-3.23/AUTHORS	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/AUTHORS	2015-09-15 11:18:44.000000000 -0700
@@ -82,6 +82,7 @@
 Joe Kopena (tjkopena@cs.drexel.edu)
 Christopher Kosecki (christopher.l.kosecki.ctr@mail.mil)
 Aleksey Kovalenko (kovalenko@iitp.ru)
+Alexander Krotov (ilabdsf@yandex.ru)
 Mathieu Lacage (mathieu.lacage@inria.fr)
 Emmanuelle Laprise (emmmanuelle.laprise@bluekazoo.ca)
 Kristijan Lenković (k.lenkovic@me.com)
@@ -100,6 +101,7 @@
 Jonathan McCrohan (jmccroha@tcd.ie)
 Andrew McGregor (andrewmcgr@gmail.com)
 Vedran Miletić (rivanvx@gmail.com)
+Saswat Mishra (clicksaswat@gmail.com)
 Jens Mittag (jens.mittag@kit.edu)
 Marco Miozzo (mmiozzo@cttc.es)
 Faker Moatamri (faker.moatamri@inria.fr)
@@ -111,6 +113,7 @@
 Hemanth Narra (hemanth@ittc.ku.edu)
 Roman Naumann (naumann@informatik.hu-berlin.de)
 Ben Newton (bn@cs.unc.edu)
+Cecchi Niccolò (insa@igeek.it)
 Andreas Nilsson (andrnils@gmail.com)
 Jaume Nin (jnin@cttc.es)
 Michael Nowatkowski (nowatkom@gmail.com)
@@ -127,6 +130,7 @@
 Colin Perkins (csp@csperkins.org) 
 Giuseppe Piro (g.piro@poliba.it)
 Yana Podkosova (yanapdk@rambler.ru)
+Ovidiu Poncea (ovidiu.poncea@cs.pub.ro)
 Vikas Pushkar (vikaskupushkar@gmail.com)
 Andrea Ranieri (andreran@uno.it)
 Bruno Ranieri (Yrrsinn@googlemail.com)
@@ -143,6 +147,7 @@
 Lynne Salameh (l.salameh@cs.ucl.ac.uk)
 Providence Salumu Munga (Providence.Salumu@gmail.com, Providence.Salumu_Munga@it-sudparis.eu)
 Francisco Javier Sánchez-Roselly (fnavarro@ujaen.es)
+Siddharth Santurkar (siddharth.santurkar@ieee.org)
 Florian Schmidt (Florian.Schmidt@cs.rwth-aachen.de)
 Guillaume Seguin (guillaume.seguin@inria.fr)
 Ioannis Selinis (selinis.g@gmail.com)
@@ -159,6 +164,7 @@
 YunQiang Su (wzssyqa@gmail.com)
 Brian Swenson (bswenson3@gatech.edu)
 Lalith Suresh  (suresh.lalith@gmail.com)
+Mohit P. Tahiliani (tahiliani.nitk@gmail.com)
 Dave Taht (dave.taht@bufferbloat.net)
 Marcos Talau (talau@users.sourceforge.net)
 Adrian S. W. Tam (adrian.sw.tam@gmail.com)
diff -Naur ns-3.23/bindings/python/wscript ns-3.24/bindings/python/wscript
--- ns-3.23/bindings/python/wscript	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/bindings/python/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -1,4 +1,5 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+from __future__ import print_function
 import types
 import re
 import os
@@ -12,12 +13,25 @@
 # feature  = TaskGen.feature
 # after = TaskGen.after
 
-## https://launchpad.net/pybindgen/
-REQUIRED_PYBINDGEN_VERSION = (0, 17, 0, 886)
+# https://github.com/gjcarneiro/pybindgen
+REQUIRED_PYBINDGEN_VERSION = '0.17.0.post41+ngd10fa60'
 REQUIRED_PYGCCXML_VERSION = (0, 9, 5)
 
 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')
@@ -88,19 +102,19 @@
 
     try:
         conf.load('python')
-    except Errors.ConfigurationError, ex:
+    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, ex:
+    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, ex:
+    except Errors.ConfigurationError as ex:
         conf.report_optional_feature("python", "Python Bindings", False,
                                      "Python library or headers missing")
         return
@@ -165,15 +179,13 @@
     else:
         out = subprocess.Popen([conf.env['PYTHON'][0], "-c",
                                 "import pybindgen.version; "
-                                "print('.'.join([str(x) for x in pybindgen.version.__version__]))"],
+                                "print(pybindgen.__version__)"],
                                 stdout=subprocess.PIPE).communicate()[0]
-        pybindgen_version_str = out.strip()
-        pybindgen_version = tuple([int(x) for x in pybindgen_version_str.split('.')])
-        conf.msg('Checking for pybindgen version', pybindgen_version_str)
+        pybindgen_version = maybe_decode(out.strip())
+        conf.msg('Checking for pybindgen version', pybindgen_version)
         if not (pybindgen_version == REQUIRED_PYBINDGEN_VERSION):
-            Logs.warn("pybindgen (found %s), (need %s)" %
-                    (pybindgen_version_str,
-                     '.'.join([str(x) for x in REQUIRED_PYBINDGEN_VERSION])))
+            Logs.warn("pybindgen (found %r), (need %r)" %
+                      (pybindgen_version, REQUIRED_PYBINDGEN_VERSION))
             conf.report_optional_feature("python", "Python Bindings", False,
                                          "PyBindGen version not correct and newer version could not be retrieved")
             return
@@ -192,13 +204,11 @@
 ''' % dict(type1=t1, type2=t2)
 
         try:
-            ret = conf.run_c_code(code=test_program,
-                                  env=conf.env.derive(), compile_filename='test.cc',
-                                  features='cxx cprogram', execute=False)
+            ret = conf.check(compiler='cxx', fragment=test_program, features='cxx')
         except Errors.ConfigurationError:
-            ret = 1
+            ret = False
         conf.msg('Checking for types %s and %s equivalence' % (t1, t2), (ret and 'no' or 'yes'))
-        return not ret
+        return ret
 
     uint64_is_long = test("uint64_t", "unsigned long")
     uint64_is_long_long = test("uint64_t", "unsigned long long")
@@ -280,13 +290,17 @@
                                      "gccxml missing")
         return
 
-    gccxml_version_line = os.popen(gccxml + " --version").readline().strip()
+    gccxml_version_line = os.popen(gccxml[0] + " --version").readline().strip()
     m = re.match( "^GCC-XML version (\d\.\d(\.\d)?)$", gccxml_version_line)
-    gccxml_version = m.group(1)
-    gccxml_version_ok = ([int(s) for s in gccxml_version.split('.')] >= [0, 9])
+    try:
+        gccxml_version = m.group(1)
+        gccxml_version_ok = ([int(s) for s in gccxml_version.split('.')] >= [0, 9])
+    except AttributeError:
+        gccxml_version = gccxml_version_line
+        gccxml_version_ok = False
     conf.msg('Checking for gccxml version', gccxml_version)
     if not gccxml_version_ok:
-        Logs.warn("gccxml too old, need version >= 0.9; automatic scanning of API definitions will not be possible")
+        Logs.warn("gccxml version unknown or too old, need version >= 0.9; automatic scanning of API definitions will not be possible")
         conf.report_optional_feature("pygccxml", "Python API Scanning Support", False,
                                      "gccxml too old")
         return
@@ -414,13 +428,13 @@
 
     def run(self):
         assert len(self.outputs) == 1
-        outfile = file(self.outputs[0].abspath(), "w")
-        print >> outfile, "import warnings"
-        print >> outfile, 'warnings.warn("the ns3 module is a compatibility layer '\
-            'and should not be used in newly written code", DeprecationWarning, stacklevel=2)'
-        print >> outfile
+        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 >> outfile, "from ns.%s import *" % (module.replace('-', '_'))
+            print("from ns.%s import *" % (module.replace('-', '_')), file=outfile)
         outfile.close()
         return 0
 
@@ -466,7 +480,7 @@
                     scan_modules.append(mod.name.split('ns3-')[1])
         else:
             scan_modules = Options.options.apiscan.split(',')
-        print "Modules to scan: ", scan_modules
+        print("Modules to scan: ", scan_modules)
         for target, cflags in scan_targets:
             group = bld.get_group(bld.current_group)
             for module in scan_modules:
@@ -488,4 +502,3 @@
 
     # note: the actual build commands for the python bindings are in
     # src/wscript, not here.
-
diff -Naur ns-3.23/CHANGES.html ns-3.24/CHANGES.html
--- ns-3.23/CHANGES.html	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/CHANGES.html	2015-09-15 11:18:44.000000000 -0700
@@ -51,6 +51,47 @@
 us a note on ns-developers mailing list.</p>
 
 <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 capabilites 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>
diff -Naur ns-3.23/doc/doxygen.conf ns-3.24/doc/doxygen.conf
--- ns-3.23/doc/doxygen.conf	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/doxygen.conf	2015-09-15 11:52:03.000000000 -0700
@@ -40,7 +40,7 @@
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = "3.23"
+PROJECT_NUMBER         = "3.24"
 
 # 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
@@ -245,6 +245,16 @@
 ## Link to RFC's
 ALIASES               += RFC{1}="<a href=\"http://datatracker.ietf.org/doc/rfc\1/\">RFC \1</a>"
 
+## Highlight template parameter induction
+##   Inferred template parameters are clear from the context:
+##     template <typename T> void Func (T x);
+##   Explicit template parameters must be given at the call site:
+##     template <typename T> void Func (void);
+##   which is called as 
+##     Func<MyClass> ();
+ALIASES               += deduced="<span class=\"params\"><span class=\"paramdir\">[deduced] </span></span>"
+ALIASES               += explicit="<span class=\"params\"><span class=\"paramdir\">[explicit]</span></span>"
+
 # This tag can be used to specify a number of word-keyword mappings (TCL only).
 # A mapping has the form "name=value". For example adding "class=itcl::class"
 # will allow you to use the command class in the itcl::class meaning.
@@ -546,7 +556,7 @@
 # files with double quotes in the documentation rather than with sharp brackets.
 # The default value is: NO.
 
-FORCE_LOCAL_INCLUDES   = NO
+FORCE_LOCAL_INCLUDES   = YES
 
 # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
 # documentation for inline members.
@@ -857,6 +867,7 @@
                          src/click/examples \
                          src/config-store/examples \
                          src/core/examples \
+			 src/core/doc \
                          src/csma/examples \
                          src/csma-layout/examples \
                          src/dsdv/examples \
@@ -2066,7 +2077,10 @@
                          NS3_LOG_ENABLE \
                          NS_LOG_COMPONENT_DEFINE()=1 \
                          NS_LOG_COMPONENT_DEFINE_MASK()=1 \
-                         NS_OBJECT_ENSURE_REGISTERED()=1
+                         NS_OBJECT_ENSURE_REGISTERED()=1 \
+                         NS3_BUILD_PROFILE_DEBUG \
+                         NS3_BUILD_PROFILE_RELEASE \
+                         NS3_BUILD_PROFILE_OPTIMIZED
 
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
 # tag can be used to specify a list of macro names that should be expanded. The
diff -Naur ns-3.23/doc/doxygen.warnings.report.sh ns-3.24/doc/doxygen.warnings.report.sh
--- ns-3.23/doc/doxygen.warnings.report.sh	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/doxygen.warnings.report.sh	2015-09-15 11:18:44.000000000 -0700
@@ -25,21 +25,22 @@
 {
     cat <<-EOF
 	
-	Usage: $me [-eithv] [-f <log-file> | -l | -s] [-m <module> | -F <regex>]
+	Usage: $me [-eithv] [-s <log-file> | -l | -w] [-m <module>] [-f <regex>] [-F <regex>]
 	
 	Run doxygen to generate all errors; report error counts
 	by module and file.
 	
 	-i  Skip build and print-introspected-doxygen.
 	
-	-f  Skip doxygen run; use existing <log-file>.
-	-s  Skip doxygen run; use existing warnings log doc/$WARNINGSLOGFILE
+	-s  Skip doxygen run; use existing <log-file>.
+	-w  Skip doxygen run; use existing warnings log doc/$WARNINGSLOGFILE
 	-l  Skip doxygen run; use the normal doxygen log doc/$STANDARDLOGFILE
 		
 	-e  Filter out warnings from */examples/*
 	-t  Filter out warnings from */test/*
 	-m  Only include files matching src/<module>
-	-F  Only include files matching the <regex> 
+	-f  Only include files matching the <regex>
+	-F  Exclude files matching the <regex>
 
 	-v  Show the doxygen run output
 	-h  Print this usage message
@@ -120,41 +121,44 @@
 filter_examples=0
 filter_test=0
 filter_module=""
-filter_regex=""
+filter_in=""
+filter_out=""
 
 echo
 echo "$me:"
 
-while getopts :eitm:F:lF:svh option ; do
+while getopts :ef:F:hilm:s:tvw option ; do
 
     case $option in
 	
 	(e)  filter_examples=1        ;;
 
-	(i)  skip_intro=1              ;;
-	
-	(t)  filter_test=1            ;;
+	(f)  filter_in="$OPTARG"      ;;
 
-	(m)  filter_module="$OPTARG"  ;;
+	(F)  filter_out="$OPTARG"     ;;
 
-	(F)  filter_regex="$OPTARG"   ;;
+	(h)  usage                    ;;
+	
+	(i)  skip_intro=1             ;;
+	
+	(l)  use_standard=1           ;;
 
-	(l)  use_standard=1            ;;
+	(m)  filter_module="$OPTARG"  ;;
 
-	(f)  use_filearg=1
+	(s)  use_filearg=1
 	     logfile_arg="$OPTARG"
 	     ;;
 
-	(s)  use_filearg=1
-	     logfile_arg="$DIR/$WARNINGSLOGFILE"
-	     ;;
+	(t)  filter_test=1            ;;
 
 	(v)  verbosity=1
 	     exec 6>&1
 	     ;;
 
-	(h)  usage ;;
-	
+	(w)  use_filearg=1
+	     logfile_arg="$DIR/$WARNINGSLOGFILE"
+	     ;;
+	     
 	(:)  echo "$me: Missing argument to -$OPTARG" ; usage ;;
 	
 	(\?) echo "$me: Invalid option: -$OPTARG"     ; usage ;;
@@ -220,16 +224,16 @@
 # Log filters --------------------------
 #
 
-# Filter regular expression for -m and -F
+# Filter in regular expression for -m and -f
 filter_inRE=""
 if [ "$filter_module" != "" ] ; then
     filter_inRE="${filter_inRE:-}${filter_inRE:+\\|}src/$filter_module"
 fi
-if [ "$filter_regex" != "" ] ; then
-    filter_inRE="${filter_inRE:-}${filter_inRE:+\\|}$filter_regex"
+if [ "$filter_in" != "" ] ; then
+    filter_inRE="${filter_inRE:-}${filter_inRE:+\\|}$filter_in"
 fi
 
-# Filter regular expression for -e and -t
+# Filter out regular expression for -e, -t and -F
 filter_outRE=""
 if [ $filter_examples -eq 1 ]; then
     filter_outRE="${filter_outRE:-}${filter_outRE:+\\|}/examples/"
@@ -237,7 +241,11 @@
 if [ $filter_test -eq 1 ]; then
     filter_outRE="${filter_outRE:-}${filter_outRE:+\\|}/test/"
 fi
+if [ "$filter_out" != "" ] ; then
+    filter_outRE="${filter_outRE:-}${filter_outRE:+\\|}$filter_out"
+fi
 
+#  Show the resulting filters
 if [ "${filter_inRE:-}" != "" ] ; then
     echo "Filtering in \"$filter_inRE\""
 fi
diff -Naur ns-3.23/doc/manual/source/conf.py ns-3.24/doc/manual/source/conf.py
--- ns-3.23/doc/manual/source/conf.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/manual/source/conf.py	2015-09-15 11:48:09.000000000 -0700
@@ -48,9 +48,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.23'
+version = 'ns-3.24'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.23'
+release = 'ns-3.24'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur ns-3.23/doc/manual/source/documentation.rst ns-3.24/doc/manual/source/documentation.rst
--- ns-3.23/doc/manual/source/documentation.rst	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/manual/source/documentation.rst	2015-09-15 11:18:44.000000000 -0700
@@ -38,7 +38,8 @@
 We use Sphinx_ to generate expository chapters describing
 the design and usage of each module.  Right now you are reading the
 :doc:`Documentation <documentation>` Chapter.
-The `Show Source <_sources/documentation.txt>`_ link in the sidebar
+If you are reading the html version, the
+`Show Source <_sources/documentation.txt>`_ link in the sidebar
 will show you the reStructuredText source for this chapter.
 
 Adding New Chapters
@@ -59,7 +60,7 @@
 will create this file for you.
 
 Some models require several ``.rst`` files, and figures; these should
-all go in the ``src/foo/doc/`` directory.  The docs are actually build
+all go in the ``src/foo/doc/`` directory.  The docs are actually built
 by a Sphinx Makefile.  For especially involved
 documentation, it may be helpful to have a local ``Makefile``
 in the ``src/foo/doc/`` directory to
@@ -137,7 +138,7 @@
 
 .. sourcecode:: bash
 
-   $ make -C doc/models
+   $ make -C doc/models html
 
 To see the generated documentation point your browser at
 ``doc/models/build/html``.
@@ -260,7 +261,7 @@
 
   * Summary table of all class members.
   * Graphs of inheritance and collaboration for all classes.
-  * Links to the source code imlementing each function.
+  * Links to the source code implementing each function.
   * Links to every place a member is used.
   * Links to every object used in implementing a function.
   * Grouping of related classes, such as all the classes related to
@@ -273,6 +274,7 @@
   * Documentation for any ``Attributes``, including ``Attributes``
     defined in parent classes.
   * Documentation for any ``Trace`` sources defined by the class.
+  * The memory footprint for each class.
 
 Doxygen operates by scaning the source code, looking for
 specially marked comments.  It also creates a cross reference,
@@ -300,8 +302,11 @@
    *  \note Note any limitations or gotchas.
    *
    *  (For functions with arguments or return valued:)
-   *  \param foo Brief noun phrase describing this argument.
-   *  \param bar Note Sentence case, and terminating period.
+   *  \param [in] foo Brief noun phrase describing this argument. Note
+   *                  that we indicate if the argument is input,
+   *                  output, or both.
+   *  \param [in,out] bar Note Sentence case, and terminating period.
+   *  \param [in] baz Indicate boolean values with \c true or \c false.
    *  \return Brief noun phrase describing the value.
    *
    *  \internal
@@ -310,7 +315,7 @@
    *  Understanding this material shouldn't be necessary to using
    *  the class or method.
    */
-   class Example
+   void ExampleFunction (const int foo, double & bar, const bool baz);
 
 In this style the Doxygen comment block begins with two \`*' characters:
 ``/**``, and precedes the item being documented.
@@ -368,91 +373,100 @@
 
    $ ./waf doxygen
 
-This builds using the default configuration, which generates documentation
-sections for *all* items, even if they do not have explicit comment
-documentation blocks.  This has the effect of suppressing warnings for
-undocumented items, but makes sure everything appears in the generated
-output.
+This builds using the default configuration, which generates
+documentation sections for *all* items, even if they do not have
+explicit comment documentation blocks.  This has the effect of
+suppressing warnings for undocumented items, but makes sure everything
+appears in the generated output, which is usually what you want for
+general use.  Note that we generate documentation even for modules
+which are disabled, to make it easier to see all the features
+available in |ns3|.
 
 When writing documentation, it's often more useful to see which items
-are generating warnings, typically about missing documentation.
-To see the full warnings list, use the ``doc/doxygen.warnings.report.sh``
+are generating warnings, typically about missing documentation.  To
+see the full warnings list, use the ``doc/doxygen.warnings.report.sh``
 script:
 
 .. sourcecode:: bash
 
-   $ doc/doxygen.warnings.report.sh
-   Waf: Entering directory `build'
-   ...
-   Waf: Leaving directory `build'
-   'build' finished successfully (3m24.094s)
-
-   Rebuilding doxygen docs with full errors...Done.
-
-
-   Report of Doxygen warnings
-   ----------------------------------------
-
-   (All counts are lower bounds.)
-
-   Warnings by module/directory:
-
-   Count Directory
-   ----- ----------------------------------
-   3844 src/lte/model
-   1718 src/wimax/model
-   1423 src/core/model
-   ....
-    138 additional undocumented parameters.
-   ----------------------------------------
-    15765 total warnings
-      126 directories with warnings
-
-
-   Warnings by file (alphabetical)
-
-   Count File
-   ----- ----------------------------------
-     17 doc/introspected-doxygen.h
-     15 examples/routing/manet-routing-compare.cc
-     26 examples/stats/wifi-example-apps.h
-   ....
-   ----------------------------------------
-      967 files with warnings
-
-
-   Warnings by file (numerical)
-
-   Count File
-   ----- ----------------------------------
-    374 src/lte/model/lte-asn1-header.h
-    280 src/lte/model/lte-rrc-sap.h
-    262 src/lte/model/lte-rrc-header.h
-   ....
-   ----------------------------------------
-      967 files with warnings
-
-
-   Doxygen Warnings Summary
-   ----------------------------------------
-      126 directories
-      967 files
-    15765 warnings
-
-The script modifies the configuration to show all warnings, and
-to shorten the run time.  As you can see, at this writing we have
-*a lot* of undocumented items.  The report summarizes warnings
-by module ``src/*/*``, and by file, in alphabetically and numerical
-order.
+    $ doc/doxygen.warnings.report.sh
+    
+    doxygen.warnings.report.sh:
+    Building and running print-introspected-doxygen...done.
+    Rebuilding doxygen (v1.8.10) docs with full errors...done.
+
+
+    Report of Doxygen warnings
+    ----------------------------------------
+
+    (All counts are lower bounds.)
+
+    Warnings by module/directory:
+
+    Count Directory
+    ----- ----------------------------------
+    3414 src/lte/model
+    1532 src/wimax/model
+     825 src/lte/test
+    ....
+       1 src/applications/test
+     97 additional undocumented parameters.
+    ----------------------------------------
+     12460 total warnings
+       100 directories with warnings
+
+
+    Warnings by file (alphabetical)
+
+    Count File
+    ----- ----------------------------------
+      15 examples/routing/manet-routing-compare.cc
+      26 examples/stats/wifi-example-apps.h
+      12 examples/tutorial/fifth.cc
+    ....
+      17 utils/python-unit-tests.py
+    ----------------------------------------
+       771 files with warnings
+
+
+    Warnings by file (numerical)
+
+    Count File
+    ----- ----------------------------------
+     273 src/lte/model/lte-rrc-sap.h
+     272 src/core/model/simulator.h
+     221 src/netanim/model/animation-interface.h
+    ....
+       1 src/wimax/model/ul-job.cc
+    ----------------------------------------
+       771 files with warnings
+
+
+    Doxygen Warnings Summary
+    ----------------------------------------
+       100 directories
+       771 files
+     12460 warnings
+
+(This snippet has *a lot* of lines suppressed!)
+
+The script modifies the configuration to show all warnings, and to
+shorten the run time.  (It shortens the run time primarily by
+disabling creation of diagrams, such as call trees, and doesn't
+generate documentation for undocumented items, in order to trigger the
+warnings.)  As you can see, at this writing we have *a lot* of
+undocumented items.  The report summarizes warnings by module
+``src/*/*``, and by file, in alphabetically and numerical order.
 
-The script has a few options to pare things down and make this more
+The script has a few options to pare things down and make the output more
 manageable.  For help, use the ``-h`` option.  Having run it once
 to do the Doxygen build and generate the full warnings log,
 you can reprocess the log file with various "filters,"
-without having to do the full Doxygen build by,
-again using the ``-s`` option.  You can exclude warnings
+without having to do the full Doxygen build again by
+using the ``-s`` option.  You can exclude warnings
 from ``*/examples/*`` files (``-e`` option), and/or ``*/test/*`` files
-(``-t``).
+(``-t``).  Just to be clear, all of the filter options do the complete
+fast doxygen build; they just filter doxygen log and warnings output.
 
 Perhaps the most useful option when writing documentation comments
 is ``-m <module>``, which will limit the report to just files matching
@@ -486,6 +500,13 @@
    src/mesh/helper/mesh-helper.h:119: warning: parameters of member ns3::MeshHelper::SetStandard are not (all) documented
 
 
+Finally, note that undocumented items (classes, methods, functions,
+typedefs, *etc.* won't produce documentation when you build with
+``doxygen.warnings.report.sh``, and only the outermost item
+will produce a warning.  As a result, if you don't see documentation
+for a class method in the generated documentation, the class itself
+probably needs documentation.
+
 Now it's just a matter of understanding the code, and writing some
 docs!
 
@@ -508,24 +529,45 @@
 
     /**
      *  \defgroup foo Foo protocol.
+     *  Implemenation of the Foo protocol.
+     */
+
+  The symbol ``foo`` is how other items can add themselves to this group.
+  The string following that will be the title for the group.  Any futher
+  text will be the detailed description for the group page.
+
+* Document each file, assigning it to the relevant group.  In a header file::
+
+    /**
+     *  \file
+     *  \ingroup foo
+     *  Class Foo declaration.
+     */
+
+  or in the corresponding ``.cc`` file::
+  
+    /**
+     *  \file
+     *  \ingroup foo
+     *  Class FooBar implementation.
      */
 
-  Mark each associated class as belonging to the group::
+* Mark each associated class as belonging to the group::
 
     /**
      *  \ingroup foo
      *
-     *  Foo packet type.
+     *  FooBar packet type.
     */
-    class Foo
+    class FooBar
 
 * Did you know ``typedefs`` can have formal arguments?  This enables
   documentation of function pointer signatures::
 
     /**
-     * Bar callback function signature.
+     *  Bar callback function signature.
      *
-     * \param ale The size of a pint of ale, in Imperial ounces.
+     *  \param ale The size of a pint of ale, in Imperial ounces.
      */
     typedef void (* BarCallback)(const int ale);
     
@@ -534,12 +576,38 @@
 
 * ``\bugid{298}`` will create a link to bug 298 in our Bugzilla.
 
-* ``\pname{foo}`` in a description will format ``foo``
-  as a ``\param foo`` parameter, making it clear that you
+* ``\p foo`` in a description will format ``foo``
+  the same as the ``\param foo`` parameter, making it clear that you
   are referring to an actual argument.
 
 * ``\RFC{301}`` will create a link to RFC 301.
 
+* Document the direction of function arguments with ``\param [in]``, *etc*.
+  The allowed values of the direction token are ``[in]``, ``[out]``, and
+  ``[in,out]`` (note the explicit square brackets), as discussed in the
+  Doxygen docs for ``\param``.
+  
+* Document template arguments with ``\tparam``, just as you use ``\param``
+  for function arguments.
+
+* For template arguments, indicate if they will be deduced or must be given
+  explicitly::
+
+    /**
+     * A templated function.
+     * \tparam T \explicit The return type.
+     * \tparam U \deduced The argument type.
+     * \param [in] a The argument.
+     */
+    template <typename T, typename U> T Function (U a);
+
+  * Use ``\tparam U \deduced`` because the type ``U`` can be deduced at
+    the site where the template is invoked.  Basically deduction can only
+    be done for function arguments.
+
+  * Use ``\tparam T \explicit`` because the type ``T`` can't be deduced;
+    it must be given explicitly at the invocation site.
+				   
 * ``\internal`` should be used only to set off a discussion of implementation
   details, not to mark ``private`` functions (they are already marked,
   as ``private``!)
diff -Naur ns-3.23/doc/manual/source/test-framework.rst ns-3.24/doc/manual/source/test-framework.rst
--- ns-3.23/doc/manual/source/test-framework.rst	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/manual/source/test-framework.rst	2015-09-15 11:18:44.000000000 -0700
@@ -10,52 +10,45 @@
 execution manager; ``test.py`` can run test code and examples to
 look for regressions, can output the results into a number of forms, and
 can manage code coverage analysis tools.  On top of this, we layer 
-*Buildbots* that are automated build robots that perform
+*buildslaves* that are automated build robots that perform
 robustness testing by running the test framework on different systems
 and with different configuration options.
 
-BuildBots
-*********
+Buildslaves
+***********
 
-At the highest level of |ns3| testing are the buildbots (build robots).  
+At the highest level of |ns3| testing are the buildslaves (build robots).  
 If you are unfamiliar with
-this system look at `<http://djmitche.github.com/buildbot/docs/0.7.11/>`_.  
+this system look at `<https://ns-buildmaster.ee.washington.edu:8010/>`_.
 This is an open-source automated system that allows |ns3| to be rebuilt
-and tested each time something has changed.  By running the buildbots on a number
+and tested daily.  By running the buildbots on a number
 of different systems we can ensure that |ns3| builds and executes
 properly on all of its supported systems.
 
-Users (and developers) typically will not interact with the buildbot system other 
+Users (and developers) typically will not interact with the buildslave system other 
 than to read its messages regarding test results.  If a failure is detected in 
 one of the automated build and test jobs, the buildbot will send an email to the
-*ns-developers* mailing list.  This email will look something like
+*ns-commits* mailing list.  This email will look something like
 
 .. sourcecode:  text
 
-  The Buildbot has detected a new failure of osx-ppc-g++-4.2 on NsNam.
-  Full details are available at:
-   http://ns-regression.ee.washington.edu:8010/builders/osx-ppc-g%2B%2B-4.2/builds/0
-  
-  Buildbot URL: http://ns-regression.ee.washington.edu:8010/
-  
-  Buildslave for this Build: darwin-ppc
-  
-  Build Reason: The web-page 'force build' button was pressed by 'ww': ww
-  
-  Build Source Stamp: HEAD
-  Blamelist: 
-  
-  BUILD FAILED: failed shell_5 shell_6 shell_7 shell_8 shell_9 shell_10 shell_11 shell_12 
-  
-  sincerely,
-  -The Buildbot
+  [Ns-commits] Build failed in Jenkins: daily-ubuntu-without-valgrind » Ubuntu-64-15.04 #926
+
+  ...
+  281 of 285 tests passed (281 passed, 3 skipped, 1 failed, 0 crashed, 0 valgrind errors)
+  List of SKIPped tests:
+    ns3-tcp-cwnd
+    ns3-tcp-interoperability
+    nsc-tcp-loss
+  List of FAILed tests:
+    random-variable-stream-generators
+  + exit 1
+  Build step 'Execute shell' marked build as failure
 
-In the full details URL shown in the email, one can search for the keyword 
-``failed`` and select the ``stdio`` link for the corresponding step to see
-the reason for the failure.
+In the full details URL shown in the email, one can find links to the detailed test output.
 
-The buildbot will do its job quietly if there are no errors, and the system will
-undergo build and test cycles every day to verify that all is well.
+The buildslave system will do its job quietly if there are no errors, and the 
+system will undergo build and test cycles every day to verify that all is well.
 
 Test.py
 *******
@@ -73,7 +66,7 @@
 ::
 
   $ ./waf configure --enable-examples --enable-tests
-  $ ./waf
+  $ ./waf build
 
 By default, ``test.py`` will run all available tests and report status
 back in a very concise form.  Running the command
@@ -90,7 +83,7 @@
   Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build'
   Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build'
   'build' finished successfully (0.939s)
-  FAIL: TestSuite ns3-wifi-propagation-loss-models
+  FAIL: TestSuite propagation-loss-model
   PASS: TestSuite object-name-service
   PASS: TestSuite pcap-file-object
   PASS: TestSuite ns3-tcp-cwnd
@@ -178,25 +171,25 @@
 
 ::
 
-  $ ./test.py --suite=ns3-wifi-propagation-loss-models
+  $ ./test.py --suite=propagation-loss-model
 
 or equivalently
 
 ::
 
-  $ ./test.py -s ns3-wifi-propagation-loss-models
+  $ ./test.py -s propagation-loss-model
 
 results in that single test suite being run.
 
 .. sourcecode:: text
 
-  FAIL: TestSuite ns3-wifi-propagation-loss-models
+  FAIL: TestSuite propagation-loss-model
 
 To find detailed information regarding the failure, one must specify the kind
 of output desired.  For example, most people will probably be interested in
 a text file::
 
-  $ ./test.py --suite=ns3-wifi-propagation-loss-models --text=results.txt
+  $ ./test.py --suite=propagation-loss-model --text=results.txt
 
 This will result in that single test suite being run with the test status written to 
 the file ''results.txt''.
@@ -205,7 +198,7 @@
 
 .. sourcecode:: text
 
-  FAIL: Test Suite ''ns3-wifi-propagation-loss-models'' (real 0.02 user 0.01 system 0.00)
+  FAIL: Test Suite ''propagation-loss-model'' (real 0.02 user 0.01 system 0.00)
   PASS: Test Case "Check ... Friis ... model ..." (real 0.01 user 0.00 system 0.00)
   FAIL: Test Case "Check ... Log Distance ... model" (real 0.01 user 0.01 system 0.00)
     Details:
@@ -282,31 +275,39 @@
   Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build'
   Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build'
   'build' finished successfully (0.939s)
-  histogram
-  ns3-wifi-interference
-  ns3-tcp-cwnd
-  ns3-tcp-interoperability
-  sample
-  devices-mesh-flame
-  devices-mesh-dot11s
-  devices-mesh
+
+  Test Type    Test Name
+  ---------    ---------
+  performance  many-uniform-random-variables-one-get-value-call
+  performance  one-uniform-random-variable-many-get-value-calls
+  performance  type-id-perf
+  system       buildings-pathloss-test
+  system       buildings-shadowing-test
+  system       devices-mesh-dot11s-regression
+  system       devices-mesh-flame-regression
+  system       epc-gtpu
+  ...
+  unit         wimax-phy-layer
+  unit         wimax-service-flow
+  unit         wimax-ss-mac-layer
+  unit         wimax-tlv
+  example      adhoc-aloha-ideal-phy
+  example      adhoc-aloha-ideal-phy-matrix-propagation-loss-model
+  example      adhoc-aloha-ideal-phy-with-microwave-oven
+  example      aodv
   ...
-  object-name-service
-  callback
-  attributes
-  config
-  global-value
-  command-line
-  basic-random-number
-  object
 
 Any of these listed suites can be selected to be run by itself using the 
-``--suite`` option as shown above.
+``--suite`` option as shown above.  Examples are handled differently.
 
 Similarly to test suites, one can run a single C++ example program
 using the ``--example`` option.  Note that the relative path for the
 example does not need to be included and that the executables built
-for C++ examples do not have extensions.  Entering
+for C++ examples do not have extensions.  Furthermore, the example
+must be registered as an example to the test framework; it is not
+sufficient to create an example and run it through test.py; it must
+be added to the relevant ``examples-to-run.py`` file, explained below.
+Entering
 
 ::
 
@@ -369,12 +370,12 @@
 
 .. sourcecode:: text
 
-  ns3-wifi-propagation-loss-models
+  propagation-loss-model
   ns3-tcp-cwnd
   ns3-tcp-interoperability
-  pcap-file-object
+  pcap-file
   object-name-service
-  random-number-generators
+  random-variable-stream-generators
 
 Note the absence of the ``Waf`` build messages.
 
@@ -553,19 +554,35 @@
 
 .. sourcecode:: text
 
-  Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build'
-  Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build'
-  'build' finished successfully (0.353s)
-  --assert:               Tell tests to segfault (like assert) if an error is detected
-  --basedir=dir:          Set the base directory (where to find src) to ''dir''
-  --tempdir=dir:          Set the temporary directory (where to find data files) to ''dir''
-  --constrain=test-type:  Constrain checks to test suites of type ''test-type''
-  --help:                 Print this message
-  --kinds:                List all of the available kinds of tests
-  --list:                 List all of the test suites (optionally constrained by test-type)
-  --out=file-name:        Set the test status output file to ''file-name''
-  --suite=suite-name:     Run the test suite named ''suite-name''
-  --verbose:              Turn on messages in the run test suites
+  Usage: /home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build/utils/ns3-dev-test-runner-debug [OPTIONS]
+
+  Options: 
+  --help                 : print these options
+  --print-test-name-list : print the list of names of tests available
+  --list                 : an alias for --print-test-name-list
+  --print-test-types     : print the type of tests along with their names
+  --print-test-type-list : print the list of types of tests available
+  --print-temp-dir       : print name of temporary directory before running 
+                           the tests
+  --test-type=TYPE       : process only tests of type TYPE
+  --test-name=NAME       : process only test whose name matches NAME
+  --suite=NAME           : an alias (here for compatibility reasons only) 
+                           for --test-name=NAME
+  --assert-on-failure    : when a test fails, crash immediately (useful
+                           when running under a debugger
+  --stop-on-failure      : when a test fails, stop immediately
+  --fullness=FULLNESS    : choose the duration of tests to run: QUICK, 
+                           EXTENSIVE, or TAKES_FOREVER, where EXTENSIVE 
+                           includes QUICK and TAKES_FOREVER includes 
+                           QUICK and EXTENSIVE (only QUICK tests are 
+                           run by default)
+  --verbose              : print details of test execution
+  --xml                  : format test run output as xml
+  --tempdir=DIR          : set temp dir for tests to store output files
+  --datadir=DIR          : set data dir for tests to read reference files
+  --out=FILE             : send test result to FILE instead of standard output
+  --append=FILE          : append test result to FILE instead of standard output
+
 
 There are a number of things available to you which will be familiar to you if
 you have looked at ``test.py``.  This should be expected since the test-
@@ -575,7 +592,7 @@
 as if they were to present a unified testing environment, but they are really
 completely different and not to be found here.
 
-The first new option that appears here, but not in test.py is the ``--assert``
+The first new option that appears here, but not in test.py is the ``--assert-on-failure``
 option.  This option is useful when debugging a test case when running under a 
 debugger like ``gdb``.  When selected, this option tells the underlying
 test case to cause a segmentation violation if an error is detected.  This has
@@ -586,36 +603,23 @@
 ::
 
   $ ./waf shell
-  $ cd build/debug/utils
-  $ gdb test-runner
-  $ run --suite=global-value --assert
+  $ cd build/utils
+  $ gdb ns3-dev-test-runner-debug
+  $ run --suite=global-value --assert-on-failure 
 
 If an error is then found in the global-value test suite, a segfault would be 
 generated and the (source level) debugger would stop at the ``NS_TEST_ASSERT_MSG``
 that detected the error.
 
-Another new option that appears here is the ``--basedir`` option.  It turns out
-that some tests may need to reference the source directory of the |ns3|  
-distribution to find local data, so a base directory is always required to run
-a test.
-
-If you run a test from test.py, the Python program will provide the basedir 
-option for you.  To run one of the tests directly from the test-runner 
-using ``waf``, you will need to specify the test suite to run along with 
-the base directory.  So you could use the shell and do::
-
-  $ ./waf --run "test-runner --basedir=`pwd` --suite=pcap-file-object"
-
-Note the ''backward'' quotation marks on the ``pwd`` command.  
-
-If you are running the test suite out of a debugger, it can be quite painful 
-to remember and constantly type the absolute path of the distribution base 
-directory.
-Because of this, if you omit the basedir, the test-runner will try to figure one
-out for you.  It begins in the current working directory and walks up the 
-directory tree looking for a directory file with files named ``VERSION`` and
-``LICENSE.``  If it finds one, it assumes that must be the basedir and provides
-it for you.
+To run one of the tests directly from the test-runner 
+using ``waf``, 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| logging is available when you run it this way, such as:
+
+  $ NS_LOG="Packet" ./waf --run "test-runner --suite=pcap-file"
 
 Test output
 +++++++++++
@@ -624,7 +628,7 @@
 in the process of running the tests.  The tests then need a temporary directory
 to write to.  The Python test utility (test.py) will provide a temporary file
 automatically, but if run stand-alone this temporary directory must be provided.
-Just as in the basedir case, it can be annoying to continually have to provide
+It can be annoying to continually have to provide
 a ``--tempdir``, so the test runner will figure one out for you if you don't
 provide one.  It first looks for environment variables named ``TMP`` and 
 ``TEMP`` and uses those.  If neither ``TMP`` nor ``TEMP`` are defined
@@ -656,63 +660,15 @@
 Reporting of test failures
 ++++++++++++++++++++++++++
 
-When you run a test suite using the test-runner it will run the test quietly
-by default.  The only indication that you will get that the test passed is 
-the *absence* of a message from ``waf`` saying that the program 
-returned something other than a zero exit code.  To get some output from the
-test, you need to specify an output file to which the tests will write their 
-XML status using the ``--out`` option.  You need to be careful interpreting
-the results because the test suites will *append* results onto this file.
+When you run a test suite using the test-runner it will run the test 
+and report PASS or FAIL.
+To run more quietly, you need to specify an output file to which the tests will write their status using the ``--out`` option.  
 Try,
 
 ::
 
-  $ ./waf --run "test-runner --basedir=`pwd` --suite=pcap-file-object --out=myfile.xml"
+  $ ./waf --run "test-runner --suite=pcap-file --out=myfile.txt"
 
-If you look at the file ``myfile.xml`` you should see something like,
-
-.. sourcecode:: xml
-
-  <TestSuite>
-    <SuiteName>pcap-file-object</SuiteName>
-    <TestCase>
-      <CaseName>Check to see that PcapFile::Open with mode ''w'' works</CaseName>
-      <CaseResult>PASS</CaseResult>
-      <CaseTime>real 0.00 user 0.00 system 0.00</CaseTime>
-    </TestCase>
-    <TestCase>
-      <CaseName>Check to see that PcapFile::Open with mode ''r'' works</CaseName>
-      <CaseResult>PASS</CaseResult>
-      <CaseTime>real 0.00 user 0.00 system 0.00</CaseTime>
-    </TestCase>
-    <TestCase>
-      <CaseName>Check to see that PcapFile::Open with mode ''a'' works</CaseName>
-      <CaseResult>PASS</CaseResult>
-      <CaseTime>real 0.00 user 0.00 system 0.00</CaseTime>
-    </TestCase>
-    <TestCase>
-      <CaseName>Check to see that PcapFileHeader is managed correctly</CaseName>
-      <CaseResult>PASS</CaseResult>
-      <CaseTime>real 0.00 user 0.00 system 0.00</CaseTime>
-    </TestCase>
-    <TestCase>
-      <CaseName>Check to see that PcapRecordHeader is managed correctly</CaseName>
-      <CaseResult>PASS</CaseResult>
-      <CaseTime>real 0.00 user 0.00 system 0.00</CaseTime>
-    </TestCase>
-    <TestCase>
-      <CaseName>Check to see that PcapFile can read out a known good pcap file</CaseName>
-      <CaseResult>PASS</CaseResult>
-      <CaseTime>real 0.00 user 0.00 system 0.00</CaseTime>
-    </TestCase>
-    <SuiteResult>PASS</SuiteResult>
-    <SuiteTime>real 0.00 user 0.00 system 0.00</SuiteTime>
-  </TestSuite>
-
-If you are familiar with XML this should be fairly self-explanatory.  It is 
-also not a complete XML file since test suites are designed to have their
-output appended to a master XML status file as described in the ``test.py``
-section.
 
 Debugging test suite failures
 +++++++++++++++++++++++++++++
@@ -738,8 +694,8 @@
   There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
   and "show warranty" for details.
   This GDB was configured as "x86_64-linux-gnu"...
-  (gdb) r --basedir=`pwd`
-  Starting program: <..>/build/debug/utils/test-runner --basedir=`pwd`
+  (gdb) r --suite=
+  Starting program: <..>/build/utils/ns3-dev-test-runner-debug --suite=ns3-wifi-interference
   [Thread debugging using libthread_db enabled]
   assert failed. file=../src/core/model/type-id.cc, line=138, cond="uid <= m_information.size () && uid != 0"
   ...
@@ -749,7 +705,7 @@
 
   VALGR: TestSuite devices-mesh-dot11s-regression
 
-  $ ./waf --command-template="valgrind %s --basedir=`pwd` --suite=devices-mesh-dot11s-regression" --run test-runner
+  $ ./waf --command-template="valgrind %s --suite=devices-mesh-dot11s-regression" --run test-runner
 
 Class TestRunner
 ****************
@@ -800,11 +756,18 @@
     AddTestCase (new MyTestCase, TestCase::QUICK);
   }
   
-  MyTestSuite myTestSuite;
+  static MyTestSuite myTestSuite;
 
 The base class takes care of all of the registration and reporting required to
 be a good citizen in the test framework.
 
+Avoid putting initialization logic into the test suite or test case 
+constructors.  This is
+because an instance of the test suite is created at run time 
+(due to the static variable above) regardless of whether the test is being 
+run or not.  Instead, the TestCase provides a virtual ``DoSetup`` method
+that can be specialized to perform setup before ``DoRun`` is called.
+
 Test Case
 *********
 
@@ -814,13 +777,15 @@
 
 In order to create a new test case in the system, all one has to do is to inherit
 from the  ``TestCase`` base class, override the constructor to give the test 
-case a name and override the ``DoRun`` method to run the test.
+case a name and override the ``DoRun`` method to run the test.  Optionally,
+override also the ``DoSetup`` method.
 
 .. sourcecode:: cpp
 
   class MyTestCase : public TestCase
   {
     MyTestCase ();
+    virtual void DoSetup (void);
     virtual void DoRun (void);
   };
   
diff -Naur ns-3.23/doc/manual/source/test-overview.rst ns-3.24/doc/manual/source/test-overview.rst
--- ns-3.23/doc/manual/source/test-overview.rst	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/manual/source/test-overview.rst	2015-09-15 11:18:44.000000000 -0700
@@ -3,16 +3,11 @@
 Overview
 --------
 
-This document is concerned with the testing and validation of |ns3| software.
+This chapter is concerned with the testing and validation of |ns3| software.
 
-This document provides
+This chapter provides
 
-* background about terminology and software testing (Chapter 2);
-* a description of the ns-3 testing framework (Chapter 3);
-* a guide to model developers or new model contributors for how to write tests (Chapter 4);
+* background about terminology and software testing 
+* a description of the ns-3 testing framework 
+* a guide to model developers or new model contributors for how to write tests 
 
-In brief, the first three chapters should be read by ns developers and 
-contributors who need to understand how to contribute test code and
-validated programs, and
-the remainder of the document provides space for people to report on what
-aspects of selected models have been validated.
diff -Naur ns-3.23/doc/models/Makefile ns-3.24/doc/models/Makefile
--- ns-3.23/doc/models/Makefile	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/models/Makefile	2015-09-15 11:18:44.000000000 -0700
@@ -38,7 +38,7 @@
 	$(SRC)/energy/doc/energy.rst \
 	$(SRC)/fd-net-device/doc/fd-net-device.rst \
 	$(SRC)/tap-bridge/doc/tap.rst \
-	$(SRC)/mesh/doc/mesh.rst \
+	$(SRC)/mesh/doc/source/mesh.rst \
 	$(SRC)/lte/doc/source/lte.rst \
 	$(SRC)/lte/doc/source/lte-user.rst \
 	$(SRC)/lte/doc/source/lte-design.rst \
@@ -62,7 +62,11 @@
 	$(SRC)/olsr/doc/olsr.rst \
 	$(SRC)/openflow/doc/openflow-switch.rst \
 	$(SRC)/point-to-point/doc/point-to-point.rst \
-	$(SRC)/wifi/doc/wifi.rst \
+	$(SRC)/wifi/doc/source/wifi.rst \
+	$(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-references.rst \
 	$(SRC)/wimax/doc/wimax.rst \
 	$(SRC)/uan/doc/uan.rst \
 	$(SRC)/topology-read/doc/topology.rst \
@@ -99,8 +103,8 @@
 	$(SRC)/internet/doc/internet-node-recv.dia \
 	$(SRC)/internet/doc/routing.dia \
 	$(SRC)/internet/doc/routing-specialization.dia \
-	$(SRC)/wifi/doc/WifiArchitecture.dia \
-	$(SRC)/wifi/doc/snir.dia \
+	$(SRC)/wifi/doc/source/figures/WifiArchitecture.dia \
+	$(SRC)/wifi/doc/source/figures/snir.dia \
 	$(SRC)/wimax/doc/WimaxArchitecture.dia \
 	$(SRC)/lte/doc/source/figures/epc-ctrl-arch.dia \
 	$(SRC)/lte/doc/source/figures/epc-data-flow-dl.dia \
diff -Naur ns-3.23/doc/models/source/conf.py ns-3.24/doc/models/source/conf.py
--- ns-3.23/doc/models/source/conf.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/models/source/conf.py	2015-09-15 11:48:36.000000000 -0700
@@ -48,9 +48,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.23'
+version = 'ns-3.24'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.23'
+release = 'ns-3.24'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur ns-3.23/doc/ns3_html_theme/get_version.sh ns-3.24/doc/ns3_html_theme/get_version.sh
--- ns-3.23/doc/ns3_html_theme/get_version.sh	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/ns3_html_theme/get_version.sh	2015-09-15 11:18:44.000000000 -0700
@@ -152,7 +152,7 @@
 else
     version=`hg log -r tip --template '{node|short}'`
     # Check for uncommitted changes
-    hg summary | grep -q 'commit: (clean)'
+    hg summary | grep 'commit:' | grep -q '(clean)'
     if [ ! $? ] ; then
 	say "beyond latest tag, last commit: $version, dirty"
 	dirty="(+)"
diff -Naur ns-3.23/doc/tutorial/source/conf.py ns-3.24/doc/tutorial/source/conf.py
--- ns-3.23/doc/tutorial/source/conf.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/tutorial/source/conf.py	2015-09-15 11:49:13.000000000 -0700
@@ -48,9 +48,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.23'
+version = 'ns-3.24'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.23'
+release = 'ns-3.24'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur ns-3.23/doc/tutorial/source/getting-started.rst ns-3.24/doc/tutorial/source/getting-started.rst
--- ns-3.23/doc/tutorial/source/getting-started.rst	2015-05-13 11:11:44.000000000 -0700
+++ ns-3.24/doc/tutorial/source/getting-started.rst	2015-09-15 12:13:04.000000000 -0700
@@ -96,17 +96,20 @@
   $ cd
   $ mkdir workspace
   $ cd workspace
-  $ wget http://www.nsnam.org/release/ns-allinone-3.23.tar.bz2
-  $ tar xjf ns-allinone-3.23.tar.bz2
+  $ wget http://www.nsnam.org/release/ns-allinone-3.24.tar.bz2
+  $ tar xjf ns-allinone-3.24.tar.bz2
 
-If you change into the directory ``ns-allinone-3.23`` you should see a
-number of files::
+If you change into the directory ``ns-allinone-3.24`` you should see a
+number of files and directories:
+
+::
 
   $ ls
-  bake      constants.py   ns-3.23               README
-  build.py  netanim-3.106  pybindgen-0.17.0.886  util.py
+  bake      constants.py   ns-3.24                            README
+  build.py  netanim-3.106  pybindgen-0.17.0.post41+ngd10fa60  util.py
 
-You are now ready to build the base |ns3| distribution.
+You are now ready to build the base |ns3| distribution and may skip ahead
+to the section on building |ns3|.
 
 Downloading |ns3| Using Bake
 ++++++++++++++++++++++++++++
@@ -163,10 +166,10 @@
 
 There are a few configuration targets available:
 
-1.  ``ns-3.23``:  the module corresponding to the release; it will download
+1.  ``ns-3.24``:  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.23``:  the module that includes other optional features
+3.  ``ns-allinone-3.24``:  the module that includes other optional features
     such as click routing, openflow for |ns3|, and the Network Simulation
     Cradle
 4.  ``ns-3-allinone``:  similar to the released version of the allinone
@@ -184,7 +187,7 @@
 `"ns-3 Releases"
 <http://www.nsnam.org/releases>`_
 web page and clicking on the latest release link.  We'll proceed in
-this tutorial example with ``ns-3.23``.
+this tutorial example with ``ns-3.24``.
 
 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.
@@ -210,7 +213,7 @@
 
 Step into the workspace directory and type the following into your shell::
 
-  $ ./bake.py configure -e ns-3.23
+  $ ./bake.py configure -e ns-3.24
 
 Next, we'l ask bake to check whether we have enough tools to download
 various components.  Type::
@@ -253,20 +256,23 @@
 
 should yield something like::
 
-   >> Searching for system dependency pygoocanvas - OK
+   >> Downloading gccxml-ns3 (target directory:gccxml) - OK
    >> Searching for system dependency python-dev - OK
    >> Searching for system dependency pygraphviz - OK
-   >> Downloading pybindgen-0.17.0.886 - OK
+   >> Searching for system dependency pygoocanvas - OK
+   >> Searching for system dependency setuptools - OK
    >> Searching for system dependency g++ - OK
    >> Searching for system dependency qt4 - OK
+   >> Downloading pygccxml - OK
    >> Downloading netanim-3.106 - OK
-   >> Downloading ns-3.23 - OK    
+   >> Downloading pybindgen-0.17.0.post41+ngd10fa60 (target directory:pybindgen) - OK
+   >> Downloading ns-3.24 - OK
 
-The above suggests that three sources have been downloaded.  Check the
+The above suggests that five sources have been downloaded.  Check the
 ``source`` directory now and type ``ls``; one should see::
 
   $ ls
-  netanim-3.106  ns-3.23  pybindgen-0.17.0.886
+  gccxml  netanim-3.106  ns-3.24  pybindgen  pygccxml  pygccxml-1.0.0.zip
 
 You are now ready to build the |ns3| distribution.
 
@@ -285,7 +291,7 @@
 
 If you downloaded
 using a tarball you should have a directory called something like 
-``ns-allinone-3.23`` under your ``~/workspace`` directory.  
+``ns-allinone-3.24`` under your ``~/workspace`` directory.  
 Type the following::
 
   $ ./build.py --enable-examples --enable-tests
@@ -301,7 +307,7 @@
 script builds the various pieces you downloaded.  Eventually you should see the
 following::
 
-   Waf: Leaving directory `/path/to/workspace/ns-allinone-3.23/ns-3.23/build'
+   Waf: Leaving directory `/path/to/workspace/ns-allinone-3.24/ns-3.24/build'
    'build' finished successfully (6m25.032s)
   
    Modules built:
@@ -323,7 +329,7 @@
    brite                     click                     openflow                 
    visualizer               
 
-   Leaving directory `./ns-3.23'
+   Leaving directory `./ns-3.24'
 
 Regarding the portion about modules not built::
 
@@ -349,11 +355,13 @@
 
 and you should see something like::
 
-  >> Building pybindgen-0.17.0.886 - OK
+  >> Building gccxml-ns3 - OK
+  >> Building pygccxml - OK
   >> Building netanim-3.106 - OK
-  >> Building ns-3.23 - OK
+  >> Building pybindgen-0.17.0.post41+ngd10fa60 - OK
+  >> Building ns-3.24 - OK
 
-*Hint:  you can also perform both steps, download and build by calling 'bake.py deploy'.*
+*Hint:  you can also perform both steps, download and build, by calling 'bake.py deploy'.*
 
 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::
@@ -554,6 +562,38 @@
 There is also an intermediate build profile, ``release``.  ``-d`` is a
 synonym for ``--build-profile``.
 
+The build profile controls the use of logging, assertions, and compiler optimization:
+
++--------------------+---------------------------------+-----------------------------------------------------------------+
+| Feature            | Build Profile                                                                                     |
++                    +---------------------------------+-------------------------------+---------------------------------+
+|                    | ``debug``                       | ``release``                   | ``optimized``                   |
++====================+=================================+===============================+=================================+
+| Enabled Features   | |  ``NS3_BUILD_PROFILE_DEBUG``  | ``NS3_BUILD_PROFILE_RELEASE`` | ``NS3_BUILD_PROFILE_OPTIMIZED`` |
+|                    | |  ``NS_LOG...``                |                               |                                 |
+|                    | |  ``NS_ASSERT...``             |                               |                                 |
++--------------------+---------------------------------+-------------------------------+---------------------------------+
+| Code Wrapper Macro | ``NS_BUILD_DEBUG(code)``        |  ``NS_BUILD_RELEASE(code)``   | ``NS_BUILD_OPTIMIZED(code)``    |
++--------------------+---------------------------------+-------------------------------+---------------------------------+
+| Compiler Flags     | ``-O0 -ggdb -g3``               | ``-O3 -g0``                   | ``-O3 -g``                      |
+|                    |                                 | ``-fomit-frame-pointer``      | ``-fstrict-overflow``           |
+|                    |                                 |                               | ``-march=native``               |
++--------------------+---------------------------------+-------------------------------+---------------------------------+
+
+As you can see, logging and assertions are only available in debug builds.
+Recommended practice is to develop your scenario in debug mode, then
+conduct repetitive runs (for statistics or changing parameters) in
+optimized build profile.
+
+If you have code that should only run in specific build profiles,
+use the indicated Code Wrapper macro:
+
+.. sourcecode:: cpp
+
+  NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ());
+  DoLongInvolvedComputation ();
+  NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)
+
 By default Waf puts the build artifacts in the ``build`` directory.  
 You can specify a different output directory with the ``--out``
 option, e.g.
@@ -590,8 +630,8 @@
   $ ./waf configure $NS3CONFIG $NS3OPT
   $ ./waf build
 
-Compilers
-=========
+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
@@ -614,6 +654,9 @@
 <http://code.google.com/p/distcc/>`_
 under Documentation section.
 
+To add compiler flags, use the ``CXXFLAGS_EXTRA`` environment variable when
+you configure |ns3|.
+
 Install
 =======
 
diff -Naur ns-3.23/doc/tutorial/source/tracing.rst ns-3.24/doc/tutorial/source/tracing.rst
--- ns-3.23/doc/tutorial/source/tracing.rst	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/tutorial/source/tracing.rst	2015-09-15 11:18:44.000000000 -0700
@@ -255,7 +255,7 @@
 <http://www.parashift.com/c++-faq/pointers-to-members.html>`_ before
 writing code like this!)  What you get from this is a variable named
 simply ``pfi`` that is initialized to the value 0.  If you want to
-initialize this pointer to something meaningful, you have to have a
+initialize this pointer to something meaningful, you need to have a
 function with a matching signature.  In this case, you could provide a
 function that looks like::
 
@@ -370,7 +370,7 @@
         .AddTraceSource ("MyInteger",
                          "An integer value to trace.",
                          MakeTraceSourceAccessor (&MyObject::m_myInt),
-                         "ns3::Traced::Value::Int32Callback")
+                         "ns3::TracedValueCallback::Int32")
         ;
       return tid;
     }
@@ -399,11 +399,11 @@
 drives the callback process.  Any time the underlying value is changed
 the TracedValue mechanism will provide both the old and the new value
 of that variable, in this case an ``int32_t`` value.  The trace
-sink function for this TracedValue will need the signature
+sink function ``traceSink`` for this TracedValue will need the signature
 
 ::
 
-  void (* TracedValueCallback)(const int32_t oldValue, const int32_t newValue);
+  void (* traceSink)(int32_t oldValue, int32_t newValue);
 
 All trace sinks hooking this trace source must have this signature.
 We'll discuss below how you can determine the required callback
@@ -866,7 +866,7 @@
 The callback signature is given as a link to the relevant ``typedef``,
 where we find
 
-  ``typedef void (* CourseChangeCallback)(const std::string context, Ptr<const MobilityModel> * model);``
+  ``typedef void (* CourseChangeCallback)(std::string context, Ptr<const MobilityModel> * model);``
 					  
   **TracedCallback** signature for course change notifications.
 
@@ -932,7 +932,7 @@
 arguments::
 
   void
-  CourseChange (const std::string context, Ptr<const MobilityModel> model)
+  CourseChange (std::string context, Ptr<const MobilityModel> model)
   {
     ...
   }
@@ -942,7 +942,7 @@
 come up with::
 
   static void
-  CourseChange (const std::string path, Ptr<const MobilityModel> model)
+  CourseChange (std::string path, Ptr<const MobilityModel> model)
   {
     ...
   }
@@ -1204,11 +1204,12 @@
 ``TracedValue`` it will provide both the old and the new value of that
 variable, in this case an ``int32_t`` value.  By inspection of the
 ``TracedValue`` declaration, we know the trace sink function will have
-arguments ``(const int32_t oldValue, const int32_t newValue)``.  The
+arguments ``(int32_t oldValue, int32_t newValue)``.  The
 return type for a ``TracedValue`` callback function is always
-``void``, so the expected callback signature will be::
+``void``, so the expected callback signature for the sink function
+``traceSink`` will be::
 
-  void (* TracedValueCallback)(const int32_t oldValue, const int32_t newValue);
+  void (* traceSink)(int32_t oldValue, int32_t newValue);
 
 The ``.AddTraceSource`` in the ``GetTypeId`` method provides the
 "hooks" used for connecting the trace source to the outside world
@@ -1217,7 +1218,7 @@
 system, a help string, and the address of the TracedValue class data
 member.
 
-The final string argument, "ns3::Traced::Value::Int32" in the example,
+The final string argument, "ns3::TracedValueCallback::Int32" in the example,
 is the name of a ``typedef`` for the callback function signature.  We
 require these signatures to be defined, and give the fully qualified
 type name to ``AddTraceSource``, so the API documentation can link a
@@ -1271,12 +1272,12 @@
 
   * **CongestionWindow**: The TCP connnection's congestion window
 
-    Callback signature:  **ns3::Traced::Value::Uint322Callback**
+    Callback signature:  **ns3::TracedValueCallback::Uint32**
 
 Clicking on the callback ``typedef`` link we see the signature
 you now know to expect::
 
-    typedef void(* ns3::Traced::Value::Int32Callback)(const int32_t oldValue, const int32_t newValue)
+    typedef void(* ns3::TracedValueCallback::Int32)(int32_t oldValue, int32_t newValue)
 
 You should now understand this code completely.  If we have a pointer
 to the ``TcpNewReno``, we can ``TraceConnect`` to the
diff -Naur ns-3.23/doc/tutorial-pt-br/source/conf.py ns-3.24/doc/tutorial-pt-br/source/conf.py
--- ns-3.23/doc/tutorial-pt-br/source/conf.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/doc/tutorial-pt-br/source/conf.py	2015-09-15 11:49:30.000000000 -0700
@@ -50,9 +50,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.23'
+version = 'ns-3.24'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.23'
+release = 'ns-3.24'
 
 # The language for content autogenerated by . Refer to babel documentation
 # for a list of supported languages.
diff -Naur ns-3.23/examples/realtime/wscript ns-3.24/examples/realtime/wscript
--- ns-3.23/examples/realtime/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/realtime/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -1,7 +1,8 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 def build(bld):
-    obj = bld.create_ns3_program('realtime-udp-echo', ['csma', 'internet', 'applications'])
-    obj.source = 'realtime-udp-echo.cc'
+    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'])
+        bld.register_ns3_script('realtime-udp-echo.py', ['csma', 'internet', 'applications'])
diff -Naur ns-3.23/examples/tutorial/fourth.cc ns-3.24/examples/tutorial/fourth.cc
--- ns-3.23/examples/tutorial/fourth.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/tutorial/fourth.cc	2015-09-15 11:18:44.000000000 -0700
@@ -26,15 +26,20 @@
 class MyObject : public Object
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void)
   {
     static TypeId tid = TypeId ("MyObject")
-      .SetParent (Object::GetTypeId ())
+      .SetParent<Object> ()
+      .SetGroupName ("Tutorial")
       .AddConstructor<MyObject> ()
       .AddTraceSource ("MyInteger",
                        "An integer value to trace.",
                        MakeTraceSourceAccessor (&MyObject::m_myInt),
-                       "ns3::TracedValue::Int32Callback")
+                       "ns3::TracedValueCallback::Int32")
     ;
     return tid;
   }
diff -Naur ns-3.23/examples/tutorial/second.py ns-3.24/examples/tutorial/second.py
--- ns-3.23/examples/tutorial/second.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/examples/tutorial/second.py	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,102 @@
+# -*-  Mode: Python; -*-
+# /*
+#  * 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
+#  *
+#  * Ported to Python by Mohit P. Tahiliani
+#  */
+
+import ns.core
+import ns.network
+import ns.csma
+import ns.internet
+import ns.point_to_point
+import ns.applications
+import sys
+
+# // Default Network Topology
+# //
+# //       10.1.1.0
+# // n0 -------------- n1   n2   n3   n4
+# //    point-to-point  |    |    |    |
+# //                    ================
+# //                      LAN 10.1.2.0
+
+cmd = ns.core.CommandLine()
+cmd.nCsma = 3
+cmd.verbose = "True"
+cmd.AddValue("nCsma", "Number of \"extra\" CSMA nodes/devices")
+cmd.AddValue("verbose", "Tell echo applications to log if true")
+cmd.Parse(sys.argv)
+
+nCsma = int(cmd.nCsma)
+verbose = cmd.verbose
+
+if verbose == "True":
+	ns.core.LogComponentEnable("UdpEchoClientApplication", ns.core.LOG_LEVEL_INFO)
+	ns.core.LogComponentEnable("UdpEchoServerApplication", ns.core.LOG_LEVEL_INFO)
+nCsma = 1 if int(nCsma) == 0 else int(nCsma)
+
+p2pNodes = ns.network.NodeContainer()
+p2pNodes.Create(2)
+
+csmaNodes = ns.network.NodeContainer()
+csmaNodes.Add(p2pNodes.Get(1))
+csmaNodes.Create(nCsma)
+
+pointToPoint = ns.point_to_point.PointToPointHelper()
+pointToPoint.SetDeviceAttribute("DataRate", ns.core.StringValue("5Mbps"))
+pointToPoint.SetChannelAttribute("Delay", ns.core.StringValue("2ms"))
+
+p2pDevices = pointToPoint.Install(p2pNodes)
+
+csma = ns.csma.CsmaHelper()
+csma.SetChannelAttribute("DataRate", ns.core.StringValue("100Mbps"))
+csma.SetChannelAttribute("Delay", ns.core.TimeValue(ns.core.NanoSeconds(6560)))
+
+csmaDevices = csma.Install(csmaNodes)
+
+stack = ns.internet.InternetStackHelper()
+stack.Install(p2pNodes.Get(0))
+stack.Install(csmaNodes)
+
+address = ns.internet.Ipv4AddressHelper()
+address.SetBase(ns.network.Ipv4Address("10.1.1.0"), ns.network.Ipv4Mask("255.255.255.0"))
+p2pInterfaces = address.Assign(p2pDevices)
+
+address.SetBase(ns.network.Ipv4Address("10.1.2.0"), ns.network.Ipv4Mask("255.255.255.0"))
+csmaInterfaces = address.Assign(csmaDevices)
+
+echoServer = ns.applications.UdpEchoServerHelper(9)
+
+serverApps = echoServer.Install(csmaNodes.Get(nCsma))
+serverApps.Start(ns.core.Seconds(1.0))
+serverApps.Stop(ns.core.Seconds(10.0))
+
+echoClient = ns.applications.UdpEchoClientHelper(csmaInterfaces.GetAddress(nCsma), 9)
+echoClient.SetAttribute("MaxPackets", ns.core.UintegerValue(1))
+echoClient.SetAttribute("Interval", ns.core.TimeValue(ns.core.Seconds (1.0)))
+echoClient.SetAttribute("PacketSize", ns.core.UintegerValue(1024))
+
+clientApps = echoClient.Install(p2pNodes.Get(0))
+clientApps.Start(ns.core.Seconds(2.0))
+clientApps.Stop(ns.core.Seconds(10.0))
+
+ns.internet.Ipv4GlobalRoutingHelper.PopulateRoutingTables()
+
+pointToPoint.EnablePcapAll("second")
+csma.EnablePcap ("second", csmaDevices.Get (1), True)
+
+ns.core.Simulator.Run()
+ns.core.Simulator.Destroy()
+
diff -Naur ns-3.23/examples/tutorial/seventh.cc ns-3.24/examples/tutorial/seventh.cc
--- ns-3.23/examples/tutorial/seventh.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/tutorial/seventh.cc	2015-09-15 11:18:44.000000000 -0700
@@ -66,6 +66,11 @@
   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:
@@ -102,6 +107,17 @@
   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)
 {
diff -Naur ns-3.23/examples/tutorial/sixth.cc ns-3.24/examples/tutorial/sixth.cc
--- ns-3.23/examples/tutorial/sixth.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/tutorial/sixth.cc	2015-09-15 11:18:44.000000000 -0700
@@ -65,6 +65,11 @@
   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:
@@ -101,6 +106,17 @@
   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)
 {
diff -Naur ns-3.23/examples/tutorial/third.cc ns-3.24/examples/tutorial/third.cc
--- ns-3.23/examples/tutorial/third.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/tutorial/third.cc	2015-09-15 11:18:44.000000000 -0700
@@ -25,6 +25,10 @@
 
 // Default Network Topology
 //
+// Number of wifi or csma nodes can be increased up to 250
+//                          |
+//                 Rank 0   |   Rank 1
+// -------------------------|----------------------------
 //   Wifi 10.1.3.0
 //                 AP
 //  *    *    *    *
@@ -44,19 +48,23 @@
   bool verbose = true;
   uint32_t nCsma = 3;
   uint32_t nWifi = 3;
+  bool tracing = false;
 
   CommandLine cmd;
   cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
   cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi);
   cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);
+  cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
 
   cmd.Parse (argc,argv);
 
-  if (nWifi > 18)
+  // Check for valid number of csma or wifi nodes
+  // 250 should be enough, otherwise IP addresses 
+  // soon become an issue
+  if (nWifi > 250 || nCsma > 250)
     {
-      std::cout << "Number of wifi nodes " << nWifi << 
-                   " specified exceeds the mobility bounding box" << std::endl;
-      exit (1);
+      std::cout << "Too many wifi or csma nodes, no more than 250 each." << std::endl;
+      return 1;
     }
 
   if (verbose)
@@ -169,9 +177,12 @@
 
   Simulator::Stop (Seconds (10.0));
 
-  pointToPoint.EnablePcapAll ("third");
-  phy.EnablePcap ("third", apDevices.Get (0));
-  csma.EnablePcap ("third", csmaDevices.Get (0), true);
+  if (tracing == true)
+    {
+      pointToPoint.EnablePcapAll ("third");
+      phy.EnablePcap ("third", apDevices.Get (0));
+      csma.EnablePcap ("third", csmaDevices.Get (0), true);
+    }
 
   Simulator::Run ();
   Simulator::Destroy ();
diff -Naur ns-3.23/examples/tutorial/third.py ns-3.24/examples/tutorial/third.py
--- ns-3.23/examples/tutorial/third.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/examples/tutorial/third.py	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,153 @@
+# -*-  Mode: Python; -*-
+# /*
+#  * 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
+#  *
+#  * Ported to Python by Mohit P. Tahiliani
+#  */
+
+import ns.core
+import ns.network
+import ns.point_to_point
+import ns.applications
+import ns.wifi
+import ns.mobility
+import ns.csma
+import ns.internet
+import sys
+
+# // Default Network Topology
+# //
+# //   Wifi 10.1.3.0
+# //                 AP
+# //  *    *    *    *
+# //  |    |    |    |    10.1.1.0
+# // n5   n6   n7   n0 -------------- n1   n2   n3   n4
+# //                   point-to-point  |    |    |    |
+# //                                   ================
+# //                                     LAN 10.1.2.0
+
+cmd = ns.core.CommandLine()
+cmd.nCsma = 3
+cmd.verbose = "True"
+cmd.nWifi = 3
+cmd.AddValue("nCsma", "Number of \"extra\" CSMA nodes/devices")
+cmd.AddValue("nWifi", "Number of wifi STA devices")
+cmd.AddValue("verbose", "Tell echo applications to log if true")
+
+cmd.Parse(sys.argv)
+
+nCsma = int(cmd.nCsma)
+verbose = cmd.verbose
+nWifi = int(cmd.nWifi)
+
+if nWifi > 18:
+	print "Number of wifi nodes "+ str(nWifi)+ " specified exceeds the mobility bounding box"
+	sys.exit(1)
+
+if verbose == "True":
+	ns.core.LogComponentEnable("UdpEchoClientApplication", ns.core.LOG_LEVEL_INFO)
+	ns.core.LogComponentEnable("UdpEchoServerApplication", ns.core.LOG_LEVEL_INFO)
+	
+p2pNodes = ns.network.NodeContainer()
+p2pNodes.Create(2)
+
+pointToPoint = ns.point_to_point.PointToPointHelper()
+pointToPoint.SetDeviceAttribute("DataRate", ns.core.StringValue("5Mbps"))
+pointToPoint.SetChannelAttribute("Delay", ns.core.StringValue("2ms"))
+
+p2pDevices = pointToPoint.Install(p2pNodes)
+
+csmaNodes = ns.network.NodeContainer()
+csmaNodes.Add(p2pNodes.Get(1))
+csmaNodes.Create(nCsma)
+
+csma = ns.csma.CsmaHelper()
+csma.SetChannelAttribute("DataRate", ns.core.StringValue("100Mbps"))
+csma.SetChannelAttribute("Delay", ns.core.TimeValue(ns.core.NanoSeconds(6560)))
+
+csmaDevices = csma.Install(csmaNodes)
+
+wifiStaNodes = ns.network.NodeContainer()
+wifiStaNodes.Create(nWifi)
+wifiApNode = p2pNodes.Get(0)
+
+channel = ns.wifi.YansWifiChannelHelper.Default()
+phy = ns.wifi.YansWifiPhyHelper.Default()
+phy.SetChannel(channel.Create())
+
+wifi = ns.wifi.WifiHelper.Default()
+wifi.SetRemoteStationManager("ns3::AarfWifiManager")
+
+mac = ns.wifi.NqosWifiMacHelper.Default()
+ssid = ns.wifi.Ssid ("ns-3-ssid")
+
+mac.SetType ("ns3::StaWifiMac", "Ssid", ns.wifi.SsidValue(ssid), "ActiveProbing", ns.core.BooleanValue(False))
+staDevices = wifi.Install(phy, mac, wifiStaNodes)
+
+mac.SetType("ns3::ApWifiMac","Ssid", ns.wifi.SsidValue (ssid))
+apDevices = wifi.Install(phy, mac, wifiApNode)
+
+mobility = ns.mobility.MobilityHelper()
+mobility.SetPositionAllocator ("ns3::GridPositionAllocator", "MinX", ns.core.DoubleValue(0.0), 
+								"MinY", ns.core.DoubleValue (0.0), "DeltaX", ns.core.DoubleValue(5.0), "DeltaY", ns.core.DoubleValue(10.0), 
+                                 "GridWidth", ns.core.UintegerValue(3), "LayoutType", ns.core.StringValue("RowFirst"))
+                                 
+mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel", "Bounds", ns.mobility.RectangleValue(ns.mobility.Rectangle (-50, 50, -50, 50)))
+mobility.Install(wifiStaNodes)
+
+mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel")
+mobility.Install(wifiApNode)
+
+stack = ns.internet.InternetStackHelper()
+stack.Install(csmaNodes)
+stack.Install(wifiApNode)
+stack.Install(wifiStaNodes)
+
+address = ns.internet.Ipv4AddressHelper()
+address.SetBase(ns.network.Ipv4Address("10.1.1.0"), ns.network.Ipv4Mask("255.255.255.0"))
+p2pInterfaces = address.Assign(p2pDevices)
+
+address.SetBase(ns.network.Ipv4Address("10.1.2.0"), ns.network.Ipv4Mask("255.255.255.0"))
+csmaInterfaces = address.Assign(csmaDevices)
+
+address.SetBase(ns.network.Ipv4Address("10.1.3.0"), ns.network.Ipv4Mask("255.255.255.0"))
+address.Assign(staDevices)
+address.Assign(apDevices)
+
+echoServer = ns.applications.UdpEchoServerHelper(9)
+
+serverApps = echoServer.Install(csmaNodes.Get(nCsma))
+serverApps.Start(ns.core.Seconds(1.0))
+serverApps.Stop(ns.core.Seconds(10.0))
+
+echoClient = ns.applications.UdpEchoClientHelper(csmaInterfaces.GetAddress(nCsma), 9)
+echoClient.SetAttribute("MaxPackets", ns.core.UintegerValue(1))
+echoClient.SetAttribute("Interval", ns.core.TimeValue(ns.core.Seconds (1.0)))
+echoClient.SetAttribute("PacketSize", ns.core.UintegerValue(1024))
+
+clientApps = echoClient.Install(wifiStaNodes.Get (nWifi - 1))
+clientApps.Start(ns.core.Seconds(2.0))
+clientApps.Stop(ns.core.Seconds(10.0))
+
+ns.internet.Ipv4GlobalRoutingHelper.PopulateRoutingTables()
+
+ns.core.Simulator.Stop(ns.core.Seconds(10.0))
+
+pointToPoint.EnablePcapAll ("third")
+phy.EnablePcap ("third", apDevices.Get (0))
+csma.EnablePcap ("third", csmaDevices.Get (0), True)
+
+ns.core.Simulator.Run()
+ns.core.Simulator.Destroy()
+
diff -Naur ns-3.23/examples/tutorial/wscript ns-3.24/examples/tutorial/wscript
--- ns-3.23/examples/tutorial/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/tutorial/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -12,9 +12,13 @@
     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'
 
diff -Naur ns-3.23/examples/wireless/examples-to-run.py ns-3.24/examples/wireless/examples-to-run.py
--- ns-3.23/examples/wireless/examples-to-run.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/examples-to-run.py	2015-09-15 11:18:44.000000000 -0700
@@ -27,6 +27,9 @@
     ("wifi-wired-bridging", "True", "True"),
     ("power-adaptation-distance --manager=ns3::ParfWifiManager --outputFileName=parf --steps=5 --stepsSize=10", "True", "True"),
     ("power-adaptation-distance --manager=ns3::AparfWifiManager --outputFileName=aparf --steps=5 --stepsSize=10", "True", "True"),
+    ("ofdm-ht-validation", "True", "True"),
+    ("ofdm-validation", "True", "True"),
+    ("ofdm-vht-validation", "True", "True"),
 ]
 
 # A list of Python examples to run in order to ensure that they remain
diff -Naur ns-3.23/examples/wireless/ht-wifi-network.cc ns-3.24/examples/wireless/ht-wifi-network.cc
--- ns-3.23/examples/wireless/ht-wifi-network.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/ht-wifi-network.cc	2015-09-15 11:18:44.000000000 -0700
@@ -3,7 +3,7 @@
  * Copyright (c) 2009 MIRKO BANCHI
  *
  * 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 
+ * 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,
@@ -18,6 +18,7 @@
  * Authors: Mirko Banchi <mk.banchi@gmail.com>
  *          Sebastien Deronne <sebastien.deronne@gmail.com>
  */
+
 #include "ns3/core-module.h"
 #include "ns3/network-module.h"
 #include "ns3/applications-module.h"
@@ -26,16 +27,19 @@
 #include "ns3/ipv4-global-routing-helper.h"
 #include "ns3/internet-module.h"
 
-//This is a simple example of an IEEE 802.11n Wi-Fi network.
+// This is a simple example in order to show how to configure an IEEE 802.11n Wi-Fi network.
 //
-//Network topology:
+// It ouputs the UDP or TCP goodput for every VHT bitrate value, which depends on the MCS value (0 to 7), the
+// channel width (20 or 40 MHz) and the guard interval (long or short). The PHY bitrate is constant over all
+// the simulation run. The user can also specify the distance between the access point and the station: the
+// larger the distance the smaller the goodput.
 //
-//  Wifi 192.168.1.0
+// The simulation assumes a single station in an infrastructure network:
 //
-//         AP
-//    *    *
-//    |    |
-//    n1   n2
+//  STA     AP
+//    *     *
+//    |     |
+//   n1     n2
 //
 //Packets in this simulation aren't marked with a QosTag so they are considered
 //belonging to BestEffort Access Class (AC_BE).
@@ -48,330 +52,179 @@
 {
   bool udp = true;
   double simulationTime = 10; //seconds
+  double distance = 1.0; //meters
+  double frequency = 5.0; //whether 2.4 or 5.0 GHz
+  
   CommandLine cmd;
+  cmd.AddValue ("frequency", "Whether working in the 2.4 or 5.0 GHz band (other values gets rejected)", frequency);
+  cmd.AddValue ("distance", "Distance in meters between the station and the access point", distance);
   cmd.AddValue ("simulationTime", "Simulation time in seconds", simulationTime);
   cmd.AddValue ("udp", "UDP if set to 1, TCP otherwise", udp);
   cmd.Parse (argc,argv);
 
-  std::cout << "DataRate" << "\t" << "Throughput" << '\n';
-  for (int i = 0; i <= 31; i++)
+  std::cout << "MCS value" << "\t\t" << "Channel width" << "\t\t" << "short GI" << "\t\t" << "Throughput" << '\n';
+  for (int i = 0; i <= 7; i++) //MCS
     {
-      uint32_t payloadSize; //1500 byte IP packet
-      if (udp)
-        {
-          payloadSize = 1472; //bytes
-        }
-      else
-        {
-          payloadSize = 1448; //bytes
-          Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (payloadSize));
-        }
-
-      NodeContainer wifiStaNode;
-      wifiStaNode.Create (1);
-      NodeContainer wifiApNode;
-      wifiApNode.Create (1);
-
-      YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
-      YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
-      phy.SetChannel (channel.Create ());
-
-      if (i <= 7)
-        {
-          phy.Set ("ShortGuardEnabled", BooleanValue (false));
-          phy.Set ("ChannelBonding", BooleanValue (false));
-        }
-      else if (i > 7 && i <= 15)
-        {
-          phy.Set ("ShortGuardEnabled", BooleanValue (true));
-          phy.Set ("ChannelBonding", BooleanValue (false));
-        }
-      else if (i > 15 && i <= 23)
-        {
-          phy.Set ("ShortGuardEnabled", BooleanValue (false));
-          phy.Set ("ChannelBonding", BooleanValue (true));
-        }
-      else
-        {
-          phy.Set ("ShortGuardEnabled", BooleanValue (true));
-          phy.Set ("ChannelBonding", BooleanValue (true));
-        }
-
-      WifiHelper wifi = WifiHelper::Default ();
-      wifi.SetStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
-      HtWifiMacHelper mac = HtWifiMacHelper::Default ();
-
-      Ssid ssid = Ssid ("ns380211n");
-
-      double datarate = 0;
-      StringValue DataRate;
-      if (i == 0)
-        {
-          DataRate = StringValue ("OfdmRate6_5MbpsBW20MHz");
-          datarate = 6.5;
-        }
-      else if (i == 1)
-        {
-          DataRate = StringValue ("OfdmRate13MbpsBW20MHz");
-          datarate = 13;
-        }
-      else if (i == 2)
-        {
-          DataRate = StringValue ("OfdmRate19_5MbpsBW20MHz");
-          datarate = 19.5;
-        }
-      else if (i == 3)
-        {
-          DataRate = StringValue ("OfdmRate26MbpsBW20MHz");
-          datarate = 26;
-        }
-      else if (i == 4)
-        {
-          DataRate = StringValue ("OfdmRate39MbpsBW20MHz");
-          datarate = 39;
-        }
-      else if (i == 5)
-        {
-          DataRate = StringValue ("OfdmRate52MbpsBW20MHz");
-          datarate = 52;
-        }
-      else if (i == 6)
-        {
-          DataRate = StringValue ("OfdmRate58_5MbpsBW20MHz");
-          datarate = 58.5;
-        }
-      else if (i == 7)
-        {
-          DataRate = StringValue ("OfdmRate65MbpsBW20MHz");
-          datarate = 65;
-        }
-      else if (i == 8)
-        {
-          DataRate = StringValue ("OfdmRate7_2MbpsBW20MHz");
-          datarate = 7.2;
-        }
-      else if (i == 9)
-        {
-          DataRate = StringValue ("OfdmRate14_4MbpsBW20MHz");
-          datarate = 14.4;
-        }
-      else if (i == 10)
-        {
-          DataRate = StringValue ("OfdmRate21_7MbpsBW20MHz");
-          datarate = 21.7;
-        }
-      else if (i == 11)
-        {
-          DataRate = StringValue ("OfdmRate28_9MbpsBW20MHz");
-          datarate = 28.9;
-        }
-      else if (i == 12)
-        {
-          DataRate = StringValue ("OfdmRate43_3MbpsBW20MHz");
-          datarate = 43.3;
-        }
-      else if (i == 13)
-        {
-          DataRate = StringValue ("OfdmRate57_8MbpsBW20MHz");
-          datarate = 57.8;
-        }
-      else if (i == 14)
-        {
-          DataRate = StringValue ("OfdmRate65MbpsBW20MHzShGi");
-          datarate = 65;
-        }
-      else if (i == 15)
-        {
-          DataRate = StringValue ("OfdmRate72_2MbpsBW20MHz");
-          datarate = 72.2;
-        }
-      else if (i == 16)
-        {
-          DataRate = StringValue ("OfdmRate13_5MbpsBW40MHz");
-          datarate = 13.5;
-        }
-      else if (i == 17)
-        {
-          DataRate = StringValue ("OfdmRate27MbpsBW40MHz");
-          datarate = 27;
-        }
-      else if (i == 18)
-        {
-          DataRate = StringValue ("OfdmRate40_5MbpsBW40MHz");
-          datarate = 40.5;
-        }
-      else if (i == 19)
-        {
-          DataRate = StringValue ("OfdmRate54MbpsBW40MHz");
-          datarate = 54;
-        }
-      else if (i == 20)
-        {
-          DataRate = StringValue ("OfdmRate81MbpsBW40MHz");
-          datarate = 81;
-        }
-      else if (i == 21)
-        {
-          DataRate = StringValue ("OfdmRate108MbpsBW40MHz");
-          datarate = 108;
-        }
-      else if (i == 22)
-        {
-          DataRate = StringValue ("OfdmRate121_5MbpsBW40MHz");
-          datarate = 121.5;
-        }
-      else if (i == 23)
-        {
-          DataRate = StringValue ("OfdmRate135MbpsBW40MHz");
-          datarate = 135;
-        }
-      else if (i == 24)
-        {
-          DataRate = StringValue ("OfdmRate15MbpsBW40MHz");
-          datarate = 15;
-        }
-      else if (i == 25)
-        {
-          DataRate = StringValue ("OfdmRate30MbpsBW40MHz");
-          datarate = 30;
-        }
-      else if (i == 26)
-        {
-          DataRate = StringValue ("OfdmRate45MbpsBW40MHz");
-          datarate = 45;
-        }
-      else if (i == 27)
-        {
-          DataRate = StringValue ("OfdmRate60MbpsBW40MHz");
-          datarate = 60;
-        }
-      else if (i == 28)
-        {
-          DataRate = StringValue ("OfdmRate90MbpsBW40MHz");
-          datarate = 90;
-        }
-      else if (i == 29)
-        {
-          DataRate = StringValue ("OfdmRate120MbpsBW40MHz");
-          datarate = 120;
-        }
-      else if (i == 30)
-        {
-          DataRate = StringValue ("OfdmRate135MbpsBW40MHzShGi");
-          datarate = 135;
-        }
-      else
-        {
-          DataRate = StringValue ("OfdmRate150MbpsBW40MHz");
-          datarate = 150;
-        }
-
-      wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager","DataMode", DataRate,
-                                    "ControlMode", DataRate);
-      mac.SetType ("ns3::StaWifiMac",
-                   "Ssid", SsidValue (ssid),
-                   "ActiveProbing", BooleanValue (false));
-
-      NetDeviceContainer staDevice;
-      staDevice = wifi.Install (phy, mac, wifiStaNode);
-
-      mac.SetType ("ns3::ApWifiMac",
-                   "Ssid", SsidValue (ssid));
-
-      NetDeviceContainer apDevice;
-      apDevice = wifi.Install (phy, mac, wifiApNode);
-
-      // mobility.
-      MobilityHelper mobility;
-      Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
-
-      positionAlloc->Add (Vector (0.0, 0.0, 0.0));
-      positionAlloc->Add (Vector (1.0, 0.0, 0.0));
-      mobility.SetPositionAllocator (positionAlloc);
-
-      mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
-
-      mobility.Install (wifiApNode);
-      mobility.Install (wifiStaNode);
-
-      /* Internet stack*/
-      InternetStackHelper stack;
-      stack.Install (wifiApNode);
-      stack.Install (wifiStaNode);
-
-      Ipv4AddressHelper address;
-
-      address.SetBase ("192.168.1.0", "255.255.255.0");
-      Ipv4InterfaceContainer staNodeInterface;
-      Ipv4InterfaceContainer apNodeInterface;
-
-      staNodeInterface = address.Assign (staDevice);
-      apNodeInterface = address.Assign (apDevice);
-
-      /* Setting applications */
-      ApplicationContainer serverApp, sinkApp;
-      if (udp)
-        {
-          //UDP flow
-          UdpServerHelper myServer (9);
-          serverApp = myServer.Install (wifiStaNode.Get (0));
-          serverApp.Start (Seconds (0.0));
-          serverApp.Stop (Seconds (simulationTime+1));
-
-          UdpClientHelper myClient (staNodeInterface.GetAddress (0), 9);
-          myClient.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
-          myClient.SetAttribute ("Interval", TimeValue (Time ("0.00002"))); //packets/s
-          myClient.SetAttribute ("PacketSize", UintegerValue (payloadSize));
-
-          ApplicationContainer clientApp = myClient.Install (wifiApNode.Get (0));
-          clientApp.Start (Seconds (1.0));
-          clientApp.Stop (Seconds (simulationTime+1));
-        }
-      else
-        {
-          //TCP flow
-          uint16_t port = 50000;
-          Address apLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
-          PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", apLocalAddress);
-          sinkApp = packetSinkHelper.Install (wifiStaNode.Get (0));
-
-          sinkApp.Start (Seconds (0.0));
-          sinkApp.Stop (Seconds (simulationTime+1));
-
-          OnOffHelper onoff ("ns3::TcpSocketFactory",Ipv4Address::GetAny ());
-          onoff.SetAttribute ("OnTime",  StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
-          onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
-          onoff.SetAttribute ("PacketSize", UintegerValue (payloadSize));
-          onoff.SetAttribute ("DataRate", DataRateValue (1000000000)); //bit/s
-          ApplicationContainer apps;
-
-          AddressValue remoteAddress (InetSocketAddress (staNodeInterface.GetAddress (0), port));
-          onoff.SetAttribute ("Remote", remoteAddress);
-          apps.Add (onoff.Install (wifiApNode.Get (0)));
-          apps.Start (Seconds (1.0));
-          apps.Stop (Seconds (simulationTime+1));
-        }
-
-      Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
-
-      Simulator::Stop (Seconds (simulationTime+1));
-      Simulator::Run ();
-      Simulator::Destroy ();
-
-      double throughput = 0;
-      if (udp)
-        {
-          //UDP
-          uint32_t totalPacketsThrough = DynamicCast<UdpServer> (serverApp.Get (0))->GetReceived ();
-          throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0); //Mbit/s
-        }
-      else
+      for (int j = 20; j <= 40; ) //channel width
         {
-          //TCP
-          uint32_t totalPacketsThrough = DynamicCast<PacketSink> (sinkApp.Get (0))->GetTotalRx ();
-          throughput = totalPacketsThrough * 8 / (simulationTime * 1000000.0); //Mbit/s
+          for (int k = 0; k < 2; k++) //GI: 0 and 1
+            {
+              uint32_t payloadSize; //1500 byte IP packet
+              if (udp)
+                {
+                  payloadSize = 1472; //bytes
+                }
+              else
+                {
+                  payloadSize = 1448; //bytes
+                  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (payloadSize));
+                }
+
+              NodeContainer wifiStaNode;
+              wifiStaNode.Create (1);
+              NodeContainer wifiApNode;
+              wifiApNode.Create (1);
+
+              YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
+              YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
+              phy.SetChannel (channel.Create ());
+
+              // Set guard interval
+              phy.Set ("ShortGuardEnabled", BooleanValue (k));
+
+              WifiHelper wifi = WifiHelper::Default ();
+              if (frequency == 5.0)
+                {
+                  wifi.SetStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
+                }
+              else if (frequency == 2.4)
+                {
+                  wifi.SetStandard (WIFI_PHY_STANDARD_80211n_2_4GHZ);
+                  Config::SetDefault ("ns3::LogDistancePropagationLossModel::ReferenceLoss", DoubleValue (40.046));
+                }
+              else
+                {
+                  std::cout<<"Wrong frequency value!"<<std::endl;
+                  return 0;
+                }
+
+              HtWifiMacHelper mac = HtWifiMacHelper::Default ();
+              StringValue DataRate = HtWifiMacHelper::DataRateForMcs (i);
+              wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager","DataMode", DataRate,
+                                            "ControlMode", DataRate);
+                
+              Ssid ssid = Ssid ("ns3-80211n");
+
+              mac.SetType ("ns3::StaWifiMac",
+                           "Ssid", SsidValue (ssid),
+                           "ActiveProbing", BooleanValue (false));
+
+              NetDeviceContainer staDevice;
+              staDevice = wifi.Install (phy, mac, wifiStaNode);
+
+              mac.SetType ("ns3::ApWifiMac",
+                           "Ssid", SsidValue (ssid));
+
+              NetDeviceContainer apDevice;
+              apDevice = wifi.Install (phy, mac, wifiApNode);
+
+              // Set channel width
+              Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (j));
+
+              // mobility.
+              MobilityHelper mobility;
+              Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+
+              positionAlloc->Add (Vector (0.0, 0.0, 0.0));
+              positionAlloc->Add (Vector (distance, 0.0, 0.0));
+              mobility.SetPositionAllocator (positionAlloc);
+
+              mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+
+              mobility.Install (wifiApNode);
+              mobility.Install (wifiStaNode);
+
+              /* Internet stack*/
+              InternetStackHelper stack;
+              stack.Install (wifiApNode);
+              stack.Install (wifiStaNode);
+
+              Ipv4AddressHelper address;
+
+              address.SetBase ("192.168.1.0", "255.255.255.0");
+              Ipv4InterfaceContainer staNodeInterface;
+              Ipv4InterfaceContainer apNodeInterface;
+
+              staNodeInterface = address.Assign (staDevice);
+              apNodeInterface = address.Assign (apDevice);
+
+              /* Setting applications */
+              ApplicationContainer serverApp, sinkApp;
+              if (udp)
+                {
+                  //UDP flow
+                  UdpServerHelper myServer (9);
+                  serverApp = myServer.Install (wifiStaNode.Get (0));
+                  serverApp.Start (Seconds (0.0));
+                  serverApp.Stop (Seconds (simulationTime + 1));
+
+                  UdpClientHelper myClient (staNodeInterface.GetAddress (0), 9);
+                  myClient.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
+                  myClient.SetAttribute ("Interval", TimeValue (Time ("0.00001"))); //packets/s
+                  myClient.SetAttribute ("PacketSize", UintegerValue (payloadSize));
+
+                  ApplicationContainer clientApp = myClient.Install (wifiApNode.Get (0));
+                  clientApp.Start (Seconds (1.0));
+                  clientApp.Stop (Seconds (simulationTime + 1));
+                }
+              else
+                {
+                  //TCP flow
+                  uint16_t port = 50000;
+                  Address apLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
+                  PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", apLocalAddress);
+                  sinkApp = packetSinkHelper.Install (wifiStaNode.Get (0));
+
+                  sinkApp.Start (Seconds (0.0));
+                  sinkApp.Stop (Seconds (simulationTime + 1));
+
+                  OnOffHelper onoff ("ns3::TcpSocketFactory",Ipv4Address::GetAny ());
+                  onoff.SetAttribute ("OnTime",  StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
+                  onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
+                  onoff.SetAttribute ("PacketSize", UintegerValue (payloadSize));
+                  onoff.SetAttribute ("DataRate", DataRateValue (1000000000)); //bit/s
+                  ApplicationContainer apps;
+
+                  AddressValue remoteAddress (InetSocketAddress (staNodeInterface.GetAddress (0), port));
+                  onoff.SetAttribute ("Remote", remoteAddress);
+                  apps.Add (onoff.Install (wifiApNode.Get (0)));
+                  apps.Start (Seconds (1.0));
+                  apps.Stop (Seconds (simulationTime + 1));
+                }
+
+              Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+
+              Simulator::Stop (Seconds (simulationTime + 1));
+              Simulator::Run ();
+              Simulator::Destroy ();
+
+              double throughput = 0;
+              if (udp)
+                {
+                  //UDP
+                  uint32_t totalPacketsThrough = DynamicCast<UdpServer> (serverApp.Get (0))->GetReceived ();
+                  throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0); //Mbit/s
+                }
+              else
+                {
+                  //TCP
+                  uint32_t totalPacketsThrough = DynamicCast<PacketSink> (sinkApp.Get (0))->GetTotalRx ();
+                  throughput = totalPacketsThrough * 8 / (simulationTime * 1000000.0); //Mbit/s
+                }
+              std::cout << i << "\t\t\t" << j << " MHz\t\t\t" << k << "\t\t\t" << throughput << " Mbit/s" << std::endl;
+            }
+          j *= 2;
         }
-      std::cout << datarate << "\t\t" << throughput << " Mbit/s" << std::endl;
     }
   return 0;
 }
diff -Naur ns-3.23/examples/wireless/mixed-wireless.py ns-3.24/examples/wireless/mixed-wireless.py
--- ns-3.23/examples/wireless/mixed-wireless.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/mixed-wireless.py	2015-09-15 11:18:44.000000000 -0700
@@ -72,13 +72,15 @@
 
 def main(argv): 
     # 
-    #  First, we declare and initialize a few local variables that control some 
+    #  First, we initialize a few local variables that control some 
     #  simulation parameters.
-    # 
-    backboneNodes = 10
-    infraNodes = 2 
-    lanNodes = 2
-    stopTime = 20
+    #
+
+    cmd = ns.core.CommandLine()
+    cmd.backboneNodes = 10
+    cmd.infraNodes = 2
+    cmd.lanNodes = 2
+    cmd.stopTime = 20
 
     # 
     #  Simulation defaults are typically set next, before command line
@@ -92,18 +94,23 @@
     #  system so that they can be overridden with flags such as 
     #  "--backboneNodes=20"
     # 
-    cmd = ns.core.CommandLine()
-    cmd.AddValue("backboneNodes", "number of backbone nodes", str(backboneNodes))
-    cmd.AddValue("infraNodes", "number of leaf nodes", str(infraNodes))
-    cmd.AddValue("lanNodes", "number of LAN nodes", str(lanNodes))
-    cmd.AddValue("stopTime", "simulation stop time(seconds)", str(stopTime))
-
+    
+    cmd.AddValue("backboneNodes", "number of backbone nodes")
+    cmd.AddValue("infraNodes", "number of leaf nodes")
+    cmd.AddValue("lanNodes", "number of LAN nodes")
+    cmd.AddValue("stopTime", "simulation stop time(seconds)")
+    
     # 
     #  The system global variables and the local values added to the argument
     #  system can be overridden by command line arguments by using this call.
     # 
     cmd.Parse(argv)
 
+    backboneNodes = int(cmd.backboneNodes)
+    infraNodes = int(cmd.infraNodes) 
+    lanNodes = int(cmd.lanNodes)
+    stopTime = int(cmd.stopTime)
+
     if (stopTime < 10):
         print "Use a simulation stop time >= 10 seconds"
         exit(1)
diff -Naur ns-3.23/examples/wireless/ofdm-ht-validation.cc ns-3.24/examples/wireless/ofdm-ht-validation.cc
--- ns-3.23/examples/wireless/ofdm-ht-validation.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/ofdm-ht-validation.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,6 +15,12 @@
  *
  * Authors: Sébastien Deronne <sebastien.deronne@gmail.com>
  */
+
+// This example is used to validate NIST and YANS error rate models for HT rates.
+//
+// It ouputs plots of the Frame Success Rate versus the Signal-to-noise ratio for
+// both NIST and YANS error rate models and for every HT MCS value.
+
 #include "ns3/core-module.h"
 #include "ns3/yans-error-rate-model.h"
 #include "ns3/nist-error-rate-model.h"
@@ -33,14 +39,15 @@
   std::ofstream nistfile ("nist-frame-success-rate-n.plt");
   std::vector <std::string> modes;
 
-  modes.push_back ("OfdmRate6_5MbpsBW20MHz");
-  modes.push_back ("OfdmRate13MbpsBW20MHz");
-  modes.push_back ("OfdmRate19_5MbpsBW20MHz");
-  modes.push_back ("OfdmRate26MbpsBW20MHz");
-  modes.push_back ("OfdmRate39MbpsBW20MHz");
-  modes.push_back ("OfdmRate52MbpsBW20MHz");
-  modes.push_back ("OfdmRate58_5MbpsBW20MHz");
-  modes.push_back ("OfdmRate65MbpsBW20MHz");
+  modes.push_back ("HtMcs0");
+  modes.push_back ("HtMcs1");
+  modes.push_back ("HtMcs2");
+  modes.push_back ("HtMcs3");
+  modes.push_back ("HtMcs4");
+  modes.push_back ("HtMcs5");
+  modes.push_back ("HtMcs6");
+  modes.push_back ("HtMcs7");
+
 
   CommandLine cmd;
   cmd.AddValue ("FrameSize", "The frame size", FrameSize);
@@ -48,6 +55,7 @@
 
   Gnuplot yansplot = Gnuplot ("yans-frame-success-rate-n.eps");
   Gnuplot nistplot = Gnuplot ("nist-frame-success-rate-n.eps");
+  WifiTxVector txVector;
 
   Ptr <YansErrorRateModel> yans = CreateObject<YansErrorRateModel> ();
   Ptr <NistErrorRateModel> nist = CreateObject<NistErrorRateModel> ();
@@ -57,12 +65,23 @@
       std::cout << modes[i] << std::endl;
       Gnuplot2dDataset yansdataset (modes[i]);
       Gnuplot2dDataset nistdataset (modes[i]);
+      txVector.SetMode (modes[i]);
 
       for (double snr = -5.0; snr <= 30.0; snr += 0.1)
         {
-          double ps = yans->GetChunkSuccessRate (WifiMode (modes[i]), std::pow (10.0,snr / 10.0), FrameSize * 8);
+          double ps = yans->GetChunkSuccessRate (WifiMode (modes[i]), txVector, std::pow (10.0,snr / 10.0), FrameSize * 8);
           yansdataset.Add (snr, ps);
-          ps = nist->GetChunkSuccessRate (WifiMode (modes[i]), std::pow (10.0,snr / 10.0), FrameSize * 8);
+          if (ps < 0 || ps > 1)
+            {
+              //error
+              return 0;
+            }
+          ps = nist->GetChunkSuccessRate (WifiMode (modes[i]), txVector, std::pow (10.0,snr / 10.0), FrameSize * 8);
+          if (ps < 0 || ps > 1)
+            {
+              //error
+              return 0;
+            }
           nistdataset.Add (snr, ps);
         }
 
diff -Naur ns-3.23/examples/wireless/ofdm-validation.cc ns-3.24/examples/wireless/ofdm-validation.cc
--- ns-3.23/examples/wireless/ofdm-validation.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/ofdm-validation.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,12 @@
  *
  * Author: Gary Pei <guangyu.pei@boeing.com>
  */
+
+// This example is used to validate NIST and YANS error rate models for OFDM rates.
+//
+// It ouputs plots of the Frame Success Rate versus the Signal-to-noise ratio for
+// both NIST and YANS error rate models and for every OFDM mode.
+
 #include "ns3/core-module.h"
 #include "ns3/yans-error-rate-model.h"
 #include "ns3/nist-error-rate-model.h"
@@ -53,18 +59,30 @@
 
   Ptr <YansErrorRateModel> yans = CreateObject<YansErrorRateModel> ();
   Ptr <NistErrorRateModel> nist = CreateObject<NistErrorRateModel> ();
+  WifiTxVector txVector;
 
   for (uint32_t i = 0; i < modes.size (); i++)
     {
       std::cout << modes[i] << std::endl;
       Gnuplot2dDataset yansdataset (modes[i]);
       Gnuplot2dDataset nistdataset (modes[i]);
+      txVector.SetMode (modes[i]);
 
       for (double snr = -5.0; snr <= 30.0; snr += 0.1)
         {
-          double ps = yans->GetChunkSuccessRate (WifiMode (modes[i]), std::pow (10.0,snr/10.0), FrameSize*8);
+          double ps = yans->GetChunkSuccessRate (WifiMode (modes[i]), txVector, std::pow (10.0,snr / 10.0), FrameSize * 8);
           yansdataset.Add (snr, ps);
-          ps = nist->GetChunkSuccessRate (WifiMode (modes[i]), std::pow (10.0,snr/10.0), FrameSize*8);
+          if (ps < 0 || ps > 1)
+            {
+              //error
+              return 0;
+            }
+          ps = nist->GetChunkSuccessRate (WifiMode (modes[i]), txVector, std::pow (10.0,snr / 10.0), FrameSize * 8);
+          if (ps < 0 || ps > 1)
+            {
+              //error
+              return 0;
+            }
           nistdataset.Add (snr, ps);
         }
 
diff -Naur ns-3.23/examples/wireless/ofdm-vht-validation.cc ns-3.24/examples/wireless/ofdm-vht-validation.cc
--- ns-3.23/examples/wireless/ofdm-vht-validation.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/examples/wireless/ofdm-vht-validation.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,128 @@
+/* -*-  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
+ *
+ * Authors: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+// This example is used to validate NIST and YANS error rate models for VHT rates.
+//
+// It ouputs plots of the Frame Success Rate versus the Signal-to-noise ratio for
+// both NIST and YANS error rate models and for every VHT MCS value (MCS 9 is not
+// included since it is forbidden for 20 MHz channels).
+
+#include "ns3/core-module.h"
+#include "ns3/yans-error-rate-model.h"
+#include "ns3/nist-error-rate-model.h"
+#include "ns3/gnuplot.h"
+
+#include <fstream>
+#include <vector>
+#include <cmath>
+
+using namespace ns3;
+
+int main (int argc, char *argv[])
+{
+  uint32_t FrameSize = 2000; //bytes
+  std::ofstream yansfile ("yans-frame-success-rate-n.plt");
+  std::ofstream nistfile ("nist-frame-success-rate-n.plt");
+  std::vector <std::string> modes;
+
+  modes.push_back ("VhtMcs0");
+  modes.push_back ("VhtMcs1");
+  modes.push_back ("VhtMcs2");
+  modes.push_back ("VhtMcs3");
+  modes.push_back ("VhtMcs4");
+  modes.push_back ("VhtMcs5");
+  modes.push_back ("VhtMcs6");
+  modes.push_back ("VhtMcs7");
+  modes.push_back ("VhtMcs8");
+
+  CommandLine cmd;
+  cmd.AddValue ("FrameSize", "The frame size", FrameSize);
+  cmd.Parse (argc, argv);
+
+  Gnuplot yansplot = Gnuplot ("yans-frame-success-rate-n.eps");
+  Gnuplot nistplot = Gnuplot ("nist-frame-success-rate-n.eps");
+
+  Ptr <YansErrorRateModel> yans = CreateObject<YansErrorRateModel> ();
+  Ptr <NistErrorRateModel> nist = CreateObject<NistErrorRateModel> ();
+  WifiTxVector txVector;
+
+  for (uint32_t i = 0; i < modes.size (); i++)
+    {
+      std::cout << modes[i] << std::endl;
+      Gnuplot2dDataset yansdataset (modes[i]);
+      Gnuplot2dDataset nistdataset (modes[i]);
+      txVector.SetMode (modes[i]);
+
+      for (double snr = -5.0; snr <= 30.0; snr += 0.1)
+        {
+          double ps = yans->GetChunkSuccessRate (WifiMode (modes[i]), txVector, std::pow (10.0,snr / 10.0), FrameSize * 8);
+          if (ps < 0 || ps > 1)
+            {
+              //error
+              return 0;
+            }
+          yansdataset.Add (snr, ps);
+          ps = nist->GetChunkSuccessRate (WifiMode (modes[i]), txVector, std::pow (10.0,snr / 10.0), FrameSize * 8);
+          if (ps < 0 || ps > 1)
+            {
+              //error
+              return 0;
+            }
+          nistdataset.Add (snr, ps);
+        }
+
+      yansplot.AddDataset (yansdataset);
+      nistplot.AddDataset (nistdataset);
+    }
+
+  yansplot.SetTerminal ("postscript eps color enh \"Times-BoldItalic\"");
+  yansplot.SetLegend ("SNR(dB)", "Frame Success Rate");
+  yansplot.SetExtra  ("set xrange [-5:55]\n\
+set yrange [0:1]\n\
+set style line 1 linewidth 5\n\
+set style line 2 linewidth 5\n\
+set style line 3 linewidth 5\n\
+set style line 4 linewidth 5\n\
+set style line 5 linewidth 5\n\
+set style line 6 linewidth 5\n\
+set style line 7 linewidth 5\n\
+set style line 8 linewidth 5\n\
+set style line 9 linewidth 5\n\
+set style increment user"                                                                                                                                                                                                                                                                                                                                   );
+  yansplot.GenerateOutput (yansfile);
+  yansfile.close ();
+
+  nistplot.SetTerminal ("postscript eps color enh \"Times-BoldItalic\"");
+  nistplot.SetLegend ("SNR(dB)", "Frame Success Rate");
+  nistplot.SetExtra  ("set xrange [-5:55]\n\
+set yrange [0:1]\n\
+set style line 1 linewidth 5\n\
+set style line 2 linewidth 5\n\
+set style line 3 linewidth 5\n\
+set style line 4 linewidth 5\n\
+set style line 5 linewidth 5\n\
+set style line 6 linewidth 5\n\
+set style line 7 linewidth 5\n\
+set style line 8 linewidth 5\n\
+set style line 9 linewidth 5\n\
+set style increment user"                                                                                                                                                                                                                                                                                                                                   );
+
+  nistplot.GenerateOutput (nistfile);
+  nistfile.close ();
+}
+
diff -Naur ns-3.23/examples/wireless/power-adaptation-distance.cc ns-3.24/examples/wireless/power-adaptation-distance.cc
--- ns-3.23/examples/wireless/power-adaptation-distance.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/power-adaptation-distance.cc	2015-09-15 11:18:44.000000000 -0700
@@ -129,7 +129,7 @@
   void SetupPhy (Ptr<WifiPhy> phy);
   Time GetCalcTxTime (WifiMode mode);
 
-  std::map<Mac48Address, uint32_t> actualPower;
+  std::map<Mac48Address, double> actualPower;
   std::map<Mac48Address, WifiMode> actualMode;
   uint32_t m_bytesTotal;
   double totalEnergy;
@@ -197,9 +197,11 @@
   packet->PeekHeader (head);
   Mac48Address dest = head.GetAddr1 ();
 
-  totalEnergy += actualPower[dest] * GetCalcTxTime (actualMode[dest]).GetSeconds ();
-  totalTime += GetCalcTxTime (actualMode[dest]).GetSeconds ();
-
+  if (head.GetType() == WIFI_MAC_DATA)
+    {
+      totalEnergy += pow (10.0, actualPower[dest] / 10.0) * GetCalcTxTime (actualMode[dest]).GetSeconds ();
+      totalTime += GetCalcTxTime (actualMode[dest]).GetSeconds ();
+    }
 }
 
 void
@@ -259,10 +261,10 @@
   Vector pos = GetPosition (node);
   double mbs = ((m_bytesTotal * 8.0) / (1000000 * stepsTime));
   m_bytesTotal = 0;
-  double atm = pow (10, ((totalEnergy / stepsTime) / 10));
+  double atp = totalEnergy / stepsTime;
   totalEnergy = 0;
   totalTime = 0;
-  m_output_power.Add (pos.x, atm);
+  m_output_power.Add (pos.x, atp);
   m_output.Add (pos.x, mbs);
   pos.x += stepsSize;
   SetPosition (node, pos);
diff -Naur ns-3.23/examples/wireless/power-adaptation-interference.cc ns-3.24/examples/wireless/power-adaptation-interference.cc
--- ns-3.23/examples/wireless/power-adaptation-interference.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/power-adaptation-interference.cc	2015-09-15 11:18:44.000000000 -0700
@@ -102,7 +102,7 @@
   void SetupPhy (Ptr<WifiPhy> phy);
   Time GetCalcTxTime (WifiMode mode);
 
-  std::map<Mac48Address, uint32_t> actualPower;
+  std::map<Mac48Address, double> actualPower;
   std::map<Mac48Address, WifiMode> actualMode;
   uint32_t m_bytesTotal;
   double totalEnergy;
@@ -193,9 +193,11 @@
   packet->PeekHeader (head);
   Mac48Address dest = head.GetAddr1 ();
 
-  totalEnergy += actualPower[dest] * GetCalcTxTime (actualMode[dest]).GetSeconds ();
-  totalTime += GetCalcTxTime (actualMode[dest]).GetSeconds ();
-
+  if (head.GetType() == WIFI_MAC_DATA)
+    {
+      totalEnergy += pow (10.0, actualPower[dest] / 10.0) * GetCalcTxTime (actualMode[dest]).GetSeconds ();
+      totalTime += GetCalcTxTime (actualMode[dest]).GetSeconds ();
+    }
 }
 
 void
@@ -259,10 +261,10 @@
 {
   double mbs = ((m_bytesTotal * 8.0) / (1000000 * time));
   m_bytesTotal = 0;
-  double atm = pow (10, ((totalEnergy / time) / 10));
+  double atp = totalEnergy / time;
   totalEnergy = 0;
   totalTime = 0;
-  m_output_power.Add ((Simulator::Now ()).GetSeconds (), atm);
+  m_output_power.Add ((Simulator::Now ()).GetSeconds (), atp);
   m_output.Add ((Simulator::Now ()).GetSeconds (), mbs);
 
   m_output_idle.Add ((Simulator::Now ()).GetSeconds (), idleTime * 100);
diff -Naur ns-3.23/examples/wireless/simple-ht-hidden-stations.cc ns-3.24/examples/wireless/simple-ht-hidden-stations.cc
--- ns-3.23/examples/wireless/simple-ht-hidden-stations.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/simple-ht-hidden-stations.cc	2015-09-15 11:18:44.000000000 -0700
@@ -53,39 +53,43 @@
   uint64_t simulationTime = 10; //seconds
   uint32_t nMpdus = 1;
   bool enableRts = 0;
-    
+
   CommandLine cmd;
-  cmd.AddValue("nMpdus", "Number of aggregated MPDUs", nMpdus);
-  cmd.AddValue("payloadSize", "Payload size in bytes", payloadSize);
-  cmd.AddValue("enableRts", "Enable RTS/CTS", enableRts); // 1: RTS/CTS enabled; 0: RTS/CTS disabled
-  cmd.AddValue("simulationTime", "Simulation time in seconds", simulationTime);
+  cmd.AddValue ("nMpdus", "Number of aggregated MPDUs", nMpdus);
+  cmd.AddValue ("payloadSize", "Payload size in bytes", payloadSize);
+  cmd.AddValue ("enableRts", "Enable RTS/CTS", enableRts); // 1: RTS/CTS enabled; 0: RTS/CTS disabled
+  cmd.AddValue ("simulationTime", "Simulation time in seconds", simulationTime);
   cmd.Parse (argc, argv);
-    
-  if(!enableRts)
-    Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("999999"));
+
+  if (!enableRts)
+    {
+      Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("999999"));
+    }
   else
-    Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0"));
-     
+    {
+      Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0"));
+    }
+
   Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("990000"));
-  
+
   // Set the maximum wireless range to 5 meters in order to reproduce a hidden nodes scenario, i.e. the distance between hidden stations is larger than 5 meters
   Config::SetDefault ("ns3::RangePropagationLossModel::MaxRange", DoubleValue (5));
 
   NodeContainer wifiStaNodes;
   wifiStaNodes.Create (2);
   NodeContainer wifiApNode;
-  wifiApNode.Create(1);
+  wifiApNode.Create (1);
 
   YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
   channel.AddPropagationLoss ("ns3::RangePropagationLossModel"); //wireless range limited to 5 meters!
 
   YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
   phy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
-  phy.SetChannel (channel.Create());
+  phy.SetChannel (channel.Create ());
 
   WifiHelper wifi = WifiHelper::Default ();
   wifi.SetStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue("OfdmRate65MbpsBW20MHz"), "ControlMode", StringValue("OfdmRate6_5MbpsBW20MHz"));
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("HtMcs7"), "ControlMode", StringValue ("HtMcs0"));
   HtWifiMacHelper mac = HtWifiMacHelper::Default ();
 
   Ssid ssid = Ssid ("simple-mpdu-aggregation");
@@ -93,25 +97,31 @@
                "Ssid", SsidValue (ssid),
                "ActiveProbing", BooleanValue (false));
 
-  if (nMpdus > 1) mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable Block ACK when A-MPDU is enabled
+  if (nMpdus > 1)
+    {
+      mac.SetBlockAckThresholdForAc (AC_BE, 2);             //enable Block ACK when A-MPDU is enabled
 
+    }
   mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
-                              "MaxAmpduSize", UintegerValue (nMpdus*(payloadSize+100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes,
-                                                                                         //i.e. nMpdus aggregated packets in an A-MPDU
-  
+                              "MaxAmpduSize", UintegerValue (nMpdus * (payloadSize + 100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes,
+                                                                                             //i.e. nMpdus aggregated packets in an A-MPDU
+
   NetDeviceContainer staDevices;
   staDevices = wifi.Install (phy, mac, wifiStaNodes);
 
   mac.SetType ("ns3::ApWifiMac",
                "Ssid", SsidValue (ssid),
-               "BeaconInterval", TimeValue (MicroSeconds(102400)),
+               "BeaconInterval", TimeValue (MicroSeconds (102400)),
                "BeaconGeneration", BooleanValue (true));
 
-  if (nMpdus > 1) mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable Block ACK when A-MPDU is enabled
-    
+  if (nMpdus > 1)
+    {
+      mac.SetBlockAckThresholdForAc (AC_BE, 2);             //enable Block ACK when A-MPDU is enabled
+
+    }
   mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
-                              "MaxAmpduSize", UintegerValue (nMpdus*(payloadSize+100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes,
-                                                                                         //i.e. nMpdus aggregated packets in an A-MPDU
+                              "MaxAmpduSize", UintegerValue (nMpdus * (payloadSize + 100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes,
+                                                                                             //i.e. nMpdus aggregated packets in an A-MPDU
 
   NetDeviceContainer apDevice;
   apDevice = wifi.Install (phy, mac, wifiApNode);
@@ -145,35 +155,35 @@
   StaInterface = address.Assign (staDevices);
   Ipv4InterfaceContainer ApInterface;
   ApInterface = address.Assign (apDevice);
- 
+
   // Setting applications
   UdpServerHelper myServer (9);
   ApplicationContainer serverApp = myServer.Install (wifiApNode);
   serverApp.Start (Seconds (0.0));
-  serverApp.Stop (Seconds (simulationTime+1));
-      
+  serverApp.Stop (Seconds (simulationTime + 1));
+
   UdpClientHelper myClient (ApInterface.GetAddress (0), 9);
   myClient.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
   myClient.SetAttribute ("Interval", TimeValue (Time ("0.00002"))); //packets/s
   myClient.SetAttribute ("PacketSize", UintegerValue (payloadSize));
-  
+
   // Saturated UDP traffic from stations to AP
   ApplicationContainer clientApp1 = myClient.Install (wifiStaNodes);
   clientApp1.Start (Seconds (1.0));
-  clientApp1.Stop (Seconds (simulationTime+1));
-  
+  clientApp1.Stop (Seconds (simulationTime + 1));
+
   phy.EnablePcap ("SimpleHtHiddenStations_Ap", apDevice.Get (0));
   phy.EnablePcap ("SimpleHtHiddenStations_Sta1", staDevices.Get (0));
   phy.EnablePcap ("SimpleHtHiddenStations_Sta2", staDevices.Get (1));
-      
-  Simulator::Stop (Seconds (simulationTime+1));
+
+  Simulator::Stop (Seconds (simulationTime + 1));
 
   Simulator::Run ();
   Simulator::Destroy ();
-      
-  uint32_t totalPacketsThrough = DynamicCast<UdpServer>(serverApp.Get (0))->GetReceived ();
-  double throughput = totalPacketsThrough*payloadSize*8/(simulationTime*1000000.0);
+
+  uint32_t totalPacketsThrough = DynamicCast<UdpServer> (serverApp.Get (0))->GetReceived ();
+  double throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0);
   std::cout << "Throughput: " << throughput << " Mbit/s" << '\n';
-    
+
   return 0;
 }
diff -Naur ns-3.23/examples/wireless/simple-mpdu-aggregation.cc ns-3.24/examples/wireless/simple-mpdu-aggregation.cc
--- ns-3.23/examples/wireless/simple-mpdu-aggregation.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/simple-mpdu-aggregation.cc	2015-09-15 11:18:44.000000000 -0700
@@ -56,34 +56,38 @@
   uint64_t simulationTime = 10; //seconds
   uint32_t nMpdus = 1;
   bool enableRts = 0;
-    
+
   CommandLine cmd;
-  cmd.AddValue("nMpdus", "Number of aggregated MPDUs", nMpdus); //number of aggregated MPDUs specified by the user
-  cmd.AddValue("payloadSize", "Payload size in bytes", payloadSize);
-  cmd.AddValue("enableRts", "Enable RTS/CTS", enableRts);
-  cmd.AddValue("simulationTime", "Simulation time in seconds", simulationTime);
+  cmd.AddValue ("nMpdus", "Number of aggregated MPDUs", nMpdus); //number of aggregated MPDUs specified by the user
+  cmd.AddValue ("payloadSize", "Payload size in bytes", payloadSize);
+  cmd.AddValue ("enableRts", "Enable RTS/CTS", enableRts);
+  cmd.AddValue ("simulationTime", "Simulation time in seconds", simulationTime);
   cmd.Parse (argc, argv);
-    
-  if(!enableRts)
-    Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("999999"));
+
+  if (!enableRts)
+    {
+      Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("999999"));
+    }
   else
-    Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0"));
-     
+    {
+      Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0"));
+    }
+
   Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("990000"));
 
   NodeContainer wifiStaNode;
   wifiStaNode.Create (1);
   NodeContainer wifiApNode;
-  wifiApNode.Create(1);
+  wifiApNode.Create (1);
 
   YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
   YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
   phy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
-  phy.SetChannel (channel.Create());
+  phy.SetChannel (channel.Create ());
 
   WifiHelper wifi = WifiHelper::Default ();
   wifi.SetStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue("OfdmRate65MbpsBW20MHz"), "ControlMode", StringValue("OfdmRate6_5MbpsBW20MHz"));
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("HtMcs7"), "ControlMode", StringValue ("HtMcs0"));
   HtWifiMacHelper mac = HtWifiMacHelper::Default ();
 
   Ssid ssid = Ssid ("simple-mpdu-aggregation");
@@ -91,23 +95,29 @@
                "Ssid", SsidValue (ssid),
                "ActiveProbing", BooleanValue (false));
 
-  if (nMpdus > 1) mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable Block ACK when A-MPDU is enabled (i.e. nMpdus > 1)
+  if (nMpdus > 1)
+    {
+      mac.SetBlockAckThresholdForAc (AC_BE, 2);             //enable Block ACK when A-MPDU is enabled (i.e. nMpdus > 1)
 
+    }
   mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
-                              "MaxAmpduSize", UintegerValue (nMpdus*(payloadSize+100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes, i.e. nMpdus aggregated packets in an A-MPDU
-  
+                              "MaxAmpduSize", UintegerValue (nMpdus * (payloadSize + 100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes, i.e. nMpdus aggregated packets in an A-MPDU
+
   NetDeviceContainer staDevice;
   staDevice = wifi.Install (phy, mac, wifiStaNode);
 
   mac.SetType ("ns3::ApWifiMac",
                "Ssid", SsidValue (ssid),
-               "BeaconInterval", TimeValue (MicroSeconds(102400)),
+               "BeaconInterval", TimeValue (MicroSeconds (102400)),
                "BeaconGeneration", BooleanValue (true));
 
-  if (nMpdus > 1) mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable Block ACK when A-MPDU is enabled (i.e. nMpdus > 1)
-    
+  if (nMpdus > 1)
+    {
+      mac.SetBlockAckThresholdForAc (AC_BE, 2);             //enable Block ACK when A-MPDU is enabled (i.e. nMpdus > 1)
+
+    }
   mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
-                              "MaxAmpduSize", UintegerValue (nMpdus*(payloadSize+100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes, i.e. nMpdus aggregated packets in an A-MPDU
+                              "MaxAmpduSize", UintegerValue (nMpdus * (payloadSize + 100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes, i.e. nMpdus aggregated packets in an A-MPDU
 
   NetDeviceContainer apDevice;
   apDevice = wifi.Install (phy, mac, wifiApNode);
@@ -137,30 +147,30 @@
   StaInterface = address.Assign (staDevice);
   Ipv4InterfaceContainer ApInterface;
   ApInterface = address.Assign (apDevice);
- 
+
   /* Setting applications */
   UdpServerHelper myServer (9);
   ApplicationContainer serverApp = myServer.Install (wifiStaNode.Get (0));
   serverApp.Start (Seconds (0.0));
-  serverApp.Stop (Seconds (simulationTime+1));
-      
+  serverApp.Stop (Seconds (simulationTime + 1));
+
   UdpClientHelper myClient (StaInterface.GetAddress (0), 9);
   myClient.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
   myClient.SetAttribute ("Interval", TimeValue (Time ("0.00002"))); //packets/s
   myClient.SetAttribute ("PacketSize", UintegerValue (payloadSize));
-              
+
   ApplicationContainer clientApp = myClient.Install (wifiApNode.Get (0));
   clientApp.Start (Seconds (1.0));
-  clientApp.Stop (Seconds (simulationTime+1));
-      
-  Simulator::Stop (Seconds (simulationTime+1));
+  clientApp.Stop (Seconds (simulationTime + 1));
+
+  Simulator::Stop (Seconds (simulationTime + 1));
 
   Simulator::Run ();
   Simulator::Destroy ();
-      
-  uint32_t totalPacketsThrough = DynamicCast<UdpServer>(serverApp.Get (0))->GetReceived ();
-  double throughput = totalPacketsThrough*payloadSize*8/(simulationTime*1000000.0);
+
+  uint32_t totalPacketsThrough = DynamicCast<UdpServer> (serverApp.Get (0))->GetReceived ();
+  double throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0);
   std::cout << "Throughput: " << throughput << " Mbit/s" << '\n';
-    
+
   return 0;
 }
diff -Naur ns-3.23/examples/wireless/simple-msdu-aggregation.cc ns-3.24/examples/wireless/simple-msdu-aggregation.cc
--- ns-3.23/examples/wireless/simple-msdu-aggregation.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/simple-msdu-aggregation.cc	2015-09-15 11:18:44.000000000 -0700
@@ -3,7 +3,7 @@
  * Copyright (c) 2009 MIRKO BANCHI
  *
  * 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 
+ * 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,
@@ -56,105 +56,109 @@
   uint64_t simulationTime = 10; //seconds
   uint32_t nMsdus = 1;
   bool enableRts = 0;
-    
+
   CommandLine cmd;
-  cmd.AddValue("nMsdus", "Number of aggregated MSDUs", nMsdus); //number of aggregated MSDUs specified by the user
-  cmd.AddValue("payloadSize", "Payload size in bytes", payloadSize);
-  cmd.AddValue("enableRts", "Enable RTS/CTS", enableRts);
-  cmd.AddValue("simulationTime", "Simulation time in seconds", simulationTime);
+  cmd.AddValue ("nMsdus", "Number of aggregated MSDUs", nMsdus); //number of aggregated MSDUs specified by the user
+  cmd.AddValue ("payloadSize", "Payload size in bytes", payloadSize);
+  cmd.AddValue ("enableRts", "Enable RTS/CTS", enableRts);
+  cmd.AddValue ("simulationTime", "Simulation time in seconds", simulationTime);
   cmd.Parse (argc, argv);
- 
-  if(!enableRts)
-    Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("999999"));
+
+  if (!enableRts)
+    {
+      Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("999999"));
+    }
   else
-    Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0"));
-    
+    {
+      Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0"));
+    }
+
   Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("990000"));
-    
+
   NodeContainer wifiStaNode;
   wifiStaNode.Create (1);
   NodeContainer wifiApNode;
-  wifiApNode.Create(1);
-    
+  wifiApNode.Create (1);
+
   YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
   YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
   phy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
-  phy.SetChannel (channel.Create());
-    
+  phy.SetChannel (channel.Create ());
+
   WifiHelper wifi = WifiHelper::Default ();
   wifi.SetStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue("OfdmRate65MbpsBW20MHz"), "ControlMode", StringValue("OfdmRate6_5MbpsBW20MHz"));
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("HtMcs7"), "ControlMode", StringValue ("HtMcs0"));
   HtWifiMacHelper mac = HtWifiMacHelper::Default ();
 
   Ssid ssid = Ssid ("simple-msdu-aggregation");
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid),
                "ActiveProbing", BooleanValue (false));
-    
-  mac.SetMsduAggregatorForAc (AC_BE, "ns3::MsduStandardAggregator", 
-                              "MaxAmsduSize", UintegerValue (nMsdus*(payloadSize+100))); //enable MSDU aggregation for AC_BE with a maximum aggregated size of nMsdus*(payloadSize+100) bytes, i.e. nMsdus aggregated packets in an A-MSDU
+
+  mac.SetMsduAggregatorForAc (AC_BE, "ns3::MsduStandardAggregator",
+                              "MaxAmsduSize", UintegerValue (nMsdus * (payloadSize + 100))); //enable MSDU aggregation for AC_BE with a maximum aggregated size of nMsdus*(payloadSize+100) bytes, i.e. nMsdus aggregated packets in an A-MSDU
 
   NetDeviceContainer staDevice;
   staDevice = wifi.Install (phy, mac, wifiStaNode);
 
   mac.SetType ("ns3::ApWifiMac",
                "Ssid", SsidValue (ssid));
-    
-  mac.SetMsduAggregatorForAc (AC_BE, "ns3::MsduStandardAggregator", 
-                              "MaxAmsduSize", UintegerValue (nMsdus*(payloadSize+100))); //enable MSDU aggregation for AC_BE with a maximum aggregated size of nMsdus*(payloadSize+100) bytes, i.e. nMsdus aggregated packets in an A-MSDU
-    
+
+  mac.SetMsduAggregatorForAc (AC_BE, "ns3::MsduStandardAggregator",
+                              "MaxAmsduSize", UintegerValue (nMsdus * (payloadSize + 100))); //enable MSDU aggregation for AC_BE with a maximum aggregated size of nMsdus*(payloadSize+100) bytes, i.e. nMsdus aggregated packets in an A-MSDU
+
   NetDeviceContainer apDevice;
   apDevice = wifi.Install (phy, mac, wifiApNode);
- 
+
   /* Setting mobility model */
   MobilityHelper mobility;
   Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
-    
+
   positionAlloc->Add (Vector (0.0, 0.0, 0.0));
   positionAlloc->Add (Vector (1.0, 0.0, 0.0));
   mobility.SetPositionAllocator (positionAlloc);
-    
+
   mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
-    
+
   mobility.Install (wifiApNode);
   mobility.Install (wifiStaNode);
-    
+
   /* Internet stack*/
   InternetStackHelper stack;
   stack.Install (wifiApNode);
   stack.Install (wifiStaNode);
- 
+
   Ipv4AddressHelper address;
-    
+
   address.SetBase ("192.168.1.0", "255.255.255.0");
   Ipv4InterfaceContainer StaInterface;
   StaInterface = address.Assign (staDevice);
   Ipv4InterfaceContainer ApInterface;
   ApInterface = address.Assign (apDevice);
-    
+
   /* Setting applications */
   UdpServerHelper myServer (9);
   ApplicationContainer serverApp = myServer.Install (wifiStaNode.Get (0));
   serverApp.Start (Seconds (0.0));
-  serverApp.Stop (Seconds (simulationTime+1));
-    
+  serverApp.Stop (Seconds (simulationTime + 1));
+
   UdpClientHelper myClient (StaInterface.GetAddress (0), 9);
   myClient.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
   myClient.SetAttribute ("Interval", TimeValue (Time ("0.00002"))); //packets/s
   myClient.SetAttribute ("PacketSize", UintegerValue (payloadSize));
-    
+
   ApplicationContainer clientApp = myClient.Install (wifiApNode.Get (0));
   clientApp.Start (Seconds (1.0));
-  clientApp.Stop (Seconds (simulationTime+1));
-    
-  Simulator::Stop (Seconds (simulationTime+1));
-    
+  clientApp.Stop (Seconds (simulationTime + 1));
+
+  Simulator::Stop (Seconds (simulationTime + 1));
+
   Simulator::Run ();
   Simulator::Destroy ();
-    
-  uint32_t totalPacketsThrough = DynamicCast<UdpServer>(serverApp.Get (0))->GetReceived ();
-  double throughput = totalPacketsThrough*payloadSize*8/(simulationTime*1000000.0);
+
+  uint32_t totalPacketsThrough = DynamicCast<UdpServer> (serverApp.Get (0))->GetReceived ();
+  double throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0);
   std::cout << "Throughput: " << throughput << " Mbit/s" << '\n';
-    
-    return 0;
+
+  return 0;
 }
diff -Naur ns-3.23/examples/wireless/simple-two-level-aggregation.cc ns-3.24/examples/wireless/simple-two-level-aggregation.cc
--- ns-3.23/examples/wireless/simple-two-level-aggregation.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/simple-two-level-aggregation.cc	2015-09-15 11:18:44.000000000 -0700
@@ -102,8 +102,8 @@
   wifi.SetStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
   //We consider a constant bitrate since HT rate adaptation algorithms are not supported yet in the simulator
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
-                                "DataMode", StringValue ("OfdmRate65MbpsBW20MHz"),
-                                "ControlMode", StringValue ("OfdmRate6_5MbpsBW20MHz"));
+                                "DataMode", StringValue ("HtMcs7"),
+                                "ControlMode", StringValue ("HtMcs0"));
   HtWifiMacHelper mac = HtWifiMacHelper::Default ();
 
   Ssid ssid = Ssid ("simple-two-level-aggregation");
diff -Naur ns-3.23/examples/wireless/vht-wifi-network.cc ns-3.24/examples/wireless/vht-wifi-network.cc
--- ns-3.23/examples/wireless/vht-wifi-network.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/examples/wireless/vht-wifi-network.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,219 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015 SEBASTIEN DERONNE
+ *
+ * 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: Sebastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/wifi-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/internet-module.h"
+
+// This is a simple example in order to show how to configure an IEEE 802.11ac Wi-Fi network.
+//
+// It ouputs the UDP or TCP goodput for every VHT bitrate value, which depends on the MCS value (0 to 9, where 9 is
+// forbidden when the channel width is 20 MHz), the channel width (20, 40, 80 or 160 MHz) and the guard interval (long
+// or short). The PHY bitrate is constant over all the simulation run. The user can also specify the distance between
+// the access point and the station: the larger the distance the smaller the goodput.
+//
+// The simulation assumes a single station in an infrastructure network:
+//
+//  STA     AP
+//    *     *
+//    |     |
+//   n1     n2
+//
+//Packets in this simulation aren't marked with a QosTag so they are considered
+//belonging to BestEffort Access Class (AC_BE).
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("vht-wifi-network");
+
+int main (int argc, char *argv[])
+{
+  bool udp = true;
+  double simulationTime = 10; //seconds
+  double distance = 1.0; //meters
+
+  CommandLine cmd;
+  cmd.AddValue ("distance", "Distance in meters between the station and the access point", distance);
+  cmd.AddValue ("simulationTime", "Simulation time in seconds", simulationTime);
+  cmd.AddValue ("udp", "UDP if set to 1, TCP otherwise", udp);
+  cmd.Parse (argc,argv);
+
+  std::cout << "MCS value" << "\t\t" << "Channel width" << "\t\t" << "short GI" << "\t\t" << "Throughput" << '\n';
+  for (int i = 0; i <= 9; i++) //MCS
+    {
+      for (int j = 20; j <= 160; ) //channel width
+        {
+          if (i == 9 && j == 20)
+            {
+              j *= 2;
+              continue;
+            }
+          for (int k = 0; k < 2; k++) //GI: 0 and 1
+            {
+              uint32_t payloadSize; //1500 byte IP packet
+              if (udp)
+                {
+                  payloadSize = 1472; //bytes
+                }
+              else
+                {
+                  payloadSize = 1448; //bytes
+                  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (payloadSize));
+                }
+
+              NodeContainer wifiStaNode;
+              wifiStaNode.Create (1);
+              NodeContainer wifiApNode;
+              wifiApNode.Create (1);
+
+              YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
+              YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
+              phy.SetChannel (channel.Create ());
+
+              // Set guard interval
+              phy.Set ("ShortGuardEnabled", BooleanValue (k));
+
+              WifiHelper wifi = WifiHelper::Default ();
+              wifi.SetStandard (WIFI_PHY_STANDARD_80211ac);
+              VhtWifiMacHelper mac = VhtWifiMacHelper::Default ();
+                
+              StringValue DataRate = VhtWifiMacHelper::DataRateForMcs (i);
+              wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager","DataMode", DataRate,
+                                            "ControlMode", DataRate);
+                
+              Ssid ssid = Ssid ("ns3-80211ac");
+
+              mac.SetType ("ns3::StaWifiMac",
+                           "Ssid", SsidValue (ssid),
+                           "ActiveProbing", BooleanValue (false));
+
+              NetDeviceContainer staDevice;
+              staDevice = wifi.Install (phy, mac, wifiStaNode);
+
+              mac.SetType ("ns3::ApWifiMac",
+                           "Ssid", SsidValue (ssid));
+
+              NetDeviceContainer apDevice;
+              apDevice = wifi.Install (phy, mac, wifiApNode);
+
+              // Set channel width
+              Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (j));
+
+              // mobility.
+              MobilityHelper mobility;
+              Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+
+              positionAlloc->Add (Vector (0.0, 0.0, 0.0));
+              positionAlloc->Add (Vector (distance, 0.0, 0.0));
+              mobility.SetPositionAllocator (positionAlloc);
+
+              mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+
+              mobility.Install (wifiApNode);
+              mobility.Install (wifiStaNode);
+
+              /* Internet stack*/
+              InternetStackHelper stack;
+              stack.Install (wifiApNode);
+              stack.Install (wifiStaNode);
+
+              Ipv4AddressHelper address;
+
+              address.SetBase ("192.168.1.0", "255.255.255.0");
+              Ipv4InterfaceContainer staNodeInterface;
+              Ipv4InterfaceContainer apNodeInterface;
+
+              staNodeInterface = address.Assign (staDevice);
+              apNodeInterface = address.Assign (apDevice);
+
+              /* Setting applications */
+              ApplicationContainer serverApp, sinkApp;
+              if (udp)
+                {
+                  //UDP flow
+                  UdpServerHelper myServer (9);
+                  serverApp = myServer.Install (wifiStaNode.Get (0));
+                  serverApp.Start (Seconds (0.0));
+                  serverApp.Stop (Seconds (simulationTime + 1));
+
+                  UdpClientHelper myClient (staNodeInterface.GetAddress (0), 9);
+                  myClient.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
+                  myClient.SetAttribute ("Interval", TimeValue (Time ("0.00001"))); //packets/s
+                  myClient.SetAttribute ("PacketSize", UintegerValue (payloadSize));
+
+                  ApplicationContainer clientApp = myClient.Install (wifiApNode.Get (0));
+                  clientApp.Start (Seconds (1.0));
+                  clientApp.Stop (Seconds (simulationTime + 1));
+                }
+              else
+                {
+                  //TCP flow
+                  uint16_t port = 50000;
+                  Address apLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
+                  PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", apLocalAddress);
+                  sinkApp = packetSinkHelper.Install (wifiStaNode.Get (0));
+
+                  sinkApp.Start (Seconds (0.0));
+                  sinkApp.Stop (Seconds (simulationTime + 1));
+
+                  OnOffHelper onoff ("ns3::TcpSocketFactory",Ipv4Address::GetAny ());
+                  onoff.SetAttribute ("OnTime",  StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
+                  onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
+                  onoff.SetAttribute ("PacketSize", UintegerValue (payloadSize));
+                  onoff.SetAttribute ("DataRate", DataRateValue (1000000000)); //bit/s
+                  ApplicationContainer apps;
+
+                  AddressValue remoteAddress (InetSocketAddress (staNodeInterface.GetAddress (0), port));
+                  onoff.SetAttribute ("Remote", remoteAddress);
+                  apps.Add (onoff.Install (wifiApNode.Get (0)));
+                  apps.Start (Seconds (1.0));
+                  apps.Stop (Seconds (simulationTime + 1));
+                }
+
+              Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+
+              Simulator::Stop (Seconds (simulationTime + 1));
+              Simulator::Run ();
+              Simulator::Destroy ();
+
+              double throughput = 0;
+              if (udp)
+                {
+                  //UDP
+                  uint32_t totalPacketsThrough = DynamicCast<UdpServer> (serverApp.Get (0))->GetReceived ();
+                  throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0); //Mbit/s
+                }
+              else
+                {
+                  //TCP
+                  uint32_t totalPacketsThrough = DynamicCast<PacketSink> (sinkApp.Get (0))->GetTotalRx ();
+                  throughput = totalPacketsThrough * 8 / (simulationTime * 1000000.0); //Mbit/s
+                }
+              std::cout << i << "\t\t\t" << j << " MHz\t\t\t" << k << "\t\t\t" << throughput << " Mbit/s" << std::endl;
+            }
+          j *= 2;
+        }
+    }
+  return 0;
+}
diff -Naur ns-3.23/examples/wireless/wscript ns-3.24/examples/wireless/wscript
--- ns-3.23/examples/wireless/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/examples/wireless/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -49,12 +49,18 @@
     obj = bld.create_ns3_program('ofdm-ht-validation', ['core', 'mobility', 'wifi', 'config-store', 'stats'])
     obj.source = 'ofdm-ht-validation.cc'
 
+    obj = bld.create_ns3_program('ofdm-vht-validation', ['core', 'mobility', 'wifi', 'config-store', 'stats'])
+    obj.source = 'ofdm-vht-validation.cc'
+
     obj = bld.create_ns3_program('wifi-hidden-terminal', ['internet', 'mobility', 'wifi', 'applications', 'propagation', 'flow-monitor'])
     obj.source = 'wifi-hidden-terminal.cc'
 
     obj = bld.create_ns3_program('ht-wifi-network', ['core','internet', 'mobility', 'wifi', 'applications', 'propagation'])
     obj.source = 'ht-wifi-network.cc'
 
+    obj = bld.create_ns3_program('vht-wifi-network', ['core','internet', 'mobility', 'wifi', 'applications', 'propagation'])
+    obj.source = 'vht-wifi-network.cc'
+
     obj = bld.create_ns3_program('wifi-timing-attributes', ['core','internet', 'mobility', 'wifi', 'applications', 'propagation'])
     obj.source = 'wifi-timing-attributes.cc'
 
diff -Naur ns-3.23/RELEASE_NOTES ns-3.24/RELEASE_NOTES
--- ns-3.23/RELEASE_NOTES	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/RELEASE_NOTES	2015-09-15 14:02:37.000000000 -0700
@@ -9,6 +9,84 @@
 Consult the file CHANGES.html for more detailed information about changed
 API and behavior across ns-3 releases.
 
+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
 ============
 
diff -Naur ns-3.23/src/antenna/bindings/modulegen__gcc_ILP32.py ns-3.24/src/antenna/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/antenna/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/antenna/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -279,11 +279,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -927,11 +922,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
diff -Naur ns-3.23/src/antenna/bindings/modulegen__gcc_LP64.py ns-3.24/src/antenna/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/antenna/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/antenna/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -279,11 +279,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -927,11 +922,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
diff -Naur ns-3.23/src/aodv/bindings/modulegen__gcc_ILP32.py ns-3.24/src/aodv/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/aodv/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -373,6 +373,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace aodv
     
     nested_module = module.add_cpp_namespace('aodv')
@@ -413,6 +419,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_aodv(module):
     root_module = module.get_root()
     
@@ -729,17 +742,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -761,11 +774,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -775,16 +783,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1022,14 +1020,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1090,11 +1092,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -2281,7 +2278,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2373,10 +2370,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4765,6 +4762,10 @@
     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::SetQosNoAck() [member function]
     cls.add_method('SetQosNoAck', 
                    'void', 
@@ -4777,6 +4778,10 @@
     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::SetQosNormalAck() [member function]
     cls.add_method('SetQosNormalAck', 
                    'void', 
@@ -4931,6 +4936,10 @@
     cls.add_method('PrintArpCache', 
                    'void', 
                    [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Remove(ns3::ArpCache::Entry * entry) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::ArpCache::Entry *', 'entry')])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::SetAliveTimeout(ns3::Time aliveTimeout) [member function]
     cls.add_method('SetAliveTimeout', 
                    'void', 
@@ -4967,6 +4976,10 @@
     cls.add_constructor([param('ns3::ArpCache::Entry const &', 'arg0')])
     ## arp-cache.h (module 'internet'): ns3::ArpCache::Entry::Entry(ns3::ArpCache * arp) [constructor]
     cls.add_constructor([param('ns3::ArpCache *', 'arp')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearPendingPacket() [member function]
+    cls.add_method('ClearPendingPacket', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearRetries() [member function]
     cls.add_method('ClearRetries', 
                    'void', 
@@ -5007,6 +5020,10 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsPermanent() [member function]
+    cls.add_method('IsPermanent', 
+                   'bool', 
+                   [])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsWaitReply() [member function]
     cls.add_method('IsWaitReply', 
                    'bool', 
@@ -5019,6 +5036,10 @@
     cls.add_method('MarkDead', 
                    'void', 
                    [])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkPermanent() [member function]
+    cls.add_method('MarkPermanent', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('MarkWaitReply', 
                    'void', 
@@ -5027,6 +5048,10 @@
     cls.add_method('SetIpv4Address', 
                    'void', 
                    [param('ns3::Ipv4Address', 'destination')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::SetMacAddresss(ns3::Address macAddress) [member function]
+    cls.add_method('SetMacAddresss', 
+                   'void', 
+                   [param('ns3::Address', 'macAddress')])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::UpdateWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('UpdateWaitReply', 
                    'bool', 
@@ -5136,11 +5161,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5250,10 +5285,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -8203,6 +8238,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_aodv(module.get_submodule('aodv'), root_module)
     return
 
@@ -8216,6 +8252,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_aodv(module, root_module):
     return
 
diff -Naur ns-3.23/src/aodv/bindings/modulegen__gcc_LP64.py ns-3.24/src/aodv/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/aodv/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -373,6 +373,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace aodv
     
     nested_module = module.add_cpp_namespace('aodv')
@@ -413,6 +419,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_aodv(module):
     root_module = module.get_root()
     
@@ -729,17 +742,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -761,11 +774,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -775,16 +783,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1022,14 +1020,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1090,11 +1092,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -2281,7 +2278,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2373,10 +2370,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4765,6 +4762,10 @@
     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::SetQosNoAck() [member function]
     cls.add_method('SetQosNoAck', 
                    'void', 
@@ -4777,6 +4778,10 @@
     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::SetQosNormalAck() [member function]
     cls.add_method('SetQosNormalAck', 
                    'void', 
@@ -4931,6 +4936,10 @@
     cls.add_method('PrintArpCache', 
                    'void', 
                    [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Remove(ns3::ArpCache::Entry * entry) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::ArpCache::Entry *', 'entry')])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::SetAliveTimeout(ns3::Time aliveTimeout) [member function]
     cls.add_method('SetAliveTimeout', 
                    'void', 
@@ -4967,6 +4976,10 @@
     cls.add_constructor([param('ns3::ArpCache::Entry const &', 'arg0')])
     ## arp-cache.h (module 'internet'): ns3::ArpCache::Entry::Entry(ns3::ArpCache * arp) [constructor]
     cls.add_constructor([param('ns3::ArpCache *', 'arp')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearPendingPacket() [member function]
+    cls.add_method('ClearPendingPacket', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearRetries() [member function]
     cls.add_method('ClearRetries', 
                    'void', 
@@ -5007,6 +5020,10 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsPermanent() [member function]
+    cls.add_method('IsPermanent', 
+                   'bool', 
+                   [])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsWaitReply() [member function]
     cls.add_method('IsWaitReply', 
                    'bool', 
@@ -5019,6 +5036,10 @@
     cls.add_method('MarkDead', 
                    'void', 
                    [])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkPermanent() [member function]
+    cls.add_method('MarkPermanent', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('MarkWaitReply', 
                    'void', 
@@ -5027,6 +5048,10 @@
     cls.add_method('SetIpv4Address', 
                    'void', 
                    [param('ns3::Ipv4Address', 'destination')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::SetMacAddresss(ns3::Address macAddress) [member function]
+    cls.add_method('SetMacAddresss', 
+                   'void', 
+                   [param('ns3::Address', 'macAddress')])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::UpdateWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('UpdateWaitReply', 
                    'bool', 
@@ -5136,11 +5161,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5250,10 +5285,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -8203,6 +8238,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_aodv(module.get_submodule('aodv'), root_module)
     return
 
@@ -8216,6 +8252,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_aodv(module, root_module):
     return
 
diff -Naur ns-3.23/src/aodv/model/aodv-neighbor.cc ns-3.24/src/aodv/model/aodv-neighbor.cc
--- ns-3.23/src/aodv/model/aodv-neighbor.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/model/aodv-neighbor.cc	2015-09-15 11:18:44.000000000 -0700
@@ -149,7 +149,7 @@
        i != m_arp.end (); ++i)
     {
       ArpCache::Entry * entry = (*i)->Lookup (addr);
-      if (entry != 0 && entry->IsAlive () && !entry->IsExpired ())
+      if (entry != 0 && (entry->IsAlive () || entry->IsPermanent ()) && !entry->IsExpired ())
         {
           hwaddr = Mac48Address::ConvertFrom (entry->GetMacAddress ());
           break;
diff -Naur ns-3.23/src/aodv/model/aodv-routing-protocol.cc ns-3.24/src/aodv/model/aodv-routing-protocol.cc
--- ns-3.23/src/aodv/model/aodv-routing-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/model/aodv-routing-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -65,7 +65,7 @@
 
   static TypeId GetTypeId ()
   {
-    static TypeId tid = TypeId ("ns3::aodv::DeferredRouteOutputTag").SetParent<Tag> ()
+    static TypeId tid = TypeId ("ns3::aodv::DeferredRouteOutputTag")
       .SetParent<Tag> ()
       .SetGroupName("Aodv")
       .AddConstructor<DeferredRouteOutputTag> ()
diff -Naur ns-3.23/src/aodv/test/aodv-id-cache-test-suite.cc ns-3.24/src/aodv/test/aodv-id-cache-test-suite.cc
--- ns-3.23/src/aodv/test/aodv-id-cache-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/test/aodv-id-cache-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -37,11 +37,14 @@
 // Tests
 //-----------------------------------------------------------------------------
 /// Unit test for id cache
-struct IdCacheTest : public TestCase
+class IdCacheTest : public TestCase
 {
+public:
   IdCacheTest () : TestCase ("Id Cache"), cache (Seconds (10))
   {}
   virtual void DoRun ();
+
+private:
   void CheckTimeout1 ();
   void CheckTimeout2 ();
   void CheckTimeout3 ();
@@ -93,7 +96,7 @@
 class IdCacheTestSuite : public TestSuite
 {
 public:
-  IdCacheTestSuite () : TestSuite ("routing-id-cache", UNIT)
+  IdCacheTestSuite () : TestSuite ("aodv-routing-id-cache", UNIT)
   {
     AddTestCase (new IdCacheTest, TestCase::QUICK);
   }
diff -Naur ns-3.23/src/aodv/test/aodv-regression.cc ns-3.24/src/aodv/test/aodv-regression.cc
--- ns-3.23/src/aodv/test/aodv-regression.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/test/aodv-regression.cc	2015-09-15 11:18:44.000000000 -0700
@@ -20,7 +20,6 @@
 
 #include "aodv-regression.h"
 #include "bug-772.h"
-#include "loopback.h"
 
 #include "ns3/simulator.h"
 #include "ns3/mobility-helper.h"
@@ -32,19 +31,18 @@
 #include "ns3/internet-stack-helper.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/abort.h"
-#include "ns3/udp-echo-helper.h"
 #include "ns3/mobility-model.h"
 #include "ns3/pcap-file.h"
 #include "ns3/aodv-helper.h"
-#include "ns3/v4ping-helper.h"
 #include "ns3/nqos-wifi-mac-helper.h"
 #include "ns3/config.h"
 #include "ns3/pcap-test.h"
 #include "ns3/rng-seed-manager.h"
+#include "ns3/icmpv4.h"
 #include <sstream>
 
 using namespace ns3;
-using namespace aodv;
+
 //-----------------------------------------------------------------------------
 // Test suite
 //-----------------------------------------------------------------------------
@@ -56,17 +54,12 @@
     SetDataDir (NS_TEST_SOURCEDIR);
     // General RREQ-RREP-RRER test case
     AddTestCase (new ChainRegressionTest ("aodv-chain-regression-test"), TestCase::QUICK);
-    /// \internal
-    /// \bugid{606} test case, should crash if bug is not fixed
+    // \bugid{606} test case, should crash if bug is not fixed
     AddTestCase (new ChainRegressionTest ("bug-606-test", Seconds (10), 3, Seconds (1)), TestCase::QUICK);
-    /// \internal
-    /// \bugid{772} UDP test case
+    // \bugid{772} UDP test case
     AddTestCase (new Bug772ChainTest ("udp-chain-test", "ns3::UdpSocketFactory", Seconds (3), 10), TestCase::QUICK);
-    /// \internal
-    /// \bugid{772} TCP test case
+    // \bugid{772} TCP test case
     AddTestCase (new Bug772ChainTest ("tcp-chain-test", "ns3::TcpSocketFactory", Seconds (3), 10), TestCase::QUICK);
-    // Ping loopback test case
-    AddTestCase (new LoopbackTestCase (), TestCase::QUICK);
   }
 } g_aodvRegressionTestSuite;
  
@@ -81,7 +74,8 @@
   m_time (t),
   m_size (size),
   m_step (120),
-  m_arpAliveTimeout (arpAliveTimeout)
+  m_arpAliveTimeout (arpAliveTimeout),
+  m_seq (0)
 {
 }
 
@@ -91,6 +85,35 @@
 }
 
 void
+ChainRegressionTest::SendPing ()
+{
+  if (Simulator::Now () >= m_time)
+    {
+      return;
+    }
+
+  Ptr<Packet> p = Create<Packet> ();
+  Icmpv4Echo echo;
+  echo.SetSequenceNumber (m_seq);
+  m_seq++;
+  echo.SetIdentifier (0);
+
+  Ptr<Packet> dataPacket = Create<Packet> (56);
+  echo.SetData (dataPacket);
+  p->AddHeader (echo);
+  Icmpv4Header header;
+  header.SetType (Icmpv4Header::ECHO);
+  header.SetCode (0);
+  if (Node::ChecksumEnabled ())
+    {
+      header.EnableChecksum ();
+    }
+  p->AddHeader (header);
+  m_socket->Send (p, 0);
+  Simulator::Schedule (Seconds (1), &ChainRegressionTest::SendPing, this);
+}
+
+void
 ChainRegressionTest::DoRun ()
 {
   RngSeedManager::SetSeed (12345);
@@ -173,11 +196,14 @@
   Ipv4InterfaceContainer interfaces = address.Assign (devices);
 
   // 3. Setup ping
-  V4PingHelper ping (interfaces.GetAddress (m_size - 1));
-  ping.SetAttribute ("Verbose", BooleanValue (false)); // don't need verbose ping in regression test
-  ApplicationContainer p = ping.Install (m_nodes->Get (0));
-  p.Start (Seconds (0));
-  p.Stop (m_time);
+  m_socket = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName ("ns3::Ipv4RawSocketFactory"));
+  m_socket->SetAttribute ("Protocol", UintegerValue (1)); // icmp
+  InetSocketAddress src = InetSocketAddress (Ipv4Address::GetAny (), 0);
+  m_socket->Bind (src);
+  InetSocketAddress dst = InetSocketAddress (interfaces.GetAddress (m_size - 1), 0);
+  m_socket->Connect (dst);
+
+  SendPing ();
 
   // 4. write PCAP
   wifiPhy.EnablePcapAll (CreateTempDirFilename (m_prefix));
diff -Naur ns-3.23/src/aodv/test/aodv-regression.h ns-3.24/src/aodv/test/aodv-regression.h
--- ns-3.23/src/aodv/test/aodv-regression.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/test/aodv-regression.h	2015-09-15 11:18:44.000000000 -0700
@@ -23,6 +23,7 @@
 
 #include "ns3/test.h"
 #include "ns3/nstime.h"
+#include "ns3/socket.h"
 #include "ns3/node-container.h"
 
 using namespace ns3;
@@ -177,6 +178,10 @@
   const double m_step;
   /// ARP alive timeout
   const Time m_arpAliveTimeout;
+  /// Socket
+  Ptr<Socket> m_socket;
+  /// Sequence number
+  uint16_t m_seq;
 
   /// Create test topology
   void CreateNodes ();
@@ -186,6 +191,8 @@
   void CheckResults ();
   /// Go
   void DoRun ();
+  /// Send one ping
+  void SendPing ();
 };
 
 #endif /* AODV_REGRESSION_H */
diff -Naur ns-3.23/src/aodv/test/bug-772.cc ns-3.24/src/aodv/test/bug-772.cc
--- ns-3.23/src/aodv/test/bug-772.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/test/bug-772.cc	2015-09-15 11:18:44.000000000 -0700
@@ -33,17 +33,14 @@
 #include "ns3/internet-stack-helper.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/abort.h"
-#include "ns3/udp-echo-helper.h"
 #include "ns3/mobility-model.h"
 #include "ns3/pcap-file.h"
 #include "ns3/aodv-helper.h"
 #include "ns3/v4ping-helper.h"
 #include "ns3/nqos-wifi-mac-helper.h"
 #include "ns3/config.h"
-#include "ns3/on-off-helper.h"
 #include "ns3/inet-socket-address.h"
 #include "ns3/data-rate.h"
-#include "ns3/packet-sink-helper.h"
 #include "ns3/pcap-test.h"
 #include <sstream>
 
@@ -59,8 +56,8 @@
   m_proto (proto),
   m_time (t),
   m_size (size),
-  m_step (120)
-{
+  m_step (120),
+  m_port (9){
 }
 
 Bug772ChainTest::~Bug772ChainTest ()
@@ -69,6 +66,17 @@
 }
 
 void
+Bug772ChainTest::SendData (Ptr<Socket> socket)
+{
+  if (Simulator::Now () < m_time)
+    {
+      socket->Send (Create<Packet> (1000));
+      Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0.125),
+                                      &Bug772ChainTest::SendData, this, socket);
+    }
+}
+
+void
 Bug772ChainTest::DoRun ()
 {
   RngSeedManager::SetSeed (12345);
@@ -144,16 +152,17 @@
   Ipv4InterfaceContainer interfaces = address.Assign (devices);
 
   // 3. Setup UDP source and sink
-  uint16_t port = 9; // Discard port (RFC 863)
-  OnOffHelper onoff (m_proto, Address (InetSocketAddress (interfaces.GetAddress (m_size-1), port)));
-  onoff.SetConstantRate (DataRate (64000));
-  onoff.SetAttribute ("PacketSize", UintegerValue (1000));
-  ApplicationContainer app = onoff.Install (m_nodes->Get (0));
-  app.Start (Seconds (1.0));
-  app.Stop (m_time);
-  PacketSinkHelper sink (m_proto, Address (InetSocketAddress (Ipv4Address::GetAny (), port)));
-  app = sink.Install (m_nodes->Get (m_size - 1));
-  app.Start (Seconds (0.0));
+  m_sendSocket = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName (m_proto));
+  m_sendSocket->Bind ();
+  m_sendSocket->Connect (InetSocketAddress (interfaces.GetAddress (m_size-1), m_port));
+  m_sendSocket->SetAllowBroadcast (true);
+  Simulator::ScheduleWithContext (m_sendSocket->GetNode ()->GetId (), Seconds (1.0),
+                                  &Bug772ChainTest::SendData, this, m_sendSocket);
+
+  m_recvSocket = Socket::CreateSocket (m_nodes->Get (m_size - 1), TypeId::LookupByName (m_proto));
+  m_recvSocket->Bind (InetSocketAddress (Ipv4Address::GetAny (), m_port));
+  m_recvSocket->Listen ();
+  m_recvSocket->ShutdownSend ();
 
   // 4. write PCAP on the first and last nodes only
   wifiPhy.EnablePcap (CreateTempDirFilename (m_prefix), devices.Get (0));
diff -Naur ns-3.23/src/aodv/test/bug-772.h ns-3.24/src/aodv/test/bug-772.h
--- ns-3.23/src/aodv/test/bug-772.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/test/bug-772.h	2015-09-15 11:18:44.000000000 -0700
@@ -24,6 +24,7 @@
 #include "ns3/test.h"
 #include "ns3/nstime.h"
 #include "ns3/node-container.h"
+#include "ns3/socket.h"
 
 using namespace ns3;
 
@@ -62,6 +63,8 @@
   const uint32_t m_size;
   /// Chain step, meters
   const double m_step;
+  /// port number
+  const uint16_t m_port;
 
   /// Create test topology
   void CreateNodes ();
@@ -71,6 +74,17 @@
   void CheckResults ();
   /// Go
   void DoRun ();
+
+  /// Receiving socket
+  Ptr<Socket> m_recvSocket;
+  /// Transmitting socket
+  Ptr<Socket> m_sendSocket;
+
+  /**
+   * Send data
+   * \param socket the sending socket
+   */
+  void SendData (Ptr<Socket> socket);
 };
 
 #endif /* BUG_772_H */
diff -Naur ns-3.23/src/aodv/test/loopback.cc ns-3.24/src/aodv/test/loopback.cc
--- ns-3.23/src/aodv/test/loopback.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/test/loopback.cc	2015-09-15 11:18:44.000000000 -0700
@@ -18,8 +18,10 @@
  * Authors: Pavel Boyko <boyko@iitp.ru>
  */
 
-#include "loopback.h"
+#include "ns3/test.h"
 #include "ns3/simulator.h"
+#include "ns3/socket-factory.h"
+#include "ns3/udp-socket-factory.h"
 #include "ns3/mobility-helper.h"
 #include "ns3/double.h"
 #include "ns3/uinteger.h"
@@ -45,12 +47,66 @@
 namespace aodv
 {
 
-static uint32_t g_count (0);
+/**
+ * \ingroup aodv
+ *
+ * \brief AODV loopback UDP echo test case
+ */
+class LoopbackTestCase : public TestCase
+{
+  uint32_t m_count; //!< number of packet received;
+  Ptr<Socket> m_txSocket;
+  Ptr<Socket> m_echoSocket;
+  Ptr<Socket> m_rxSocket;
+  uint16_t m_echoSendPort;
+  uint16_t m_echoReplyPort;
+
+  void SendData (Ptr<Socket> socket);
+  void ReceivePkt (Ptr<Socket> socket);
+  void EchoData (Ptr<Socket> socket);
+
+public:
+  LoopbackTestCase ();
+  void DoRun ();
+};
 
-static void 
-PingRtt (std::string context, Time rtt)
+LoopbackTestCase::LoopbackTestCase () :
+    TestCase ("UDP Echo 127.0.0.1 test"), m_count (0)
 {
-  g_count++;
+  m_echoSendPort = 1233;
+  m_echoReplyPort = 1234;
+}
+
+void LoopbackTestCase::ReceivePkt (Ptr<Socket> socket)
+{
+  Ptr<Packet> receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
+
+  m_count ++;
+}
+
+void
+LoopbackTestCase::EchoData (Ptr<Socket> socket)
+{
+  Address from;
+  Ptr<Packet> receivedPacket = socket->RecvFrom (std::numeric_limits<uint32_t>::max (), 0, from);
+
+  Ipv4Address src = InetSocketAddress::ConvertFrom (from).GetIpv4 ();
+  Address to = InetSocketAddress (src, m_echoReplyPort);
+
+  receivedPacket->RemoveAllPacketTags ();
+  receivedPacket->RemoveAllByteTags ();
+
+  socket->SendTo (receivedPacket, 0, to);
+}
+
+void
+LoopbackTestCase::SendData (Ptr<Socket> socket)
+{
+  Address realTo = InetSocketAddress (Ipv4Address::GetLoopback (), m_echoSendPort);
+  socket->SendTo (Create<Packet> (123), 0, realTo);
+
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (1.0),
+                                  &LoopbackTestCase::SendData, this, socket);
 }
 
 void
@@ -80,23 +136,49 @@
   address.SetBase ("10.1.1.0", "255.255.255.0");
   Ipv4InterfaceContainer interfaces = address.Assign (devices);
 
-  // Setup ping
-  Ptr<V4Ping> ping = CreateObject<V4Ping> ();
-  ping->SetAttribute ("Remote", Ipv4AddressValue (Ipv4Address::GetLoopback ()));
-  nodes.Get (0)->AddApplication (ping);
-  ping->SetStartTime (Seconds (0));
-  ping->SetStopTime (Seconds (4));
-  Names::Add ("ping", ping);
-  Config::Connect ("/Names/ping/Rtt", MakeCallback (&PingRtt));
+  // Setup echos
+  Ptr<SocketFactory> socketFactory = nodes.Get (0)->GetObject<UdpSocketFactory> ();
+  m_rxSocket = socketFactory->CreateSocket ();
+  m_rxSocket->Bind (InetSocketAddress (Ipv4Address::GetLoopback (), m_echoReplyPort));
+  m_rxSocket->SetRecvCallback (MakeCallback (&LoopbackTestCase::ReceivePkt, this));
+
+  m_echoSocket = socketFactory->CreateSocket ();
+  m_echoSocket->Bind (InetSocketAddress (Ipv4Address::GetLoopback (), m_echoSendPort));
+  m_echoSocket->SetRecvCallback (MakeCallback (&LoopbackTestCase::EchoData, this));
+
+  m_txSocket = socketFactory->CreateSocket ();
+
+  Simulator::ScheduleWithContext (m_txSocket->GetNode ()->GetId (), Seconds (1.0),
+                                  &LoopbackTestCase::SendData, this, m_txSocket);
 
   // Run 
   Simulator::Stop (Seconds (5));
   Simulator::Run ();
+
+  m_txSocket->Close ();
+  m_echoSocket->Close ();
+  m_rxSocket->Close ();
+
   Simulator::Destroy ();
 
   // Check that 4 packets delivered
-  NS_TEST_ASSERT_MSG_EQ (g_count, 4, "Exactly 4 ping replies must be delivered.");
+  NS_TEST_ASSERT_MSG_EQ (m_count, 4, "Exactly 4 echo replies must be delivered.");
 }
 
+//-----------------------------------------------------------------------------
+// Test suite
+//-----------------------------------------------------------------------------
+class AodvLoopbackTestSuite : public TestSuite
+{
+public:
+  AodvLoopbackTestSuite () : TestSuite ("routing-aodv-loopback", SYSTEM)
+  {
+    SetDataDir (NS_TEST_SOURCEDIR);
+    // UDP Echo loopback test case
+    AddTestCase (new LoopbackTestCase (), TestCase::QUICK);
+  }
+} g_aodvLoopbackTestSuite;
+
+
 }
 }
diff -Naur ns-3.23/src/aodv/test/loopback.h ns-3.24/src/aodv/test/loopback.h
--- ns-3.23/src/aodv/test/loopback.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/test/loopback.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,45 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 IITP RAS
- *
- * 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: Pavel Boyko <boyko@iitp.ru>
- */
-
-#ifndef AODV_LOOPBACK_H
-#define AODV_LOOPBACK_H
-#include "ns3/test.h"
-#include <string>
-
-namespace ns3
-{
-namespace aodv
-{
-/**
- * \ingroup aodv
- * 
- * \brief AODV ping 127.0.0.1 test case
- */
-struct LoopbackTestCase : public TestCase
-{
-  LoopbackTestCase () : TestCase ("Ping 127.0.0.1 test") {}
-  /// Run test
-  void DoRun ();
-};
-
-}
-}
-
-#endif /* AODV_LOOPBACK_H */
diff -Naur ns-3.23/src/aodv/test/tcp-chain-test-0-0.pcap ns-3.24/src/aodv/test/tcp-chain-test-0-0.pcap
--- ns-3.23/src/aodv/test/tcp-chain-test-0-0.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/test/tcp-chain-test-0-0.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,259 +1,501 @@
-ò            i       .  T   T                     E  0      
+ò            i         T   T                     E  0      
 
       
-    
-          H T   T                     E  0      
-
-      
-    
-             X   X                    E  4     
+   
+          X  X   X                    E  4     
 
     (     
 
     
-          `   X   X                    E  4     
+           3  X   X                     E  4      
 
     (    
 
     
-           @   @   <                             
+           z @   @   <                            
      
-              Ԁ               @   @               0            
+        	       Ԁ                @   @                            
 
-       4 @   @   <                             
+         @   @   <                             
      
-              Ԁ               T   T   <                @     E  0      
+               Ԁ               d T   T   <                0     E  0      
 
      
 
     
-         !       Ԁ              o @   @               0            
+          t       Ԁ                @   @               0            
 
-        @   @   <                P            
+        L @   @   <                @            
      
-              Ԁ               \   \   <                @     E  8    @  
+        \       Ԁ                \   \   <                @     E  8    @  
 
 
  	             
-                       Ԁ              ' @   @               `            
+                   {        Ԁ               ( @   @               P            
 
-       (       Ԁ              ) \   \   <                p     E  8    ?  
+        N)       Ԁ               ^* \   \   <                `     E  8    ?  
 
 
  	             
-                	       Ԁ               \   \   <                     E  8    8  
+                          Ԁ               Z \   \   <                p     E  8    8  
 
 
  	            
-  J            Ϟ       Ԁ               X   X   <                P     E  4   @  
+   b               j       Ԁ                X   X   <                P     E  4   @  
 
 
  	           
-  R  J                Ԁ              Ҡ X   X   <                     E  4   ?  
+   j   b                 Ԁ               I X   X   <                     E  4   ?  
 
 
  	           
-  R  J         H p  p  <                `     E L   @  
+   j   b             p  p  <                `     E L   @  
 
 
  	           
-  e  J                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              V p  p  <                     E L   ?  
+     b                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Ԁ                p  p  <                     E L   ?  
 
 
  	           
-  e  J                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 '       Ԁ               X   X   <                     E  4   8  
+     b                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 X  T   T               p     E  0     
+
+      
+   
+         )        Ԁ              )  X   X   <                     E  4   8  
 
 
  	     z    
-  m  e                Ԁ              7 (  (  <                p     E    @  
+             )        Ԁ              .*  (  (  <                     E    @  
 
 
  	          
-  o  m                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         l       Ԁ               (  (  <                     E    ?  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             c-        Ԁ              0  (  (  <                     E    ?  
 
 
  	          
-  o  m                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          p  p  <                     E L   @  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ;  T   T                    E  0     
+
+      
+    
+         p @   @                           
+
+       r @   @   <                            
+     
+              Ԁ              W p  p  <                     E L   @  
 
 
  	          
-    m                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 $       Ԁ               p  p  <                     E L   ?  
+  e                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          Ԁ              `0 @   @                           
+
+       /1       Ԁ              4 p  p  <                     E L   ?  
 
 
  	          
-    m                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              E X   X   <                     E  4   8  
+  e                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    @   @   <                            
+     
+              Ԁ              o @   @                          
+
+        @   @   <                            
+     
+       >       Ԁ               X   X   <                     E  4   8  
 
 
- 	     z    
-             U       Ԁ               (  (  <                     E    @  
+ 	     ~    
+    e         	       Ԁ              { p  p  <                     E L   @  
 
 
  	          
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    Ԁ               (  (  <                     E    ?  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            Ԁ               p  p  <                0    E L   ?  
 
 
  	          
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ظ p  p  <                     E L   @  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      p  p  <                     E L   @  
 
 
- 	          
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   l       Ԁ               (  (  <                     E    @  
+ 	          
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      p  p  <                     E L   @  
 
 
- 	  	        
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           b (  (  <                     E    @  
+ 	          
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            Ԁ               p  p  <                @    E L   ?  
 
 
- 	  	        
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ               p  p  <                     E L   ?  
+ 	          
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          <                     E    @  
 
 
- 	          
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    (  (  <                    E    ?  
+ 	  
+1        
+                                                                                                                                                                                                                                                                                                                                                                                                                     d       Ԁ              @     <                P    E    ?  
 
 
- 	  	        
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           % (  (  <                    E    ?  
+ 	  
+1        
+                                                                                                                                                                                                                                                                                                                                                                                                                     8     <                P    E    ?  
 
 
- 	  	        
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            (  (  <                    E    ?  
+ 	  
+1        
+                                                                                                                                                                                                                                                                                                                                                                                                                            Ԁ              j X   X   <                `    E  4   8  
+
+
+ 	     
+1}t    
+             z       Ԁ              ظ p  p  <                     E L   @  
 
 
- 	  	        
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            (  (  <                    E    ?  
+ 	          
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   l       Ԁ               p  p  <                p    E L   ?  
 
 
- 	  	        
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           ; (  (  <                    E    ?  
+ 	          
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   V (  (  <                     E  	  @  
 
 
- 	  	        
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   Ԁ               X   X   <                     E  4   8  
+ 	          
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           x (  (  <                     E  	  @  
+
+
+ 	          
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ               (  (  <                    E  	  ?  
+
+
+ 	          
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ               X   X   <                    E  4   8  
 
 
- 	     	z    
-  r  _                Ԁ              | T   T   <                0    E  0     
-
-     
-    
+ 	     р|    
+  g  _                Ԁ                p  p  <                    E L 
+  @  
+
 
-                  Ԁ               X   X                    E  4     
+ 	          
+    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              . p  p  <                    E L 
+  ?  
 
-          
 
-    
-           X   X               @    E  4     
-
-         
+ 	          
+    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Ԩ (  (  <                     E    @  
+
 
-    
-          ߮       Ԁ              ȯ T   T   <                P    E  0     
-
-     
+ 	          
+    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          (  (  <                     E    @  
+
 
-    
-  L       د       Ԁ              & p  p  <                     E L   @  
+ 	          
+    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ѯ       Ԁ               (  (  <                    E    ?  
 
 
- 	          
-    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              P p  p  <                `    E L   ?  
+ 	          
+    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ               X   X   <                    E  4   8  
+
+
+ 	     {    
+                    Ԁ              h	 p  p  <                0    E L   @  
 
 
- 	          
-    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ;       Ԁ               X   X   <                p    E  4   8  
+ 	          
+  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   	       Ԁ              v	 p  p  <                    E L   ?  
+
+
+ 	          
+  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   [	 (  (  <                @    E    @  
+
+
+ 	          
+  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           	 (  (  <                @    E    @  
+
+
+ 	          
+  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           ߘ	       Ԁ              	 (  (  <                    E    ?  
+
+
+ 	          
+  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           >	       Ԁ              	 X   X   <                    E  4   8  
 
 
- 	     	z    
-                    Ԁ              h	 p  p  <                     E L 
-  @  
+ 	     z    
+  a  Y          	       Ԁ              q p  p  <                P    E L   @  
 
 
- 	          
-  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   	       Ԁ              v	 p  p  <                    E L 
-  ?  
+ 	  q        
+    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Du       Ԁ              x p  p  <                     E L   ?  
 
 
- 	          
-  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   >	       Ԁ              	 X   X   <                    E  4   8  
+ 	  q        
+    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Ry (  (  <                `    E    @  
+
+
+ 	          
+    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | (  (  <                `    E    @  
+
+
+ 	          
+    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ              r (  (  <                    E    ?  
+
+
+ 	          
+    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         D       Ԁ               X   X   <                     E  4   8  
 
 
- 	     	~    
-  a  Y          	       Ԁ              0 @   @                           
-
-       1 @   @   <                           
-     
-       1       Ԁ              L2 p  p  <                     E L   @  
+ 	     y    
+                    Ԁ              Y p  p  <                p    E L   @  
 
 
- 	  	        
-  	\  a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 5       Ԁ              UU @   @                          
-
-       $V       Ԁ              Y p  p  <                    E L   ?  
+ 	  Y        
+  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   ]       Ԁ              a p  p  <                0    E L   ?  
+
+
+ 	  Y        
+  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   a (  (  <                    E    @  
+
+
+ 	  q        
+  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           e (  (  <                    E    @  
+
+
+ 	  q        
+  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           h       Ԁ              l (  (  <                @    E    ?  
+
+
+ 	  q        
+  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           L       Ԁ               X   X   <                P    E  4   8  
+
+
+ 	     qx    
+  [  S                Ԁ                  p  p  <                    E L   @  
+
+
+ 	  A        
+    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Ԁ                p  p  <                `    E L   ?  
+
+
+ 	  A        
+    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   (  (  <                    E    @  
 
 
- 	  	        
-  	\  a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  T   T                   E  0     
+ 	  !Y        
+    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           (  (  <                    E    @  
+
+
+ 	  !Y        
+    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Ԁ              
+  (  (  <                p    E    ?  
+
+
+ 	  !Y        
+    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         X  T   T                   E  0     
 
       
-   
-         ` T   T                   E  0     
+   
+         ,  T   T                   E  0     
 
       
     
-          @   @   <                           
+         >        Ԁ              >  X   X   <                    E  4 	  8  
+
+
+ 	     !Yw    
+             >        Ԁ              H p  p  <                    E L   @  
+
+
+ 	  #)        
+  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          Ԁ              V p  p  <                    E L   ?  
+
+
+ 	  #)        
+  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    (  (  <                    E    @  
+
+
+ 	  %A        
+  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            (  (  <                    E    @  
+
+
+ 	  %A        
+  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           A       Ԁ              [ (  (  <                    E    ?  
+
+
+ 	  %A        
+  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           #       Ԁ              $ X   X   <                    E  4 
+  8  
+
+
+ 	     %Av    
+  U  M         $       Ԁ               @   @                          
+
+        @   @   <                           
+     
+              Ԁ              l p  p  <                    E L   @  
+
+
+ 	  '        
+    U                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ               (  (  <                     E    @  
+
+
+ 	  ))        
+    U                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ               @   @                          
+
+              Ԁ              !	 p  p  <                    E L   ?  
+
+
+ 	  '        
+    U                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  (  (  <                     E    ?  
+
+
+ 	  ))        
+    U                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         s @   @   <                           
      
-       U       Ԁ              ) @   @                          
+       Qu       Ԁ               @   @                           
 
-       K @   @   <                            
+       / @   @   <                           
      
-              Ԁ               X   X   <                     E  4   8  
+       ܉       Ԁ               X   X   <                0    E  4   8  
 
 
- 	     р~    
-  	  	\                Ԁ              P p  p  <                0    E L   @  
+ 	     ))u    
+  		                  Ԁ              ظ p  p  <                     E L   @  
 
 
- 	          
-  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              4 p  p  <                @    E L   @  
+ 	  *        
+  	G  		                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 l       Ԁ               p  p  <                @    E L   ?  
 
 
- 	          
-  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              y p  p  <                    E L   ?  
+ 	  *        
+  	G  		                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  (  (  <                0    E    @  
 
 
- 	          
-  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  p  p  <                     E L   ?  
+ 	  -        
+  	G  		                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          (  (  <                0    E    @  
+
+
+ 	  -        
+  	G  		                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ               (  (  <                P    E    ?  
 
 
- 	          
-  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 T       Ԁ              V X   X   <                0    E  4   8  
+ 	  -        
+  	G  		                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ               X   X   <                `    E  4   8  
 
 
- 	         
-  	  	         V       Ԁ              V p  p  <                P    E L   @  
+ 	     -t    
+  	O  	G                Ԁ                p  p  <                @    E L   @  
 
 
- 	          
-  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Z       Ԁ              [ L   L   <                @    E  (     
-
-     
+ 	  .        
+  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              . p  p  <                p    E L   ?  
+
 
-           [       Ԁ              \ p  p  <                `    E L   @  
+ 	  .        
+  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
+ (  (  <                P    E    @  
 
 
- 	          
-  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 _       Ԁ              ` T   T   <                P    E  0     
-
-     
-    
+ 	  0        
+  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          (  (  <                P    E    @  
+
 
-           `       Ԁ              a L   L   <                `    E  (     
-
-     
+ 	  0        
+  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         گ       Ԁ               (  (  <                    E    ?  
+
 
-           a       Ԁ              q       Ԁ               L   L   <                p    E  (     
-
-     
+ 	  0        
+  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ               X   X   <                    E  4   8  
+
+
+ 	     0s    
+  	  	                Ԁ              h	 p  p  <                `    E L   @  
+
+
+ 	  2        
+  
+A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 	       Ԁ              v	 p  p  <                    E L   ?  
+
+
+ 	  2        
+  
+A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 I	 (  (  <                p    E    @  
+
+
+ 	  4        
+  
+A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ɔ	 (  (  <                p    E    @  
+
+
+ 	  4        
+  
+A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         	       Ԁ              N	 (  (  <                    E    ?  
+
+
+ 	  4        
+  
+A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         B	       Ԁ              	 X   X   <                    E  4   8  
+
+
+ 	     4r    
+  
+I  
+A         	       Ԁ              q p  p  <                    E L   @  
+
+
+ 	  6        
+  
+  
+I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Du       Ԁ              x p  p  <                    E L   ?  
+
+
+ 	  6        
+  
+  
+I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 vy (  (  <                    E    @  
+
+
+ 	  8        
+  
+  
+I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | (  (  <                    E    @  
+
+
+ 	  8        
+  
+  
+I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         4       Ԁ              N (  (  <                    E    ?  
+
 
-           .       Ԁ           
\ No newline at end of file
+ 	  8        
+  
+  
+I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         `       Ԁ               X   X   <                    E  4   8  
+
+
+ 	     8ɀq    
+  
+  
+         "       Ԁ              Y p  p  <                    E L    @  
+
+
+ 	  :        
+  ;  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ]       Ԁ              ] (  (  <                    E  !  @  
+
+
+ 	  <        
+  ;  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         	b (  (  <                    E  !  @  
+
+
+ 	  <        
+  ;  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         g (  (  <                    E  !  @  
+
+
+ 	  <        
+  ;  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         j       Ԁ              m (  (  <                    E  !  ?  
+
+
+ 	  <        
+  ;  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ              \ X   X   <                     E  4   8  
+
+
+ 	     <p    
+  C  ;         l       Ԁ           
\ No newline at end of file
diff -Naur ns-3.23/src/aodv/test/tcp-chain-test-9-0.pcap ns-3.24/src/aodv/test/tcp-chain-test-9-0.pcap
--- ns-3.23/src/aodv/test/tcp-chain-test-9-0.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/test/tcp-chain-test-9-0.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -5,189 +5,417 @@
 
     
 
-            T   T                     E  0      
-	
-      
-	    
-	         (  T   T                    E  0     
-
-
-      
-
-    
-
-           @   @                           
+            @   @                            
 	
 
-       	  @   @   <                             
+        	  @   @   <                            
 
      
-	               Ԁ              `  T   T   <                      E  0      
+	                Ԁ                 T   T   <                     E  0      
 	
 
      
    
 
-  _       p        Ԁ              e  @   @               0            
+  _                Ԁ               e  @   @                            
 	
-       4        Ԁ              &  T   T   <                @     E  0      
+        4        Ԁ               8  T   T   <                0     E  0      
 	
    @ 
 
     
-         H  T   T               P     E  0     
+            T   T               @     E  0      
 	
       
 	    
-	           @   @   <                `            
+	            @   @   <                P            
 	     
-               Ԁ              Հ       Ԁ               \   \   <                p     E  8    8  
+                Ԁ               L       Ԁ                \   \   <                `     E  8    8  
 
 
  	             
-                       Ԁ               @   @               0            
+                          Ԁ                @   @                            
 
 
-	        @   @   <                            
+	         @   @   <                p            
 	     
 
-       %       Ԁ              s \   \   <                @     E  8    @  
+               Ԁ               2 \   \   <                0     E  8    @  
 
 
  	            
-  J            D       Ԁ               \   \   <                     E  8    ?  
+   b                      Ԁ                \   \   <                     E  8    ?  
 
 
  	            
-  J                   Ԁ              W X   X   <                     E  4   8  
+   b                      Ԁ               Χ X   X   <                     E  4   8  
 
 
  	           
-  R  J         g       Ԁ                     Ԁ              S	 p  p  <                     E L   8  
+   j   b          ާ       Ԁ                      Ԁ              !  p  p  <                     E L   8  
 
 
  	           
-  e  J                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 c	       Ԁ              	 X   X   <                P     E  4   @  
+     b                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 !        Ԁ              i!  X   X   <                @     E  4   @  
 
 
  	     z    
-  m  e         ~
-       Ԁ              T X   X   <                     E  4   ?  
+             6"        Ԁ              K#  X   X   <                     E  4   ?  
 
 
  	     z    
-  m  e         ,       Ԁ              0 (  (  <                     E    8  
+             D        Ԁ              H  (  (  <                     E    8  
 
 
  	          
-  o  m                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         0       Ԁ              !       Ԁ               p  p  <                     E L   8  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             (H        Ԁ              (  T   T               P     E  0     
+
+
+      
+
+    
+
+         H  T   T                    E  0     
+	
+      
+	    
+	          @   @   <                            
+	     
+              Ԁ              ( @   @                           
+	
+
+       J @   @   <                `            
+
+     
+	              Ԁ               p  p  <                     E L   8  
 
 
  	          
-    m                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ               X   X   <                `     E  4   @  
+  e                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          Ԁ               @   @               p            
+
+
+	        @   @   <                           
+	     
+
+              Ԁ               X   X   <                     E  4   @  
 
 
- 	     z    
-                    Ԁ               X   X   <                     E  4   ?  
+ 	     ~    
+    e                Ԁ              8 @   @                           
+	
+       9       Ԁ              : X   X   <                0    E  4   ?  
 
 
- 	     z    
-             O       Ԁ              i (  (  <                     E    8  
+ 	     ~    
+    e                Ԁ               p  p  <                @    E L   8  
 
 
  	          
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             y       Ԁ              s       Ԁ               p  p  <                    E L   8  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            Ԁ              ^        Ԁ               p  p  <                P    E L   8  
 
 
- 	          
-  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          Ԁ              K X   X   <                p     E  4   @  
+ 	          
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            Ԁ              6 X   X   <                     E  4   @  
 
 
- 	     	z    
-  r  _                Ԁ              - X   X   <                     E  4   ?  
+ 	     
+1}t    
+                    Ԁ               X   X   <                `    E  4   ?  
 
 
- 	     	z    
-  r  _                Ԁ              R T   T   <                0    E  0     
-	
+ 	     
+1}t    
+             ' X   X   <                `    E  4   ?  
 
-     
-   
+
+ 	     
+1}t    
+              X   X   <                `    E  4   ?  
 
-  ?       b       Ԁ                     Ԁ              q p  p  <                @    E L   8  
+
+ 	     
+1}t    
+             X X   X   <                `    E  4   ?  
+
+
+ 	     
+1}t    
+                    Ԁ                   <                p    E    8  
+
+
+ 	  
+1        
+                                                                                                                                                                                                                                                                                                                                                                                                                            Ԁ              i       Ԁ               p  p  <                    E L   8  
 
 
  	          
-    r                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ               X   X   <                     E  4   @  
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          Ԁ              A X   X   <                     E  4   @  
 
 
- 	     	z    
-                    Ԁ              i X   X   <                P    E  4   ?  
+ 	     р|    
+  g  _                Ԁ               X   X   <                    E  4   ?  
 
 
- 	     	z    
-             	       Ԁ              s	 p  p  <                `    E L 
+ 	     р|    
+  g  _         \       Ԁ              v (  (  <                    E  	  8  
+
+
+ 	          
+  _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ                     Ԁ              + p  p  <                    E L 
   8  
 
 
  	          
-  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   	       Ԁ              Ѫ	 X   X   <                     E  4   @  
+    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ;       Ԁ               X   X   <                     E  4   @  
+
+
+ 	     {    
+             V       Ԁ              P X   X   <                    E  4   ?  
+
+
+ 	     {    
+             [       Ԁ              u (  (  <                    E    8  
+
+
+ 	          
+    g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ              	       Ԁ              s	 p  p  <                    E L   8  
+
+
+ 	          
+  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   	       Ԁ              Ѫ	 X   X   <                     E  4   @  
+
+
+ 	     z    
+  a  Y         	       Ԁ              	 X   X   <                    E  4   ?  
+
+
+ 	     z    
+  a  Y         	 X   X   <                    E  4   ?  
+
+
+ 	     z    
+  a  Y         r	       Ԁ              	 (  (  <                     E    8  
+
+
+ 	          
+  Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           	       Ԁ              A       Ԁ               p  p  <                    E L   8  
+
+
+ 	  q        
+    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ˒       Ԁ               X   X   <                     E  4   @  
+
+
+ 	     y    
+                    Ԁ              Δ X   X   <                     E  4   ?  
+
+
+ 	     y    
+             w       Ԁ              _ X   X   <                     E  4   ?  
+
+
+ 	     y    
+              (  (  <                0    E    8  
+
+
+ 	          
+    a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Ϟ       Ԁ              w       Ԁ              { p  p  <                @    E L   8  
+
+
+ 	  Y        
+  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   {       Ԁ              a{ X   X   <                     E  4   @  
+
+
+ 	     qx    
+  [  S         .|       Ԁ              } X   X   <                P    E  4   ?  
+
+
+ 	     qx    
+  [  S         ~ X   X   <                P    E  4   ?  
 
 
- 	     	~    
-  a  Y         	       Ԁ              k	 X   X   <                p    E  4   ?  
+ 	     qx    
+  [  S         n       Ԁ               (  (  <                `    E    8  
+
+
+ 	  q        
+  S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Ԁ                      Ԁ              !  p  p  <                p    E L   8  
+
+
+ 	  A        
+    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 !        Ԁ              i!  X   X   <                     E  4 	  @  
 
 
- 	     	~    
-  a  Y         @  T   T                    E  0     
+ 	     !Yw    
+             6"        Ԁ              ]#  X   X   <                    E  4 	  ?  
+
+
+ 	     !Yw    
+             a=        Ԁ              {@  (  (  <                    E    8  
+
+
+ 	  !Y        
+    [                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         @        Ԁ              @  T   T                    E  0     
 
 
       
 
     
 
-           T   T                   E  0     
+           T   T                   E  0     
 	
       
 	    
-	          @   @   <                           
+	                Ԁ              S	 p  p  <                    E L   8  
+
+
+ 	  #)        
+  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   c	       Ԁ              	 X   X   <                    E  4 
+  @  
+
+
+ 	     %Av    
+  U  M         ~
+       Ԁ               X   X   <                    E  4 
+  ?  
+
+
+ 	     %Av    
+  U  M         "       Ԁ              & (  (  <                    E    8  
+
+
+ 	  %A        
+  M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           &&       Ԁ               @   @   <                           
 	     
-       a       Ԁ               @   @                          
+       "       Ԁ                     Ԁ               @   @                          
 	
 
-        @   @   <                            
+         @   @   <                            
 
      
-	              Ԁ              A  p  p  <                    E L   8  
+	              Ԁ              n p  p  <                     E L   8  
 
 
- 	  	        
-  	\  a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Q        Ԁ              7 @   @                           
+ 	  '        
+    U                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ~       Ԁ               (  (  <                    E    8  
+
+
+ 	  ))        
+    U                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ               @   @               0           
 
 
-	       8 @   @   <                           
+	        @   @   <                            
 	     
 
-       8       Ԁ              Q9 X   X   <                     E  4   @  
+              Ԁ              Z X   X   <                @    E  4   @  
 
 
- 	     р~    
-  	  	\         :       Ԁ              z] @   @                          
+ 	     ))u    
+  		           '       Ԁ               @   @               0           
 	
-       I^       Ԁ              _ X   X   <                    E  4   ?  
+              Ԁ              = X   X   <                @    E  4   ?  
 
 
- 	     р~    
-  	  	\         >       Ԁ              ZL p  p  <                    E L   8  
+ 	     ))u    
+  		           i       Ԁ               p  p  <                P    E L   8  
 
 
- 	          
-  	  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 jL       Ԁ              L X   X   <                     E  4   @  
+ 	  *        
+  	G  		                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              A X   X   <                P    E  4   @  
 
 
- 	         
-  	  	         M       Ԁ              N X   X   <                     E  4   ?  
+ 	     -t    
+  	O  	G                Ԁ              # X   X   <                `    E  4   ?  
 
 
- 	         
-  	  	      
\ No newline at end of file
+ 	     -t    
+  	O  	G         `       Ԁ              z (  (  <                p    E    8  
+
+
+ 	  -        
+  	G  		                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Ԁ                     Ԁ              + p  p  <                    E L   8  
+
+
+ 	  .        
+  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ;       Ԁ               X   X   <                `    E  4   @  
+
+
+ 	     0s    
+  	  	         V       Ԁ              P X   X   <                    E  4   ?  
+
+
+ 	     0s    
+  	  	                Ԁ              5 (  (  <                    E    8  
+
+
+ 	  0        
+  	  	O                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         E       Ԁ              	       Ԁ              s	 p  p  <                    E L   8  
+
+
+ 	  2        
+  
+A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 	       Ԁ              Ѫ	 X   X   <                p    E  4   @  
+
+
+ 	     4r    
+  
+I  
+A         	       Ԁ              Ŭ	 X   X   <                    E  4   ?  
+
+
+ 	     4r    
+  
+I  
+A         	 X   X   <                    E  4   ?  
+
+
+ 	     4r    
+  
+I  
+A         d	       Ԁ              ~	 (  (  <                    E    8  
+
+
+ 	  4        
+  
+A  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         	       Ԁ              A       Ԁ               p  p  <                    E L   8  
+
+
+ 	  6        
+  
+  
+I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ˒       Ԁ               X   X   <                    E  4   @  
+
+
+ 	     8ɀq    
+  
+  
+                Ԁ               X   X   <                    E  4   ?  
+
+
+ 	     8ɀq    
+  
+  
+                Ԁ                (  (  <                     E    8  
+
+
+ 	  8        
+  
+  
+I                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         0       Ԁ              w       Ԁ              { p  p  <                    E L    8  
+
+
+ 	  :        
+  ;  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 {       Ԁ              a{ X   X   <                    E  4   @  
+
+
+ 	     <p    
+  C  ;         .|       Ԁ              | X   X   <                     E  4   ?  
+
+
+ 	     <p    
+  C  ;                Ԁ              ˊ (  (  <                0    E  !  8  
+
+
+ 	  <        
+  ;  
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ۊ       Ԁ           
\ No newline at end of file
diff -Naur ns-3.23/src/aodv/test/udp-chain-test-0-0.pcap ns-3.24/src/aodv/test/udp-chain-test-0-0.pcap
--- ns-3.23/src/aodv/test/udp-chain-test-0-0.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/test/udp-chain-test-0-0.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -8,221 +8,220 @@
 
       
     
-           T   T          	     	     E  0     
-
-      
-    
-         xP T   T          
-     
-     E  0     
-
-      
-    
-          X   X          	     	      E  4     
+             X   X          	     	     E  4     
 
     (     
 
     
-            X   X          
+          `   X   X          
      
-      E  4     
+     E  4     
 
     (    
 
     
-           @   @   <           
+           @   @   <           
      
-0            
+             
 
      
-              Ԁ               @   @          
+              Ԁ               @   @          
      
-@            
+0            
 
 
-        @   @   <      
-     	     	0            	
+       4 @   @   <      
+     	     	             	
      
 
-              Ԁ       	        T   T   <      	     
+              Ԁ       	        T   T   <      	     
      
-P     E  0      
+@     E  0      
 
      
 
     
-  C              Ԁ       
-        @   @          	     	@            	
+         !       Ԁ       
+       o @   @          	     	0            	
 
-       j @   @   <      	     
+        @   @   <      	     
      
-`            
+P            
 
      	
-       z       Ԁ       
-        (  (  <      
-     	     	P     E     @  
+              Ԁ       
+        (  (  <      
+     	     	@     E     @  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ       	        @   @          
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 $       Ԁ       	       , @   @          
      
-p            
+`            
 
 
-       |       Ԁ              T (  (  <           
+       -       Ԁ              3 (  (  <           
      
-     E     ?  
+p     E     ?  
+
+
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 H (  (  <      
+     	     	P     E    @  
+
+
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 (       Ԁ       	        (  (  <           
+     
+     E    ?  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  (  (  <      
-     	     	`     E    @  
+     	     	`     E    @  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 p       Ԁ       	       6 (  (  <           
      
-     E    ?  
+     E    ?  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ظ (  (  <      
-     	     	p     E    @  
+     	     	p     E    @  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ       	       ~ (  (  <           
      
-     E    ?  
+     E    ?  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   (  (  <      
-     	     	     E    @  
+     	     	     E    @  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Ԁ       	       Ƭ (  (  <           
      
-     E    ?  
+     E    ?  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 h	 (  (  <      
-     	     	     E    @  
+     	     	     E    @  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 H	       Ԁ       	       	 (  (  <           
      
-     E    ?  
+     E    ?  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 q (  (  <      
-     	     	     E    @  
+     	     	     E    @  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 w       Ԁ       	       V} (  (  <           
      
-     E    ?  
+     E    ?  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Y (  (  <      
-     	     	     E    @  
+     	     	     E    @  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 _       Ԁ       	       e (  (  <           
      
-     E    ?  
+     E    ?  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     (  (  <      
-     	     	     E    @  
+     	     	     E    @  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Ԁ       	         (  (  <           
      
-     E    ?  
+     E    ?  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 H (  (  <      
-     	     	     E    @  
-
-
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 (       Ԁ       	        (  (  <           
-     
-     E    ?  
-
-
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 g T   T          	     	     E  0     
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 (  T   T          	     	     E  0     
 
       
    
-          T   T          
+           T   T          
      
-    E  0     
+     E  0     
 
       
     
-          @   @          	     	            	
+         p @   @          	     	            	
 
-        @   @   <      	     
+       r @   @   <      	     
      
-            
+           
 
      	
-              Ԁ       
-        (  (  <      
-     	     	     E  	  @  
+              Ԁ       
+        (  (  <      
+     	     	     E  	  @  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 e       Ԁ       	        @   @          
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ       	       72 @   @          
      
-0           
+            
 
 
-              Ԁ              ! (  (  <           
+       3       Ԁ              8 (  (  <           
      
-@    E  	  ?  
+0    E  	  ?  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ظ (  (  <      
-     	     	    E  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  (  (  <      
+     	     	     E  
   @  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ       	       ~ (  (  <           
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 p       Ԁ       	       6 (  (  <           
      
-P    E  
+@    E  
   ?  
 
 
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ظ (  (  <      
+     	     	    E    @  
+
+
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ       	       ~ (  (  <           
+     
+P    E    ?  
+
+
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   (  (  <      
-     	     	     E    @  
+     	     	     E    @  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Ԁ       	       Ƭ (  (  <           
      
-`    E    ?  
+`    E    ?  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 h	 (  (  <      
-     	     	0    E    @  
+     	     	0    E    @  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 H	       Ԁ       	       	 (  (  <           
      
-p    E    ?  
+p    E    ?  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 q (  (  <      
-     	     	@    E    @  
+     	     	@    E    @  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 w       Ԁ       	       V} (  (  <           
      
-    E    ?  
+    E    ?  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 Y (  (  <      
-     	     	P    E    @  
+     	     	P    E    @  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 _       Ԁ       	       e (  (  <           
      
-    E    ?  
+    E    ?  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
\ No newline at end of file
diff -Naur ns-3.23/src/aodv/test/udp-chain-test-9-0.pcap ns-3.24/src/aodv/test/udp-chain-test-9-0.pcap
--- ns-3.23/src/aodv/test/udp-chain-test-9-0.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/test/udp-chain-test-9-0.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -16,53 +16,56 @@
 
     
 
-         H  T   T                    E  0     
-	
-      
-	    
-	         f @   @                            
+           @   @                           
 	
 
-       f @   @   <                             
+       	  @   @   <                             
 
      
-	       fg       Ԁ              jh T   T   <                0     E  0      
+	               Ԁ              `  T   T   <                      E  0      
 	
 
      
    
 
-  _       zh       Ԁ              v @   @               @            
+  _       p        Ԁ              e  @   @               0            
 	
-       v       Ԁ              w T   T   <                P     E  0      
+       4        Ԁ              &  T   T   <                @     E  0      
 	
    @ 
 
     
-  C        @   @   <                `            
+         H  T   T               P     E  0     
+	
+      
+	    
+	           @   @   <                `            
 	     
-       *       Ԁ              W       Ԁ              v] (  (  <                p     E     8  
+               Ԁ              U       Ԁ               (  (  <                p     E     8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ]       Ԁ                      Ԁ              G (  (  <                     E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 +       Ԁ              9       Ԁ               (  (  <                     E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 W       Ԁ                     Ԁ               (  (  <                     E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ                      Ԁ              G (  (  <                     E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ                     Ԁ               (  (  <                     E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 W       Ԁ                     Ԁ               (  (  <                     E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              Y	       Ԁ              	 (  (  <                     E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ                     Ԁ               (  (  <                     E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 /	       Ԁ                     Ԁ              g (  (  <                     E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              Y	       Ԁ              	 (  (  <                     E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 w       Ԁ                     Ԁ               (  (  <                     E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 /	       Ԁ                     Ԁ              g (  (  <                     E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              /        Ԁ              5  (  (  <                     E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 w       Ԁ                     Ԁ               (  (  <                     E    8  
+
+
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              /        Ԁ              5  (  (  <                     E    8  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 5        Ԁ              @  T   T               0     E  0     
@@ -72,39 +75,38 @@
 
     
 
-           T   T                    E  0     
+           T   T                    E  0     
 	
       
 	    
-	         9       Ԁ               (  (  <                     E    8  
-
-
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              w @   @   <                           
+	         E @   @   <                           
 	     
-              Ԁ              < @   @                           
+              Ԁ              %	 @   @                           
 	
 
-       ^ @   @   <                @            
+       G	 @   @   <                @            
 
      
-	       
-       Ԁ               (  (  <                0    E  	  8  
+	       	       Ԁ               (  (  <                0    E  	  8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ                     Ԁ               (  (  <                @    E  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ                      Ԁ              G (  (  <                @    E  
   8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ                     Ԁ               (  (  <                P    E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 W       Ԁ                     Ԁ               (  (  <                P    E    8  
+
+
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ                     Ԁ               (  (  <                `    E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              Y	       Ԁ              	 (  (  <                `    E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ              Y	       Ԁ              	 (  (  <                p    E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 /	       Ԁ                     Ԁ              g (  (  <                p    E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 /	       Ԁ                     Ԁ              g (  (  <                    E    8  
 
 
- 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 w       Ԁ                     Ԁ               (  (  <                    E    8  
+ 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 w       Ԁ                     Ԁ               (  (  <                    E    8  
 
 
  	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Ԁ           
\ No newline at end of file
diff -Naur ns-3.23/src/aodv/wscript ns-3.24/src/aodv/wscript
--- ns-3.23/src/aodv/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/aodv/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -1,7 +1,7 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 def build(bld):
-    module = bld.create_ns3_module('aodv', ['internet', 'wifi', 'applications'])
+    module = bld.create_ns3_module('aodv', ['internet', 'wifi'])
     module.includes = '.'
     module.source = [
         'model/aodv-id-cache.cc',
diff -Naur ns-3.23/src/applications/bindings/modulegen__gcc_ILP32.py ns-3.24/src/applications/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/applications/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/applications/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -110,6 +110,8 @@
     module.add_class('NodeContainer', import_from_module='ns.network')
     ## node-list.h (module 'network'): ns3::NodeList [class]
     module.add_class('NodeList', import_from_module='ns.network')
+    ## 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]
@@ -155,7 +157,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## ping6-helper.h (module 'applications'): ns3::Ping6Helper [class]
@@ -234,6 +236,16 @@
     module.add_enum('', ['FRAME_FLAG_NONE', 'FRAME_FLAG_CFP', 'FRAME_FLAG_SHORT_PREAMBLE', 'FRAME_FLAG_WEP', 'FRAME_FLAG_FRAGMENTED', 'FRAME_FLAG_FCS_INCLUDED', 'FRAME_FLAG_DATA_PADDING', 'FRAME_FLAG_BAD_FCS', 'FRAME_FLAG_SHORT_GUARD'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
     ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
     module.add_enum('', ['CHANNEL_FLAG_NONE', 'CHANNEL_FLAG_TURBO', 'CHANNEL_FLAG_CCK', 'CHANNEL_FLAG_OFDM', 'CHANNEL_FLAG_SPECTRUM_2GHZ', 'CHANNEL_FLAG_SPECTRUM_5GHZ', 'CHANNEL_FLAG_PASSIVE', 'CHANNEL_FLAG_DYNAMIC', 'CHANNEL_FLAG_GFSK'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['MCS_KNOWN_NONE', 'MCS_KNOWN_BANDWIDTH', 'MCS_KNOWN_INDEX', 'MCS_KNOWN_GUARD_INTERVAL', 'MCS_KNOWN_HT_FORMAT', 'MCS_KNOWN_FEC_TYPE', 'MCS_KNOWN_STBC', 'MCS_KNOWN_NESS', 'MCS_KNOWN_NESS_BIT_1'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['MCS_FLAGS_NONE', 'MCS_FLAGS_BANDWIDTH_40', 'MCS_FLAGS_BANDWIDTH_20L', 'MCS_FLAGS_BANDWIDTH_20U', 'MCS_FLAGS_GUARD_INTERVAL', 'MCS_FLAGS_HT_GREENFIELD', 'MCS_FLAGS_FEC_TYPE', 'MCS_FLAGS_STBC_STREAMS', 'MCS_FLAGS_NESS_BIT_0'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['A_MPDU_STATUS_NONE', 'A_MPDU_STATUS_REPORT_ZERO_LENGTH', 'A_MPDU_STATUS_IS_ZERO_LENGTH', 'A_MPDU_STATUS_LAST_KNOWN', 'A_MPDU_STATUS_LAST', 'A_MPDU_STATUS_DELIMITER_CRC_ERROR', 'A_MPDU_STATUS_DELIMITER_CRC_KNOWN'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['VHT_KNOWN_NONE', 'VHT_KNOWN_STBC', 'VHT_KNOWN_TXOP_PS_NOT_ALLOWED', 'VHT_KNOWN_GUARD_INTERVAL', 'VHT_KNOWN_SHORT_GI_NSYM_DISAMBIGUATION', 'VHT_KNOWN_LDPC_EXTRA_OFDM_SYMBOL', 'VHT_KNOWN_BEAMFORMED', 'VHT_KNOWN_BANDWIDTH', 'VHT_KNOWN_GROUP_ID', 'VHT_KNOWN_PARTIAL_AID'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['VHT_FLAGS_NONE', 'VHT_FLAGS_STBC', 'VHT_FLAGS_TXOP_PS_NOT_ALLOWED', 'VHT_FLAGS_GUARD_INTERVAL', 'VHT_FLAGS_SHORT_GI_NSYM_DISAMBIGUATION', 'VHT_FLAGS__LDPC_EXTRA_OFDM_SYMBOL', 'VHT_FLAGS_BEAMFORMED'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
     ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream [class]
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## red-queue.h (module 'network'): ns3::RedQueue [class]
@@ -544,9 +556,6 @@
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >', u'ns3::SequenceNumber8')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >*', u'ns3::SequenceNumber8*')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >&', u'ns3::SequenceNumber8&')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::SequenceNumber32TracedValueCallback')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::SequenceNumber32TracedValueCallback*')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::SequenceNumber32TracedValueCallback&')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', u'ns3::GenericPhyRxEndErrorCallback')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', u'ns3::GenericPhyRxEndErrorCallback*')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', u'ns3::GenericPhyRxEndErrorCallback&')
@@ -569,6 +578,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace addressUtils
     
     nested_module = module.add_cpp_namespace('addressUtils')
@@ -615,6 +630,40 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_addressUtils(module):
     root_module = module.get_root()
     
@@ -659,6 +708,7 @@
     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'])
@@ -1242,17 +1292,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1274,11 +1324,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1288,16 +1333,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1561,14 +1596,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1629,11 +1668,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3ChannelList_methods(root_module, cls):
@@ -2644,6 +2678,12 @@
                    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([])
@@ -3097,7 +3137,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -3321,10 +3361,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -3388,10 +3428,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3651,10 +3691,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3997,6 +4037,11 @@
     cls.add_method('SetParent', 
                    'ns3::TypeId', 
                    [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent() [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   template_parameters=['ns3::Object'])
     ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetSize(std::size_t size) [member function]
     cls.add_method('SetSize', 
                    'ns3::TypeId', 
@@ -4683,10 +4728,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -4819,6 +4864,16 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
+    ## radiotap-header.h (module 'network'): uint16_t ns3::RadiotapHeader::GetAmpduStatusFlags() const [member function]
+    cls.add_method('GetAmpduStatusFlags', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint32_t ns3::RadiotapHeader::GetAmpduStatusRef() const [member function]
+    cls.add_method('GetAmpduStatusRef', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetAntennaNoisePower() const [member function]
     cls.add_method('GetAntennaNoisePower', 
                    'uint8_t', 
@@ -4849,6 +4904,21 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsFlags() const [member function]
+    cls.add_method('GetMcsFlags', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsKnown() const [member function]
+    cls.add_method('GetMcsKnown', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsRate() const [member function]
+    cls.add_method('GetMcsRate', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetRate() const [member function]
     cls.add_method('GetRate', 
                    'uint8_t', 
@@ -4869,6 +4939,56 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtBandwidth() const [member function]
+    cls.add_method('GetVhtBandwidth', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtCoding() const [member function]
+    cls.add_method('GetVhtCoding', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtFlags() const [member function]
+    cls.add_method('GetVhtFlags', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtGroupId() const [member function]
+    cls.add_method('GetVhtGroupId', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint16_t ns3::RadiotapHeader::GetVhtKnown() const [member function]
+    cls.add_method('GetVhtKnown', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser1() const [member function]
+    cls.add_method('GetVhtMcsNssUser1', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser2() const [member function]
+    cls.add_method('GetVhtMcsNssUser2', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser3() const [member function]
+    cls.add_method('GetVhtMcsNssUser3', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser4() const [member function]
+    cls.add_method('GetVhtMcsNssUser4', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtPartialAid() const [member function]
+    cls.add_method('GetVhtPartialAid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4879,6 +4999,10 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetAmpduStatus(uint32_t referenceNumber, uint16_t flags, uint8_t crc) [member function]
+    cls.add_method('SetAmpduStatus', 
+                   'void', 
+                   [param('uint32_t', 'referenceNumber'), param('uint16_t', 'flags'), param('uint8_t', 'crc')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetAntennaNoisePower(double noise) [member function]
     cls.add_method('SetAntennaNoisePower', 
                    'void', 
@@ -4895,6 +5019,10 @@
     cls.add_method('SetFrameFlags', 
                    'void', 
                    [param('uint8_t', 'flags')])
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs) [member function]
+    cls.add_method('SetMcsFields', 
+                   'void', 
+                   [param('uint8_t', 'known'), param('uint8_t', 'flags'), param('uint8_t', 'mcs')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetRate(uint8_t rate) [member function]
     cls.add_method('SetRate', 
                    'void', 
@@ -4903,6 +5031,10 @@
     cls.add_method('SetTsft', 
                    'void', 
                    [param('uint64_t', 'tsft')])
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetVhtFields(uint16_t known, uint8_t flags, uint8_t bandwidth, uint8_t * mcs_nss, uint8_t coding, uint8_t group_id, uint16_t partial_aid) [member function]
+    cls.add_method('SetVhtFields', 
+                   'void', 
+                   [param('uint16_t', 'known'), param('uint8_t', 'flags'), param('uint8_t', 'bandwidth'), param('uint8_t *', 'mcs_nss'), param('uint8_t', 'coding'), param('uint8_t', 'group_id'), param('uint16_t', 'partial_aid')])
     return
 
 def register_Ns3RandomVariableStream_methods(root_module, cls):
@@ -6609,11 +6741,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -6732,6 +6874,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-calculator.h (module 'stats'): static ns3::TypeId ns3::DataCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-calculator.h (module 'stats'): void ns3::DataCalculator::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -6806,6 +6953,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-output-interface.h (module 'stats'): static ns3::TypeId ns3::DataOutputInterface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-output-interface.h (module 'stats'): void ns3::DataOutputInterface::Output(ns3::DataCollector & dc) [member function]
     cls.add_method('Output', 
                    'void', 
@@ -6924,10 +7076,11 @@
     cls.add_constructor([param('ns3::DropTailQueue const &', 'arg0')])
     ## drop-tail-queue.h (module 'network'): ns3::DropTailQueue::DropTailQueue() [constructor]
     cls.add_constructor([])
-    ## drop-tail-queue.h (module 'network'): ns3::Queue::QueueMode ns3::DropTailQueue::GetMode() [member function]
+    ## drop-tail-queue.h (module 'network'): ns3::Queue::QueueMode ns3::DropTailQueue::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::Queue::QueueMode', 
-                   [])
+                   [], 
+                   is_const=True)
     ## drop-tail-queue.h (module 'network'): static ns3::TypeId ns3::DropTailQueue::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -6976,10 +7129,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -7804,6 +7957,11 @@
     cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< double > const &', 'arg0')])
     ## basic-data-calculators.h (module 'stats'): ns3::MinMaxAvgTotalCalculator<double>::MinMaxAvgTotalCalculator() [constructor]
     cls.add_constructor([])
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::MinMaxAvgTotalCalculator<double>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::MinMaxAvgTotalCalculator<double>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -7869,6 +8027,11 @@
     cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< unsigned int > const &', 'arg0')])
     ## basic-data-calculators.h (module 'stats'): ns3::MinMaxAvgTotalCalculator<unsigned int>::MinMaxAvgTotalCalculator() [constructor]
     cls.add_constructor([])
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::MinMaxAvgTotalCalculator<unsigned int>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::MinMaxAvgTotalCalculator<unsigned int>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -8562,6 +8725,11 @@
     cls.add_method('FrameUpdate', 
                    'void', 
                    [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'realto')])
+    ## packet-data-calculators.h (module 'network'): static ns3::TypeId ns3::PacketSizeMinMaxAvgTotalCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## packet-data-calculators.h (module 'network'): void ns3::PacketSizeMinMaxAvgTotalCalculator::PacketUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('PacketUpdate', 
                    'void', 
@@ -10294,6 +10462,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')], 
                    is_virtual=True)
+    ## simple-channel.h (module 'network'): void ns3::SimpleChannel::BlackList(ns3::Ptr<ns3::SimpleNetDevice> from, ns3::Ptr<ns3::SimpleNetDevice> to) [member function]
+    cls.add_method('BlackList', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'to')], 
+                   is_virtual=True)
     ## simple-channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::SimpleChannel::GetDevice(uint32_t i) const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -10314,6 +10487,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')], 
                    is_virtual=True)
+    ## simple-channel.h (module 'network'): void ns3::SimpleChannel::UnBlackList(ns3::Ptr<ns3::SimpleNetDevice> from, ns3::Ptr<ns3::SimpleNetDevice> to) [member function]
+    cls.add_method('UnBlackList', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'to')], 
+                   is_virtual=True)
     return
 
 def register_Ns3SimpleNetDevice_methods(root_module, cls):
@@ -10956,6 +11134,11 @@
                    'unsigned int', 
                    [], 
                    is_const=True)
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::CounterCalculator<unsigned int>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::CounterCalculator<unsigned int>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -10985,6 +11168,11 @@
     cls.add_method('FrameUpdate', 
                    'void', 
                    [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'realto')])
+    ## packet-data-calculators.h (module 'network'): static ns3::TypeId ns3::PacketCounterCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## packet-data-calculators.h (module 'network'): void ns3::PacketCounterCalculator::PacketUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('PacketUpdate', 
                    'void', 
@@ -11180,6 +11368,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_addressUtils(module.get_submodule('addressUtils'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
@@ -11194,6 +11383,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_addressUtils(module, root_module):
     return
 
diff -Naur ns-3.23/src/applications/bindings/modulegen__gcc_LP64.py ns-3.24/src/applications/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/applications/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/applications/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -110,6 +110,8 @@
     module.add_class('NodeContainer', import_from_module='ns.network')
     ## node-list.h (module 'network'): ns3::NodeList [class]
     module.add_class('NodeList', import_from_module='ns.network')
+    ## 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]
@@ -155,7 +157,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## ping6-helper.h (module 'applications'): ns3::Ping6Helper [class]
@@ -234,6 +236,16 @@
     module.add_enum('', ['FRAME_FLAG_NONE', 'FRAME_FLAG_CFP', 'FRAME_FLAG_SHORT_PREAMBLE', 'FRAME_FLAG_WEP', 'FRAME_FLAG_FRAGMENTED', 'FRAME_FLAG_FCS_INCLUDED', 'FRAME_FLAG_DATA_PADDING', 'FRAME_FLAG_BAD_FCS', 'FRAME_FLAG_SHORT_GUARD'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
     ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
     module.add_enum('', ['CHANNEL_FLAG_NONE', 'CHANNEL_FLAG_TURBO', 'CHANNEL_FLAG_CCK', 'CHANNEL_FLAG_OFDM', 'CHANNEL_FLAG_SPECTRUM_2GHZ', 'CHANNEL_FLAG_SPECTRUM_5GHZ', 'CHANNEL_FLAG_PASSIVE', 'CHANNEL_FLAG_DYNAMIC', 'CHANNEL_FLAG_GFSK'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['MCS_KNOWN_NONE', 'MCS_KNOWN_BANDWIDTH', 'MCS_KNOWN_INDEX', 'MCS_KNOWN_GUARD_INTERVAL', 'MCS_KNOWN_HT_FORMAT', 'MCS_KNOWN_FEC_TYPE', 'MCS_KNOWN_STBC', 'MCS_KNOWN_NESS', 'MCS_KNOWN_NESS_BIT_1'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['MCS_FLAGS_NONE', 'MCS_FLAGS_BANDWIDTH_40', 'MCS_FLAGS_BANDWIDTH_20L', 'MCS_FLAGS_BANDWIDTH_20U', 'MCS_FLAGS_GUARD_INTERVAL', 'MCS_FLAGS_HT_GREENFIELD', 'MCS_FLAGS_FEC_TYPE', 'MCS_FLAGS_STBC_STREAMS', 'MCS_FLAGS_NESS_BIT_0'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['A_MPDU_STATUS_NONE', 'A_MPDU_STATUS_REPORT_ZERO_LENGTH', 'A_MPDU_STATUS_IS_ZERO_LENGTH', 'A_MPDU_STATUS_LAST_KNOWN', 'A_MPDU_STATUS_LAST', 'A_MPDU_STATUS_DELIMITER_CRC_ERROR', 'A_MPDU_STATUS_DELIMITER_CRC_KNOWN'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['VHT_KNOWN_NONE', 'VHT_KNOWN_STBC', 'VHT_KNOWN_TXOP_PS_NOT_ALLOWED', 'VHT_KNOWN_GUARD_INTERVAL', 'VHT_KNOWN_SHORT_GI_NSYM_DISAMBIGUATION', 'VHT_KNOWN_LDPC_EXTRA_OFDM_SYMBOL', 'VHT_KNOWN_BEAMFORMED', 'VHT_KNOWN_BANDWIDTH', 'VHT_KNOWN_GROUP_ID', 'VHT_KNOWN_PARTIAL_AID'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['VHT_FLAGS_NONE', 'VHT_FLAGS_STBC', 'VHT_FLAGS_TXOP_PS_NOT_ALLOWED', 'VHT_FLAGS_GUARD_INTERVAL', 'VHT_FLAGS_SHORT_GI_NSYM_DISAMBIGUATION', 'VHT_FLAGS__LDPC_EXTRA_OFDM_SYMBOL', 'VHT_FLAGS_BEAMFORMED'], outer_class=root_module['ns3::RadiotapHeader'], import_from_module='ns.network')
     ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream [class]
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## red-queue.h (module 'network'): ns3::RedQueue [class]
@@ -544,9 +556,6 @@
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >', u'ns3::SequenceNumber8')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >*', u'ns3::SequenceNumber8*')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >&', u'ns3::SequenceNumber8&')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::SequenceNumber32TracedValueCallback')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::SequenceNumber32TracedValueCallback*')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::SequenceNumber32TracedValueCallback&')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', u'ns3::GenericPhyRxEndErrorCallback')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', u'ns3::GenericPhyRxEndErrorCallback*')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', u'ns3::GenericPhyRxEndErrorCallback&')
@@ -569,6 +578,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace addressUtils
     
     nested_module = module.add_cpp_namespace('addressUtils')
@@ -615,6 +630,40 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_addressUtils(module):
     root_module = module.get_root()
     
@@ -659,6 +708,7 @@
     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'])
@@ -1242,17 +1292,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1274,11 +1324,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1288,16 +1333,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1561,14 +1596,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1629,11 +1668,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3ChannelList_methods(root_module, cls):
@@ -2644,6 +2678,12 @@
                    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([])
@@ -3097,7 +3137,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -3321,10 +3361,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -3388,10 +3428,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3651,10 +3691,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3997,6 +4037,11 @@
     cls.add_method('SetParent', 
                    'ns3::TypeId', 
                    [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent() [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   template_parameters=['ns3::Object'])
     ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetSize(std::size_t size) [member function]
     cls.add_method('SetSize', 
                    'ns3::TypeId', 
@@ -4683,10 +4728,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -4819,6 +4864,16 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
+    ## radiotap-header.h (module 'network'): uint16_t ns3::RadiotapHeader::GetAmpduStatusFlags() const [member function]
+    cls.add_method('GetAmpduStatusFlags', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint32_t ns3::RadiotapHeader::GetAmpduStatusRef() const [member function]
+    cls.add_method('GetAmpduStatusRef', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetAntennaNoisePower() const [member function]
     cls.add_method('GetAntennaNoisePower', 
                    'uint8_t', 
@@ -4849,6 +4904,21 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsFlags() const [member function]
+    cls.add_method('GetMcsFlags', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsKnown() const [member function]
+    cls.add_method('GetMcsKnown', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsRate() const [member function]
+    cls.add_method('GetMcsRate', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetRate() const [member function]
     cls.add_method('GetRate', 
                    'uint8_t', 
@@ -4869,6 +4939,56 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtBandwidth() const [member function]
+    cls.add_method('GetVhtBandwidth', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtCoding() const [member function]
+    cls.add_method('GetVhtCoding', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtFlags() const [member function]
+    cls.add_method('GetVhtFlags', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtGroupId() const [member function]
+    cls.add_method('GetVhtGroupId', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint16_t ns3::RadiotapHeader::GetVhtKnown() const [member function]
+    cls.add_method('GetVhtKnown', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser1() const [member function]
+    cls.add_method('GetVhtMcsNssUser1', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser2() const [member function]
+    cls.add_method('GetVhtMcsNssUser2', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser3() const [member function]
+    cls.add_method('GetVhtMcsNssUser3', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser4() const [member function]
+    cls.add_method('GetVhtMcsNssUser4', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtPartialAid() const [member function]
+    cls.add_method('GetVhtPartialAid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4879,6 +4999,10 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetAmpduStatus(uint32_t referenceNumber, uint16_t flags, uint8_t crc) [member function]
+    cls.add_method('SetAmpduStatus', 
+                   'void', 
+                   [param('uint32_t', 'referenceNumber'), param('uint16_t', 'flags'), param('uint8_t', 'crc')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetAntennaNoisePower(double noise) [member function]
     cls.add_method('SetAntennaNoisePower', 
                    'void', 
@@ -4895,6 +5019,10 @@
     cls.add_method('SetFrameFlags', 
                    'void', 
                    [param('uint8_t', 'flags')])
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs) [member function]
+    cls.add_method('SetMcsFields', 
+                   'void', 
+                   [param('uint8_t', 'known'), param('uint8_t', 'flags'), param('uint8_t', 'mcs')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetRate(uint8_t rate) [member function]
     cls.add_method('SetRate', 
                    'void', 
@@ -4903,6 +5031,10 @@
     cls.add_method('SetTsft', 
                    'void', 
                    [param('uint64_t', 'tsft')])
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetVhtFields(uint16_t known, uint8_t flags, uint8_t bandwidth, uint8_t * mcs_nss, uint8_t coding, uint8_t group_id, uint16_t partial_aid) [member function]
+    cls.add_method('SetVhtFields', 
+                   'void', 
+                   [param('uint16_t', 'known'), param('uint8_t', 'flags'), param('uint8_t', 'bandwidth'), param('uint8_t *', 'mcs_nss'), param('uint8_t', 'coding'), param('uint8_t', 'group_id'), param('uint16_t', 'partial_aid')])
     return
 
 def register_Ns3RandomVariableStream_methods(root_module, cls):
@@ -6609,11 +6741,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -6732,6 +6874,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-calculator.h (module 'stats'): static ns3::TypeId ns3::DataCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-calculator.h (module 'stats'): void ns3::DataCalculator::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -6806,6 +6953,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-output-interface.h (module 'stats'): static ns3::TypeId ns3::DataOutputInterface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-output-interface.h (module 'stats'): void ns3::DataOutputInterface::Output(ns3::DataCollector & dc) [member function]
     cls.add_method('Output', 
                    'void', 
@@ -6924,10 +7076,11 @@
     cls.add_constructor([param('ns3::DropTailQueue const &', 'arg0')])
     ## drop-tail-queue.h (module 'network'): ns3::DropTailQueue::DropTailQueue() [constructor]
     cls.add_constructor([])
-    ## drop-tail-queue.h (module 'network'): ns3::Queue::QueueMode ns3::DropTailQueue::GetMode() [member function]
+    ## drop-tail-queue.h (module 'network'): ns3::Queue::QueueMode ns3::DropTailQueue::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::Queue::QueueMode', 
-                   [])
+                   [], 
+                   is_const=True)
     ## drop-tail-queue.h (module 'network'): static ns3::TypeId ns3::DropTailQueue::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -6976,10 +7129,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -7804,6 +7957,11 @@
     cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< double > const &', 'arg0')])
     ## basic-data-calculators.h (module 'stats'): ns3::MinMaxAvgTotalCalculator<double>::MinMaxAvgTotalCalculator() [constructor]
     cls.add_constructor([])
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::MinMaxAvgTotalCalculator<double>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::MinMaxAvgTotalCalculator<double>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -7869,6 +8027,11 @@
     cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< unsigned int > const &', 'arg0')])
     ## basic-data-calculators.h (module 'stats'): ns3::MinMaxAvgTotalCalculator<unsigned int>::MinMaxAvgTotalCalculator() [constructor]
     cls.add_constructor([])
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::MinMaxAvgTotalCalculator<unsigned int>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::MinMaxAvgTotalCalculator<unsigned int>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -8562,6 +8725,11 @@
     cls.add_method('FrameUpdate', 
                    'void', 
                    [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'realto')])
+    ## packet-data-calculators.h (module 'network'): static ns3::TypeId ns3::PacketSizeMinMaxAvgTotalCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## packet-data-calculators.h (module 'network'): void ns3::PacketSizeMinMaxAvgTotalCalculator::PacketUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('PacketUpdate', 
                    'void', 
@@ -10294,6 +10462,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')], 
                    is_virtual=True)
+    ## simple-channel.h (module 'network'): void ns3::SimpleChannel::BlackList(ns3::Ptr<ns3::SimpleNetDevice> from, ns3::Ptr<ns3::SimpleNetDevice> to) [member function]
+    cls.add_method('BlackList', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'to')], 
+                   is_virtual=True)
     ## simple-channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::SimpleChannel::GetDevice(uint32_t i) const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -10314,6 +10487,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')], 
                    is_virtual=True)
+    ## simple-channel.h (module 'network'): void ns3::SimpleChannel::UnBlackList(ns3::Ptr<ns3::SimpleNetDevice> from, ns3::Ptr<ns3::SimpleNetDevice> to) [member function]
+    cls.add_method('UnBlackList', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'to')], 
+                   is_virtual=True)
     return
 
 def register_Ns3SimpleNetDevice_methods(root_module, cls):
@@ -10956,6 +11134,11 @@
                    'unsigned int', 
                    [], 
                    is_const=True)
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::CounterCalculator<unsigned int>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::CounterCalculator<unsigned int>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -10985,6 +11168,11 @@
     cls.add_method('FrameUpdate', 
                    'void', 
                    [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'realto')])
+    ## packet-data-calculators.h (module 'network'): static ns3::TypeId ns3::PacketCounterCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## packet-data-calculators.h (module 'network'): void ns3::PacketCounterCalculator::PacketUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('PacketUpdate', 
                    'void', 
@@ -11180,6 +11368,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_addressUtils(module.get_submodule('addressUtils'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
@@ -11194,6 +11383,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_addressUtils(module, root_module):
     return
 
diff -Naur ns-3.23/src/applications/model/application-packet-probe.cc ns-3.24/src/applications/model/application-packet-probe.cc
--- ns-3.23/src/applications/model/application-packet-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/applications/model/application-packet-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -45,11 +45,11 @@
                       "The packet plus its socket address that serve "
                       "as the output for this probe",
                       MakeTraceSourceAccessor (&ApplicationPacketProbe::m_output),
-                      "ns3::Packet::PacketAddressTracedCallback")
+                      "ns3::Packet::AddressTracedCallback")
     .AddTraceSource ( "OutputBytes",
                       "The number of bytes in the packet",
                       MakeTraceSourceAccessor (&ApplicationPacketProbe::m_outputBytes),
-                      "ns3::Packet::PacketSizeTracedCallback")
+                      "ns3::Packet::SizeTracedCallback")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/applications/model/packet-sink.cc ns-3.24/src/applications/model/packet-sink.cc
--- ns-3.23/src/applications/model/packet-sink.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/applications/model/packet-sink.cc	2015-09-15 11:18:44.000000000 -0700
@@ -58,7 +58,7 @@
     .AddTraceSource ("Rx",
                      "A packet has been received",
                      MakeTraceSourceAccessor (&PacketSink::m_rxTrace),
-                     "ns3::Packet::PacketAddressTracedCallback")
+                     "ns3::Packet::AddressTracedCallback")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/applications/model/radvd-interface.h ns-3.24/src/applications/model/radvd-interface.h
--- ns-3.23/src/applications/model/radvd-interface.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/applications/model/radvd-interface.h	2015-09-15 11:18:44.000000000 -0700
@@ -317,7 +317,7 @@
 
   /**
    * \brief Set the last RA send time. It also decrements the initial Rtr Advertisements counter.
-   * \param the last RA send time
+   * \param now the last RA send time
    */
   void SetLastRaTxTime (Time now);
 
diff -Naur ns-3.23/src/bridge/bindings/modulegen__gcc_ILP32.py ns-3.24/src/bridge/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/bridge/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/bridge/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -172,6 +172,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -207,6 +213,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -417,11 +430,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -1935,11 +1943,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2811,6 +2829,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -2823,6 +2842,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/bridge/bindings/modulegen__gcc_LP64.py ns-3.24/src/bridge/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/bridge/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/bridge/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -172,6 +172,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -207,6 +213,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -417,11 +430,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -1935,11 +1943,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2811,6 +2829,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -2823,6 +2842,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/bridge/helper/bridge-helper.h ns-3.24/src/bridge/helper/bridge-helper.h
--- ns-3.23/src/bridge/helper/bridge-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/bridge/helper/bridge-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -31,6 +31,7 @@
 class AttributeValue;
 
 /**
+ * \ingroup bridge
  * \brief Add capability to bridge multiple LAN segments (IEEE 802.1D bridging)
  */
 class BridgeHelper
diff -Naur ns-3.23/src/bridge/model/bridge-channel.h ns-3.24/src/bridge/model/bridge-channel.h
--- ns-3.23/src/bridge/model/bridge-channel.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/bridge/model/bridge-channel.h	2015-09-15 11:18:44.000000000 -0700
@@ -36,10 +36,18 @@
 class BridgeChannel : public Channel
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   BridgeChannel ();
   virtual ~BridgeChannel ();
 
+  /**
+   * Adds a channel to the bridged pool
+   * \param bridgedChannel  the channel to add to the pool
+   */
   void AddChannel (Ptr<Channel> bridgedChannel);
 
   // virtual methods implementation, from Channel
@@ -48,10 +56,22 @@
 
 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;
+  std::vector< Ptr<Channel> > m_bridgedChannels; //!< pool of bridged channels
 
 };
 
diff -Naur ns-3.23/src/bridge/model/bridge-net-device.h ns-3.24/src/bridge/model/bridge-net-device.h
--- ns-3.23/src/bridge/model/bridge-net-device.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/bridge/model/bridge-net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -65,12 +65,17 @@
 class BridgeNetDevice : public NetDevice
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   BridgeNetDevice ();
   virtual ~BridgeNetDevice ();
 
   /** 
    * \brief Add a 'port' to a bridge device
+   * \param bridgePort the NetDevice to add
    *
    * This method adds a new bridge port to a BridgeNetDevice, so that
    * the new bridge port NetDevice becomes part of the bridge and L2
@@ -84,8 +89,18 @@
    */
   void AddBridgePort (Ptr<NetDevice> bridgePort);
 
+  /**
+   * \brief Gets the number of bridged 'ports', i.e., the NetDevices currently bridged.
+   *
+   * \return the number of bridged ports.
+   */
   uint32_t GetNBridgePorts (void) const;
 
+  /**
+   * \brief Gets the n-th bridged port.
+   * \param n the port index
+   * \return the n-th bridged NetDevice
+   */
   Ptr<NetDevice> GetBridgePort (uint32_t n) const;
 
   // inherited from NetDevice base class.
@@ -117,36 +132,92 @@
 protected:
   virtual void DoDispose (void);
 
+  /**
+   * \brief Receives a packet from one bridged port.
+   * \param device the originating port
+   * \param packet the received packet
+   * \param protocol the packet protocol (e.g., Ethertype)
+   * \param source the packet source
+   * \param destination the packet destination
+   * \param packetType the packet type (e.g., host, broadcast, etc.)
+   */
   void ReceiveFromDevice (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol,
                           Address const &source, Address const &destination, PacketType packetType);
+
+  /**
+   * \brief Forwards a unicast packet
+   * \param incomingPort the packet incoming port
+   * \param packet the packet
+   * \param protocol the packet protocol (e.g., Ethertype)
+   * \param src the packet source
+   * \param dst the packet destination
+   */
   void ForwardUnicast (Ptr<NetDevice> incomingPort, Ptr<const Packet> packet,
                        uint16_t protocol, Mac48Address src, Mac48Address dst);
+
+  /**
+   * \brief Forwards a broadcast or a multicast packet
+   * \param incomingPort the packet incoming port
+   * \param packet the packet
+   * \param protocol the packet protocol (e.g., Ethertype)
+   * \param src the packet source
+   * \param dst the packet destination
+   */
   void ForwardBroadcast (Ptr<NetDevice> incomingPort, Ptr<const Packet> packet,
                          uint16_t protocol, Mac48Address src, Mac48Address dst);
+
+  /**
+   * \brief Learns the port a MAC address is sending from
+   * \param source source address
+   * \param port the port the source is sending from
+   */
   void Learn (Mac48Address source, Ptr<NetDevice> port);
+
+  /**
+   * \brief Gets the port associated to a source address
+   * \param source the source address
+   * \returns the port the source is associated to, or NULL if no association is known.
+   */
   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;
-  NetDevice::PromiscReceiveCallback m_promiscRxCallback;
+  NetDevice::ReceiveCallback m_rxCallback; //!< receive callback
+  NetDevice::PromiscReceiveCallback m_promiscRxCallback; //!< promiscuous receive callback
 
-  Mac48Address m_address;
-  Time m_expirationTime; // time it takes for learned MAC state to expire
+  Mac48Address m_address; //!< MAC address of the NetDevice
+  Time m_expirationTime;  //!< time it takes for learned MAC state to expire
+
+  /**
+   * \ingroup bridge
+   * Structure holding the status of an address
+   */
   struct LearnedState
   {
-    Ptr<NetDevice> associatedPort;
-    Time expirationTime;
+    Ptr<NetDevice> associatedPort; //!< port associated with the address
+    Time expirationTime;  //!< time it takes for learned MAC state to expire
   };
-  std::map<Mac48Address, LearnedState> m_learnState;
-  Ptr<Node> m_node;
-  Ptr<BridgeChannel> m_channel;
-  std::vector< Ptr<NetDevice> > m_ports;
-  uint32_t m_ifIndex;
-  uint16_t m_mtu;
-  bool m_enableLearning;
+  std::map<Mac48Address, LearnedState> m_learnState; //!< Container for known address statuses
+  Ptr<Node> m_node; //!< node owning this NetDevice
+  Ptr<BridgeChannel> m_channel; //!< virtual bridged channel
+  std::vector< Ptr<NetDevice> > m_ports; //!< bridged ports
+  uint32_t m_ifIndex; //!< Interface index
+  uint16_t m_mtu; //!< MTU of the bridged NetDevice
+  bool m_enableLearning; //!< true if the bridge will learn the node status
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/buildings/bindings/modulegen__gcc_ILP32.py ns-3.24/src/buildings/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/buildings/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/buildings/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -296,6 +296,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -331,6 +337,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -721,11 +734,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3ConstantVelocityHelper_methods(root_module, cls):
@@ -3108,11 +3116,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -3222,10 +3240,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -4631,6 +4649,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -4643,6 +4662,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/buildings/bindings/modulegen__gcc_LP64.py ns-3.24/src/buildings/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/buildings/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/buildings/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -296,6 +296,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -331,6 +337,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -721,11 +734,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3ConstantVelocityHelper_methods(root_module, cls):
@@ -3108,11 +3116,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -3222,10 +3240,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -4631,6 +4649,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -4643,6 +4662,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/click/model/ipv4-l3-click-protocol.cc ns-3.24/src/click/model/ipv4-l3-click-protocol.cc
--- ns-3.23/src/click/model/ipv4-l3-click-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/click/model/ipv4-l3-click-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -108,7 +108,7 @@
           this->SetNode (node);
         }
     }
-  Object::NotifyNewAggregate ();
+  Ipv4::NotifyNewAggregate ();
 }
 
 void
diff -Naur ns-3.23/src/click/model/ipv4-l3-click-protocol.h ns-3.24/src/click/model/ipv4-l3-click-protocol.h
--- ns-3.23/src/click/model/ipv4-l3-click-protocol.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/click/model/ipv4-l3-click-protocol.h	2015-09-15 11:18:44.000000000 -0700
@@ -264,8 +264,11 @@
 
   Ptr<Node> m_node;
 
+  /** \todo Remove; this TracedCallback is never invoked. */
   TracedCallback<const Ipv4Header &, Ptr<const Packet>, uint32_t> m_sendOutgoingTrace;
+  /** \todo Remove: this TracedCallback is never invoked. */
   TracedCallback<const Ipv4Header &, Ptr<const Packet>, uint32_t> m_unicastForwardTrace;
+  /** \todo This TracedCallback is invoked but not accessible. */
   TracedCallback<const Ipv4Header &, Ptr<const Packet>, uint32_t> m_localDeliverTrace;
 
   SocketList m_sockets;
diff -Naur ns-3.23/src/config-store/bindings/modulegen__gcc_ILP32.py ns-3.24/src/config-store/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/config-store/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/config-store/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -175,11 +175,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3FileConfig_methods(root_module, cls):
@@ -792,11 +787,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
diff -Naur ns-3.23/src/config-store/bindings/modulegen__gcc_LP64.py ns-3.24/src/config-store/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/config-store/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/config-store/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -175,11 +175,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3FileConfig_methods(root_module, cls):
@@ -792,11 +787,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
diff -Naur ns-3.23/src/config-store/model/config-store.cc ns-3.24/src/config-store/model/config-store.cc
--- ns-3.23/src/config-store/model/config-store.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/config-store/model/config-store.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 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>
+ */
+
 #include "config-store.h"
 #include "raw-text-config.h"
 #include "ns3/abort.h"
diff -Naur ns-3.23/src/config-store/model/config-store.h ns-3.24/src/config-store/model/config-store.h
--- ns-3.23/src/config-store/model/config-store.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/config-store/model/config-store.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 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 CONFIG_STORE_H
 #define CONFIG_STORE_H
 
diff -Naur ns-3.23/src/config-store/model/file-config.cc ns-3.24/src/config-store/model/file-config.cc
--- ns-3.23/src/config-store/model/file-config.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/config-store/model/file-config.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 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>
+ */
+
 #include "file-config.h"
 
 namespace ns3 {
diff -Naur ns-3.23/src/config-store/model/file-config.h ns-3.24/src/config-store/model/file-config.h
--- ns-3.23/src/config-store/model/file-config.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/config-store/model/file-config.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 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 FILE_CONFIG_H
 #define FILE_CONFIG_H
 
diff -Naur ns-3.23/src/config-store/model/raw-text-config.cc ns-3.24/src/config-store/model/raw-text-config.cc
--- ns-3.23/src/config-store/model/raw-text-config.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/config-store/model/raw-text-config.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 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>
+ */
+
 #include "raw-text-config.h"
 #include "attribute-iterator.h"
 #include "attribute-default-iterator.h"
diff -Naur ns-3.23/src/config-store/model/raw-text-config.h ns-3.24/src/config-store/model/raw-text-config.h
--- ns-3.23/src/config-store/model/raw-text-config.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/config-store/model/raw-text-config.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 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 RAW_TEXT_CONFIG_H
 #define RAW_TEXT_CONFIG_H
 
diff -Naur ns-3.23/src/config-store/model/xml-config.cc ns-3.24/src/config-store/model/xml-config.cc
--- ns-3.23/src/config-store/model/xml-config.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/config-store/model/xml-config.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 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>
+ */
+
 #include "xml-config.h"
 #include "attribute-default-iterator.h"
 #include "attribute-iterator.h"
diff -Naur ns-3.23/src/config-store/model/xml-config.h ns-3.24/src/config-store/model/xml-config.h
--- ns-3.23/src/config-store/model/xml-config.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/config-store/model/xml-config.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 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 XML_CONFIG_STORE_H
 #define XML_CONFIG_STORE_H
 
diff -Naur ns-3.23/src/core/bindings/modulegen__gcc_ILP32.py ns-3.24/src/core/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/core/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -72,6 +72,8 @@
     module.add_class('LogComponent')
     ## 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]
@@ -346,6 +348,12 @@
     register_types_ns3_SystemPath(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -403,6 +411,37 @@
     
     module.add_container('std::list< std::string >', 'std::string', container_type=u'list')
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -426,6 +465,7 @@
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     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'])
@@ -585,11 +625,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CommandLine_methods(root_module, cls):
@@ -933,6 +968,12 @@
                    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([])
@@ -1096,8 +1137,8 @@
 def register_Ns3RngStream_methods(root_module, cls):
     ## rng-stream.h (module 'core'): ns3::RngStream::RngStream(uint32_t seed, uint64_t stream, uint64_t substream) [constructor]
     cls.add_constructor([param('uint32_t', 'seed'), param('uint64_t', 'stream'), param('uint64_t', 'substream')])
-    ## rng-stream.h (module 'core'): ns3::RngStream::RngStream(ns3::RngStream const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::RngStream const &', 'arg0')])
+    ## rng-stream.h (module 'core'): ns3::RngStream::RngStream(ns3::RngStream const & r) [copy constructor]
+    cls.add_constructor([param('ns3::RngStream const &', 'r')])
     ## rng-stream.h (module 'core'): double ns3::RngStream::RandU01() [member function]
     cls.add_method('RandU01', 
                    'double', 
@@ -1189,10 +1230,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -2088,10 +2129,10 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::Schedule(ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::Schedule(ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('Schedule', 
                    'ns3::EventId', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_pure_virtual=True, is_virtual=True)
     ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::ScheduleDestroy(ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleDestroy', 
@@ -2103,10 +2144,10 @@
                    'ns3::EventId', 
                    [param('ns3::EventImpl *', 'event')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleWithContext', 
                    'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('uint32_t', 'context'), param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_pure_virtual=True, is_virtual=True)
     ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
     cls.add_method('SetScheduler', 
@@ -2118,10 +2159,10 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Stop(ns3::Time const & time) [member function]
+    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_pure_virtual=True, is_virtual=True)
     return
 
@@ -2951,11 +2992,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -3084,10 +3135,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## default-simulator-impl.h (module 'core'): ns3::EventId ns3::DefaultSimulatorImpl::Schedule(ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## default-simulator-impl.h (module 'core'): ns3::EventId ns3::DefaultSimulatorImpl::Schedule(ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('Schedule', 
                    'ns3::EventId', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
     ## default-simulator-impl.h (module 'core'): ns3::EventId ns3::DefaultSimulatorImpl::ScheduleDestroy(ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleDestroy', 
@@ -3099,10 +3150,10 @@
                    'ns3::EventId', 
                    [param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
-    ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleWithContext', 
                    'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('uint32_t', 'context'), param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
     ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
     cls.add_method('SetScheduler', 
@@ -3114,10 +3165,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::Stop(ns3::Time const & time) [member function]
+    ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_virtual=True)
     ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -3205,10 +3256,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -4001,10 +4052,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## realtime-simulator-impl.h (module 'core'): ns3::EventId ns3::RealtimeSimulatorImpl::Schedule(ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## realtime-simulator-impl.h (module 'core'): ns3::EventId ns3::RealtimeSimulatorImpl::Schedule(ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('Schedule', 
                    'ns3::EventId', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): ns3::EventId ns3::RealtimeSimulatorImpl::ScheduleDestroy(ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleDestroy', 
@@ -4016,10 +4067,10 @@
                    'ns3::EventId', 
                    [param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleRealtime(ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleRealtime(ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleRealtime', 
                    'void', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')])
+                   [param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')])
     ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleRealtimeNow(ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleRealtimeNow', 
                    'void', 
@@ -4028,14 +4079,14 @@
     cls.add_method('ScheduleRealtimeNowWithContext', 
                    'void', 
                    [param('uint32_t', 'context'), param('ns3::EventImpl *', 'event')])
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleRealtimeWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleRealtimeWithContext(uint32_t context, ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleRealtimeWithContext', 
                    'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')])
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
+                   [param('uint32_t', 'context'), param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')])
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleWithContext', 
                    'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('uint32_t', 'context'), param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::SetHardLimit(ns3::Time limit) [member function]
     cls.add_method('SetHardLimit', 
@@ -4055,10 +4106,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Stop(ns3::Time const & time) [member function]
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -4763,6 +4814,7 @@
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
     register_functions_ns3_SystemPath(module.get_submodule('SystemPath'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -4895,6 +4947,9 @@
                         [param('std::string', 'path')])
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     ## double.h (module 'core'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::internal::MakeDoubleChecker(double min, double max, std::string name) [free function]
     module.add_function('MakeDoubleChecker', 
diff -Naur ns-3.23/src/core/bindings/modulegen__gcc_LP64.py ns-3.24/src/core/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/core/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -72,6 +72,8 @@
     module.add_class('LogComponent')
     ## 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]
@@ -346,6 +348,12 @@
     register_types_ns3_SystemPath(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -403,6 +411,37 @@
     
     module.add_container('std::list< std::string >', 'std::string', container_type=u'list')
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -426,6 +465,7 @@
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     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'])
@@ -585,11 +625,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CommandLine_methods(root_module, cls):
@@ -933,6 +968,12 @@
                    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([])
@@ -1096,8 +1137,8 @@
 def register_Ns3RngStream_methods(root_module, cls):
     ## rng-stream.h (module 'core'): ns3::RngStream::RngStream(uint32_t seed, uint64_t stream, uint64_t substream) [constructor]
     cls.add_constructor([param('uint32_t', 'seed'), param('uint64_t', 'stream'), param('uint64_t', 'substream')])
-    ## rng-stream.h (module 'core'): ns3::RngStream::RngStream(ns3::RngStream const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::RngStream const &', 'arg0')])
+    ## rng-stream.h (module 'core'): ns3::RngStream::RngStream(ns3::RngStream const & r) [copy constructor]
+    cls.add_constructor([param('ns3::RngStream const &', 'r')])
     ## rng-stream.h (module 'core'): double ns3::RngStream::RandU01() [member function]
     cls.add_method('RandU01', 
                    'double', 
@@ -1189,10 +1230,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -2088,10 +2129,10 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::Schedule(ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::Schedule(ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('Schedule', 
                    'ns3::EventId', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_pure_virtual=True, is_virtual=True)
     ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::ScheduleDestroy(ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleDestroy', 
@@ -2103,10 +2144,10 @@
                    'ns3::EventId', 
                    [param('ns3::EventImpl *', 'event')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleWithContext', 
                    'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('uint32_t', 'context'), param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_pure_virtual=True, is_virtual=True)
     ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
     cls.add_method('SetScheduler', 
@@ -2118,10 +2159,10 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Stop(ns3::Time const & time) [member function]
+    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_pure_virtual=True, is_virtual=True)
     return
 
@@ -2951,11 +2992,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -3084,10 +3135,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## default-simulator-impl.h (module 'core'): ns3::EventId ns3::DefaultSimulatorImpl::Schedule(ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## default-simulator-impl.h (module 'core'): ns3::EventId ns3::DefaultSimulatorImpl::Schedule(ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('Schedule', 
                    'ns3::EventId', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
     ## default-simulator-impl.h (module 'core'): ns3::EventId ns3::DefaultSimulatorImpl::ScheduleDestroy(ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleDestroy', 
@@ -3099,10 +3150,10 @@
                    'ns3::EventId', 
                    [param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
-    ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleWithContext', 
                    'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('uint32_t', 'context'), param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
     ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
     cls.add_method('SetScheduler', 
@@ -3114,10 +3165,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::Stop(ns3::Time const & time) [member function]
+    ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_virtual=True)
     ## default-simulator-impl.h (module 'core'): void ns3::DefaultSimulatorImpl::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -3205,10 +3256,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -4001,10 +4052,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## realtime-simulator-impl.h (module 'core'): ns3::EventId ns3::RealtimeSimulatorImpl::Schedule(ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## realtime-simulator-impl.h (module 'core'): ns3::EventId ns3::RealtimeSimulatorImpl::Schedule(ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('Schedule', 
                    'ns3::EventId', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): ns3::EventId ns3::RealtimeSimulatorImpl::ScheduleDestroy(ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleDestroy', 
@@ -4016,10 +4067,10 @@
                    'ns3::EventId', 
                    [param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleRealtime(ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleRealtime(ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleRealtime', 
                    'void', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')])
+                   [param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')])
     ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleRealtimeNow(ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleRealtimeNow', 
                    'void', 
@@ -4028,14 +4079,14 @@
     cls.add_method('ScheduleRealtimeNowWithContext', 
                    'void', 
                    [param('uint32_t', 'context'), param('ns3::EventImpl *', 'event')])
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleRealtimeWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleRealtimeWithContext(uint32_t context, ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleRealtimeWithContext', 
                    'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')])
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
+                   [param('uint32_t', 'context'), param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')])
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & delay, ns3::EventImpl * event) [member function]
     cls.add_method('ScheduleWithContext', 
                    'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
+                   [param('uint32_t', 'context'), param('ns3::Time const &', 'delay'), param('ns3::EventImpl *', 'event')], 
                    is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::SetHardLimit(ns3::Time limit) [member function]
     cls.add_method('SetHardLimit', 
@@ -4055,10 +4106,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Stop(ns3::Time const & time) [member function]
+    ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_virtual=True)
     ## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorImpl::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -4763,6 +4814,7 @@
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
     register_functions_ns3_SystemPath(module.get_submodule('SystemPath'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -4895,6 +4947,9 @@
                         [param('std::string', 'path')])
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     ## double.h (module 'core'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::internal::MakeDoubleChecker(double min, double max, std::string name) [free function]
     module.add_function('MakeDoubleChecker', 
diff -Naur ns-3.23/src/core/doc/deprecated-example.h ns-3.24/src/core/doc/deprecated-example.h
--- ns-3.23/src/core/doc/deprecated-example.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/core/doc/deprecated-example.h	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,38 @@
+/* -*- 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
+ *
+ * Authors: Peter D. Barnes, Jr. <pdbarnes@llnl.gov>
+ */
+
+/* 
+ * This is an example included in the doxygen-generated documentation
+ * for NS_DEPRECATED.
+ */
+
+// [doxygen snippet]
+/*
+ * Do something useful.
+ *
+ * \deprecated This method will go away in future versions of ns-3.
+ * See instead TheNewWay()
+ */
+void SomethingUseful (void); 
+/*
+ * Do something more useful.
+ */
+void TheNewWay (void);
+// [doxygen snippet]
diff -Naur ns-3.23/src/core/examples/sample-simulator.cc ns-3.24/src/core/examples/sample-simulator.cc
--- ns-3.23/src/core/examples/sample-simulator.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/examples/sample-simulator.cc	2015-09-15 11:18:44.000000000 -0700
@@ -33,11 +33,18 @@
 
 using namespace ns3;
 
+/** Simple model object to illustrate event handling. */
 class MyModel
 {
 public:
+  /** Start model execution by scheduling a HandleEvent. */
   void Start (void);
 private:
+  /**
+   *  Simple event handler.
+   *
+   * \param [in] eventValue Event argument.
+   */
   void HandleEvent (double eventValue);
 };
 
@@ -56,6 +63,11 @@
             << "s started at " << value << "s" << std::endl;
 }
 
+/**
+ * Simple function event handler which Starts a MyModel object.
+ *
+ * \param [in] model The MyModel object to start.
+ */
 static void
 ExampleFunction (MyModel *model)
 {
@@ -64,6 +76,9 @@
   model->Start ();
 }
 
+/**
+ * Simple function event handler; this function is called randomly.
+ */
 static void
 RandomFunction (void)
 {
@@ -71,6 +86,7 @@
             << Simulator::Now ().GetSeconds () << "s" << std::endl;
 }
 
+/** Simple function event handler; the corresponding event is cancelled. */
 static void
 CancelledEvent (void)
 {
diff -Naur ns-3.23/src/core/examples/sample-simulator.py ns-3.24/src/core/examples/sample-simulator.py
--- ns-3.23/src/core/examples/sample-simulator.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/examples/sample-simulator.py	2015-09-15 11:18:44.000000000 -0700
@@ -23,11 +23,17 @@
 import ns.core
 
 class MyModel(object):
+    """Simple model object to illustrate event handling."""
 
+    ## \returns None.
     def Start(self):
+        """Start model execution by scheduling a HandleEvent."""
         ns.core.Simulator.Schedule(ns.core.Seconds(10.0), self.HandleEvent, ns.core.Simulator.Now().GetSeconds())
 
+    ## \param [in] value Event argument.
+    ## \return None.
     def HandleEvent(self, value):
+        """Simple event handler."""
         print "Member method received event at", ns.core.Simulator.Now().GetSeconds(), \
             "s started at", value, "s"
 
diff -Naur ns-3.23/src/core/model/abort.h ns-3.24/src/core/model/abort.h
--- ns-3.23/src/core/model/abort.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/abort.h	2015-09-15 11:18:44.000000000 -0700
@@ -34,11 +34,11 @@
  *
  * \brief Unconditional abnormal program termination with a message.
  *
- * \param msg The message to output when this macro is hit.
+ * \param [in] msg The message to output when this macro is hit.
  *
  * This macro is essentially equivalent to NS_FATAL_ERROR,
- * excepts it prepends the error message with the string
- * "aborted. ". When this macro is hit a runtime, the
+ * except it prepends the error message with the string
+ * "aborted. ". When this macro is hit at runtime, the
  * program will be halted using \c std::terminate, which
  * triggers clean up code registered by \c std::set_terminate.
  *
@@ -59,7 +59,7 @@
  *
  * \brief Abnormal program termination if a condition is \c true.
  *
- * \param cond The condition to be evaluated.
+ * \param [in] cond The condition to be evaluated.
  *
  * This is similar to \c NS_ASSERT(!(cond)), except this check
  * is enabled in all builds. If \c cond is evaluated to \c true,
@@ -89,8 +89,8 @@
  * \brief Abnormal program termination if a condition is \c true,
  * with a message.
  *
- * \param cond The ondition to be evaluated.
- * \param msg The message to output when cond is \c true.
+ * \param [in] cond The condition to be evaluated.
+ * \param [in] msg The message to output when cond is \c true.
  *
  * This is similar to NS_ASSERT_MSG(!(cond)), except this
  * check is enabled in all builds. If \c cond is evaluated to
@@ -119,7 +119,7 @@
  *
  * \brief Abnormal program termination if a condition is \c false.
  *
- * \param cond The condition to be evaluated.
+ * \param [in] cond The condition to be evaluated.
  *
  * This is an alias for NS_ABORT_IF(!(cond))
  *
@@ -134,8 +134,8 @@
  * \brief Abnormal program termination if a condition is \c false,
  * with a message.
  *
- * \param cond Thecondition to be evaluated.
- * \param msg The message to output if cond is false.
+ * \param [in] cond The condition to be evaluated.
+ * \param [in] msg The message to output if cond is false.
  *
  * This is an alias for NS_ABORT_MSG_IF(!(cond))
  *
diff -Naur ns-3.23/src/core/model/assert.h ns-3.24/src/core/model/assert.h
--- ns-3.23/src/core/model/assert.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/assert.h	2015-09-15 11:18:44.000000000 -0700
@@ -62,7 +62,7 @@
  * true, the program prints the source file, line number and 
  * unverified condition and halts by calling std::terminate
  *
- * \param condition condition to verify.
+ * \param [in] condition Condition to verify.
  */
 #define NS_ASSERT(condition)                                    \
   do                                                            \
@@ -84,8 +84,8 @@
  * true, the program prints the message to output and
  * halts by calling std::terminate.
  *
- * \param condition condition to verify.
- * \param message message to output
+ * \param [in] condition Condition to verify.
+ * \param [in] message Message to output
  */
 #define NS_ASSERT_MSG(condition, message)             \
   do                                                  \
diff -Naur ns-3.23/src/core/model/attribute-accessor-helper.h ns-3.24/src/core/model/attribute-accessor-helper.h
--- ns-3.23/src/core/model/attribute-accessor-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/attribute-accessor-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -56,12 +56,13 @@
  * In the case of a \p setter returning \p bool, the return value
  * should be \c true if the value could be set successfully.
  *
- * \tparam V  (If present) The specific AttributeValue type to use to represent
- *            the Attribute.  (If not present, the type \p V is implicit
- *            in the name of this function as "Make<V>Accessor"
- * \tparam T1 The type of the class data member,
+ * \tparam V  \explicit (If present) The specific AttributeValue type
+ *            to use to represent the Attribute.  (If not present,
+ *            the type \p V is implicit in the name of this function,
+ *            as "Make<V>Accessor"
+ * \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,
+ * \param [in] a1 The address of the data member,
  *            or the get or set method.
  * \returns   The AttributeAccessor
  */
@@ -99,15 +100,15 @@
  * In practice the setter and getter arguments can appear in either order,
  * but setter first is preferred.
  *
- * \tparam V  (If present) The specific AttributeValue type to use to represent
+ * \tparam V  \explicit (If present) The specific AttributeValue type to use to represent
  *            the Attribute.  (If not present, the type \p V is implicit
  *            in the name of this function as "Make<V>Accessor"
- * \tparam T1 The type of the class data member,
+ * \tparam T1 \deduced The type of the class data member,
  *            or the type of the class get functor or set method.
  *
- * \tparam T2 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,
+ * \tparam T2 \deduced The type of the getter class functor method.
+ * \param [in] a2 The address of the class method to set the attribute.
+ * \param [in] a1 The address of the data member,
  *            or the get or set method.
  * \returns   The AttributeAccessor
  */
@@ -134,7 +135,7 @@
  *
  * The non-const and non-reference type equivalent to \p T.
  *
- * \tparam T The original (possibly qualified) type.
+ * \tparam T \explicit The original (possibly qualified) type.
  */
 template <typename T>
 struct AccessorTrait
@@ -150,8 +151,8 @@
  * Basic functionality for accessing class attributes via
  * class data members, or get functor/set methods.
  *
- * \tparam T Class of object holding the attribute.
- * \tparam U AttributeValue type for the underlying class member
+ * \tparam T \explicit Class of object holding the attribute.
+ * \tparam U \explicit AttributeValue type for the underlying class member
  *           which is an attribute.
  */
 template <typename T, typename U>
@@ -169,8 +170,8 @@
    *
    * Forwards to DoSet method.
    *
-   * \param object Generic object pointer, to upcast to \p T.
-   * \param val Generic AttributeValue, to upcast to \p U.
+   * \param [in] object Generic object pointer, to upcast to \p T.
+   * \param [in] val Generic AttributeValue, to upcast to \p U.
    * \returns true if the member was set successfully.
    */
   virtual bool Set (ObjectBase * object, const AttributeValue & val) const {
@@ -195,8 +196,8 @@
    *
    * Forwards to DoGet method.
    *
-   * \param object Generic object pointer, to upcast to \p T.
-   * \param val Generic AttributeValue, to upcast to \p U.
+   * \param [out] object Generic object pointer, to upcast to \p T.
+   * \param [out] val Generic AttributeValue, to upcast to \p U.
    * \returns true if the member value could be retrieved successfully
    */
   virtual bool Get (const ObjectBase * object, AttributeValue &val) const {
@@ -218,8 +219,8 @@
    * Setter implementation.
    *
    * \see Set()
-   * \param object The parent object holding the attribute.
-   * \param v The specific AttributeValue to set.
+   * \param [in] object The parent object holding the attribute.
+   * \param [in] v The specific AttributeValue to set.
    * \returns true if the member was set successfully.
    */
   virtual bool DoSet (T *object, const U *v) const = 0;
@@ -227,8 +228,8 @@
    * Getter implementation.
    *
    * \see Get()
-   * \param object The parent object holding the attribute.
-   * \param v The specific AttributeValue to set.
+   * \param [out] object The parent object holding the attribute.
+   * \param [out] v The specific AttributeValue to set.
    * \returns true if the member value could be retrieved successfully
    */
   virtual bool DoGet (const T *object, U *v) const = 0;
@@ -241,11 +242,11 @@
  *
  * MakeAccessorHelper implementation for a class data member.
  *
- * \tparam V  The specific AttributeValue type to use to represent
+ * \tparam V  \explicit The specific AttributeValue type to use to represent
  *            the Attribute.
- * \tparam T  The class holding the data member.
- * \tparam U  The type of the data member.
- * \param  memberVariable  The address of the data member.
+ * \tparam T  \deduced The class holding the data member.
+ * \tparam U  \deduced The type of the data member.
+ * \param [in]  memberVariable  The address of the data member.
  * \returns The AttributeAccessor.
  */
 template <typename V, typename T, typename U>
@@ -259,7 +260,7 @@
 public:
     /*
      * Construct from a class data member address.
-     * \param memberVariable The class data member address.
+     * \param [in] memberVariable The class data member address.
      */
     MemberVariable (U T::*memberVariable)
       : AccessorHelper<T,V> (),
@@ -298,11 +299,11 @@
  *
  * MakeAccessorHelper implementation for a class get functor method.
  *
- * \tparam V  The specific AttributeValue type to use to represent
+ * \tparam V  \explicit The specific AttributeValue type to use to represent
  *            the Attribute.
- * \tparam T  The class holding the get functor method.
- * \tparam U  The return type of the get functor method.
- * \param  getter  The address of the class get functor method.
+ * \tparam T  \deduced The class holding the get functor method.
+ * \tparam U  \deduced The return type of the get functor method.
+ * \param [in] getter  The address of the class get functor method.
  * \returns The AttributeAccessor.
  */
 template <typename V, typename T, typename U>
@@ -316,7 +317,7 @@
 public:
     /*
      * Construct from a class get functor method.
-     * \param getter The class get functor method pointer.
+     * \param [in] getter The class get functor method pointer.
      */
     MemberMethod (U (T::*getter)(void) const)
       : AccessorHelper<T,V> (),
@@ -348,11 +349,11 @@
  * MakeAccessorHelper implementation for a class set method
  * returning void.
  *
- * \tparam V  The specific AttributeValue type to use to represent
+ * \tparam V  \explicit The specific AttributeValue type to use to represent
  *            the Attribute.
- * \tparam T  The class holding the set method.
- * \tparam U  The argument type of the set method.
- * \param  setter  The address of the class set method, returning void.
+ * \tparam T  \deduced The class holding the set method.
+ * \tparam U  \deduced The argument type of the set method.
+ * \param [in] setter  The address of the class set method, returning void.
  * \returns The AttributeAccessor.
  */
 template <typename V, typename T, typename U>
@@ -366,7 +367,7 @@
 public:
     /*
      * Construct from a class set method.
-     * \param setter The class set method pointer.
+     * \param [in] setter The class set method pointer.
      */
     MemberMethod (void (T::*setter)(U))
       : AccessorHelper<T,V> (),
@@ -406,13 +407,13 @@
  *
  * The two versions of this function differ only in argument order.
  *
- * \tparam W  The specific AttributeValue type to use to represent
+ * \tparam W  \explicit The specific AttributeValue type to use to represent
  *            the Attribute.
- * \tparam T  The class holding the functor methods.
- * \tparam U  The argument type of the set method.
- * \tparam V  The return type of the get functor method.
- * \param  setter  The address of the class set method, returning void.
- * \param  getter  The address of the class get functor method.
+ * \tparam T  \deduced The class holding the functor methods.
+ * \tparam U  \deduced The argument type of the set method.
+ * \tparam V  \deduced The return type of the get functor method.
+ * \param [in] setter The address of the class set method, returning void.
+ * \param [in] getter The address of the class get functor method.
  * \returns The AttributeAccessor.
  */
 template <typename W, typename T, typename U, typename V>
@@ -430,8 +431,8 @@
 public:
     /*
      * Construct from class get functor and set methods.
-     * \param setter The class set method pointer, returning void.
-     * \param getter The class get functor method pointer.
+     * \param [in] setter The class set method pointer, returning void.
+     * \param [in] getter The class get functor method pointer.
      */
     MemberMethod (void (T::*setter)(U),
                   V (T::*getter)(void) const)
@@ -489,13 +490,13 @@
  *
  * The two versions of this function differ only in argument order.
  *
- * \tparam W  The specific AttributeValue type to use to represent
+ * \tparam W  \explicit The specific AttributeValue type to use to represent
  *            the Attribute.
- * \tparam T  The class holding the functor methods.
- * \tparam U  The argument type of the set method.
- * \tparam V  The return type of the get functor method.
- * \param  setter  The address of the class set method, returning bool.
- * \param  getter  The address of the class get functor method.
+ * \tparam T  \deduced The class holding the functor methods.
+ * \tparam U  \deduced The argument type of the set method.
+ * \tparam V  \deduced The return type of the get functor method.
+ * \param [in] setter The address of the class set method, returning bool.
+ * \param [in] getter The address of the class get functor method.
  * \returns The AttributeAccessor.
  */
 template <typename W, typename T, typename U, typename V>
@@ -513,8 +514,8 @@
 public:
     /*
      * Construct from class get functor and set method, returning bool.
-     * \param setter The class set method pointer, returning bool.
-     * \param getter The class get functor method pointer.
+     * \param [in] setter The class set method pointer, returning bool.
+     * \param [in] getter The class get functor method pointer.
      */
     MemberMethod (bool (T::*setter)(U),
                   V (T::*getter)(void) const)
diff -Naur ns-3.23/src/core/model/attribute.h ns-3.24/src/core/model/attribute.h
--- ns-3.23/src/core/model/attribute.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/attribute.h	2015-09-15 11:18:44.000000000 -0700
@@ -76,8 +76,8 @@
    */
   virtual Ptr<AttributeValue> Copy (void) const = 0;
   /**
-   * \param checker the checker associated to the attribute
-   * \returns a string representation of this value.
+   * \param [in] checker The checker associated to the attribute
+   * \returns A string representation of this value.
    *
    * In most cases, this method will not make any use of the checker argument.
    * However, in a very limited set of cases, the checker argument is needed to
@@ -86,8 +86,8 @@
    */
   virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const = 0;
   /**
-   * \param value a string representation of the value
-   * \param checker a pointer to the checker associated to the attribute.
+   * \param [in] value A string representation of the value
+   * \param [in] checker A pointer to the checker associated to the attribute.
    * \returns true if the input string was correctly-formatted and could be
    *          successfully deserialized, false otherwise.
    *
@@ -118,8 +118,8 @@
   virtual ~AttributeAccessor ();
 
   /**
-   * \param object the object instance to set the value in
-   * \param value the value to set
+   * \param [in,out] object The object instance to set the value in
+   * \param [in] value The value to set
    * \returns true if the value could be set successfully, false otherwise.
    *
    * This method expects that the caller has checked that the input value is
@@ -127,8 +127,8 @@
    */
   virtual bool Set (ObjectBase * object, const AttributeValue &value) const = 0;
   /**
-   * \param object the object instance to get the value from
-   * \param attribute a pointer to where the value should be set.
+   * \param [in,out] object The object instance to get the value from
+   * \param [out] attribute A pointer to where the value should be set.
    * \returns true if the value could be read successfully, and
    *          stored in the input value, false otherwise.
    *
@@ -173,12 +173,12 @@
    * Create a valid value from the argument value,
    * or reinterpret the argument as a string.
    *
-   * \param value the AttributeValue to check
+   * \param [in] value The AttributeValue to check
    * \return Ptr to a valid value
    */
   Ptr<AttributeValue> CreateValidValue (const AttributeValue &value) const;
   /**
-   * \param value a pointer to the value to check
+   * \param [in] value A pointer to the value to check
    * \returns true if the input value is both of the right type
    *          and if its value is within the requested range. Returns
    *          false otherwise.
@@ -217,8 +217,8 @@
   /**
    * Copy the source to the destination
 
-   * \param source source AttributeValue
-   * \param destination destination AttributeValue
+   * \param [in] source Source AttributeValue
+   * \param [out] destination Destination AttributeValue
    * \return true if copy was successful
    */
   virtual bool Copy (const AttributeValue &source, AttributeValue &destination) const = 0;
@@ -242,15 +242,15 @@
    */
   virtual Ptr<AttributeValue> Copy (void) const;
   /**
-   * \param checker the checker associated to the attribute
+   * \param [in] checker The checker associated to the attribute
    * \returns a string representation of this value.
    *
    * In the EmptyAttributeValue case, the string returned will be simply ""
    */
   virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
   /**
-   * \param value a string representation of the value
-   * \param checker a pointer to the checker associated to the attribute.
+   * \param [in] value A string representation of the value
+   * \param [in] checker A pointer to the checker associated to the attribute.
    * \returns true if the input string was correctly-formatted and could be
    *          successfully deserialized, false otherwise.
    *
diff -Naur ns-3.23/src/core/model/attribute-helper.h ns-3.24/src/core/model/attribute-helper.h
--- ns-3.23/src/core/model/attribute-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/attribute-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -85,12 +85,12 @@
  *
  * A simple string-based attribute checker
  *
- * \tparam T    The specific AttributeValue type used to represent
+ * \tparam T    \explicit The specific AttributeValue type used to represent
  *              the Attribute.
- * \tparam BASE The AttributeChecker type corresponding to \p T.
- * \param name  The name of the AttributeValue type, essentially the
+ * \tparam BASE \explicit The AttributeChecker type corresponding to \p T.
+ * \param [in] name  The name of the AttributeValue type, essentially the
  *              string form of \p T.
- * \param underlying Underlying type name.
+ * \param [in] underlying Underlying type name.
  * \return Ptr to AttributeChecker.
  */
 template <typename T, typename BASE>
@@ -141,7 +141,7 @@
  * Define the attribute accessor functions \c MakeTypeAccessor
  * for class \p type.
  *
- * \param type the name of the class
+ * \param [in] type The name of the class
  *
  * This macro defines and generates the code for the implementation 
  * of the \c MakeTypeAccessor template functions. This macro is typically
@@ -167,8 +167,8 @@
  * Declare the attribute value class \p \<name>Value
  * for underlying class \p type.
  *
- * \param type The underlying type name
- * \param name The token to use in defining the accessor name.
+ * \param [in] type The underlying type name
+ * \param [in] name The token to use in defining the accessor name.
  *
  * This macro declares the class \c TypeValue associated with class \c type.
  * This macro is typically invoked in the class header file.
@@ -207,7 +207,7 @@
  * Declare the attribute value class \p \<Name>Value
  * for the class \p Name
  *
- * \param Name the name of the class.
+ * \param [in] Name The name of the class.
  *
  * This macro declares the class \c NameValue associated to class \c Name.
  * This macro is typically invoked in the class header file.
@@ -222,7 +222,7 @@
  * Define the conversion operators class \p type and
  * Attribute instances.
  *
- * \param type the name of the class
+ * \param [in] type The name of the class
  *
  * This macro defines the conversion operators for class \c type to and
  * from instances of type Attribute.
@@ -239,7 +239,7 @@
  * Declare the AttributeChecker class \p \<type>Checker
  * and the \c MakeTypeChecker function for class \p type.
  *
- * \param type the name of the class
+ * \param [in] type The name of the class
  *
  * This macro declares the \p \<type>Checker class and the associated
  * \c MakeTypeChecker function.
@@ -261,8 +261,8 @@
  * the attribute value class \p \<name>Value 
  * of the underlying class \p type.
  *
- * \param type The underlying type name
- * \param name The token to use in defining the accessor name.
+ * \param [in] type The underlying type name
+ * \param [in] name The token to use in defining the accessor name.
  *
  * This macro implements the \p \<type>Value class methods
  * (including the \p \<type>Value::SerializeToString
@@ -305,7 +305,7 @@
  * Define the class methods belonging to
  * attribute value class \p \<type>Value for class \p type.
  *
- * \param type the name of the class.
+ * \param [in] type The name of the class.
  *
  * This macro implements the \p \<type>Value class methods
  * (including the \p \<type>Value::SerializeToString
@@ -322,7 +322,7 @@
  *
  * Define the \c MakeTypeChecker function for class \p type.
  *
- * \param type the name of the class
+ * \param [in] type The name of the class
  *
  * This macro implements the \c MakeTypeChecker function.
  *
@@ -339,8 +339,8 @@
  *
  * Define the \c MakeTypeChecker function for class \p type.
  *
- * \param type the name of the class.
- * \param name the string name of the underlying type.
+ * \param [in] type The name of the class.
+ * \param [in] name The string name of the underlying type.
  *
  * This macro implements the \c MakeTypeChecker function
  * for class \p type.
@@ -358,7 +358,7 @@
  *
  * Declare the attribute value, accessor and checkers for class \p type
  *
- * \param type the name of the class
+ * \param [in] type The name of the class
  *
  * This macro declares:
  *
@@ -384,7 +384,7 @@
  *
  * Define the attribute value, accessor and checkers for class \p type
  *
- * \param type the name of the class
+ * \param [in] type The name of the class
  *
  * This macro implements
  *
diff -Naur ns-3.23/src/core/model/build-profile.h ns-3.24/src/core/model/build-profile.h
--- ns-3.23/src/core/model/build-profile.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/core/model/build-profile.h	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,93 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015 LLNL
+ *
+ * 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_BUILD_PROFILE_H
+#define NS3_BUILD_PROFILE_H
+
+/**
+ * \file
+ * \ingroup debugging
+ * Definition of build profile macros NS_BUILD_DEBUG, NS_BUILD_RELEASE,
+ * and NS_BUILD_OPTIMIZED.
+ */
+
+/**
+ * \ingroup debugging
+ * Build profile no-op macro.
+ * \param [in] code The code to skip.
+ */
+#define NS_BUILD_PROFILE_NOOP(code)             \
+  do                                            \
+      if (false)                                \
+        {                                       \
+          code ;                                \
+        }                                       \
+  while (false)
+
+/**
+ * \ingroup debugging
+ * Build profile macro to execute a code snippet.
+ * \param [in] code The code to execute.
+ */
+#define NS_BUILD_PROFILE_OP(code) \
+  do                                            \
+    {                                           \
+      code ;                                    \
+    }                                           \
+  while (false)
+
+
+#ifdef NS3_BUILD_PROFILE_DEBUG
+/**
+ * \ingroup debugging
+ * Execute a code snippet in debug builds.
+ * \param [in] code The code to execute.
+ */
+#define NS_BUILD_DEBUG(code)     NS_BUILD_PROFILE_OP (code)
+#else
+#define NS_BUILD_DEBUG(code)     NS_BUILD_PROFILE_NOOP (code)
+#endif
+
+#ifdef NS3_BUILD_PROFILE_RELEASE
+/**
+ * \ingroup debugging
+ * Execute a code snippet in release builds.
+ * \param [in] code The code to execute.
+ */
+#define NS_BUILD_RELEASE(code)   NS_BUILD_PROFILE_OP (code)
+#else
+#define NS_BUILD_RELEASE(code)   NS_BUILD_PROFILE_NOOP (code)
+#endif
+
+#ifdef NS3_BUILD_PROFILE_OPTIMIZED
+/**
+ * \ingroup debugging
+ * Execute a code snippet in optimized builds.
+ * \param [in] code The code to execute.
+ */
+#define NS_BUILD_OPTIMIZED(code) NS_BUILD_PROFILE_OP (code)
+#else
+#define NS_BUILD_OPTIMIZED(code) NS_BUILD_PROFILE_NOOP (code)
+#endif
+
+
+
+
+#endif /* NS3_BUILD_PROFILE_H */
diff -Naur ns-3.23/src/core/model/cairo-wideint.c ns-3.24/src/core/model/cairo-wideint.c
--- ns-3.23/src/core/model/cairo-wideint.c	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/cairo-wideint.c	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,4 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /* cairo - a vector graphics library with display and print output
  *
  * Copyright © 2004 Keith Packard
diff -Naur ns-3.23/src/core/model/cairo-wideint-private.h ns-3.24/src/core/model/cairo-wideint-private.h
--- ns-3.23/src/core/model/cairo-wideint-private.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/cairo-wideint-private.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,4 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /* cairo - a vector graphics library with display and print output
  *
  * Copyright © 2004 Keith Packard
diff -Naur ns-3.23/src/core/model/calendar-scheduler.h ns-3.24/src/core/model/calendar-scheduler.h
--- ns-3.23/src/core/model/calendar-scheduler.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/calendar-scheduler.h	2015-09-15 11:18:44.000000000 -0700
@@ -39,58 +39,113 @@
  * \ingroup scheduler
  * \brief a calendar queue event scheduler
  *
- * This event scheduler is a direct implementation of the algorithm known as a calendar queue.
- * first published in 1988 in "Calendar Queues: A Fast O(1) Priority Queue Implementation for
- * the Simulation Event Set Problem" by Randy Brown. There are many refinements published
- * later but this class implements the original algorithm (to the best of my knowledge).
+ * This event scheduler is a direct implementation of the algorithm
+ * known as a calendar queue, first published in 1988 in
+ * "Calendar Queues: A Fast O(1) Priority Queue Implementation for
+ * the Simulation Event Set Problem" by Randy Brown. There are many
+ * refinements published later but this class implements
+ * the original algorithm (to the best of my knowledge).
  *
- * Note: This queue is much slower than I expected (much slower than the std::map queue)
- * and this seems to be because the original resizing policy is horribly bad. This is
- * most likely the reason why there have been so many variations published which all
- * slightly tweak the resizing heuristics to obtain a better distribution of events
- * across buckets.
+ * \note
+ * This queue is much slower than I expected (much slower than the
+ * std::map queue) and this seems to be because the original resizing policy
+ * is horribly bad.  This is most likely the reason why there have been
+ * so many variations published which all slightly tweak the resizing
+ * heuristics to obtain a better distribution of events across buckets.
  */
 class CalendarScheduler : public Scheduler
 {
 public:
+  /**
+   *  Register this type.
+   *  \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
+  /** Constructor. */
   CalendarScheduler ();
+  /** Destructor. */
   virtual ~CalendarScheduler ();
 
-  virtual void Insert (const Event &ev);
+  // Inherited
+  virtual void Insert (const Scheduler::Event &ev);
   virtual bool IsEmpty (void) const;
-  virtual Event PeekNext (void) const;
-  virtual Event RemoveNext (void);
-  virtual void Remove (const Event &ev);
+  virtual Scheduler::Event PeekNext (void) const;
+  virtual Scheduler::Event RemoveNext (void);
+  virtual void Remove (const Scheduler::Event &ev);
 
 private:
+  /** Double the number of buckets if necessary. */
   void ResizeUp (void);
+  /** Halve the number of buckets if necessary. */
   void ResizeDown (void);
+  /**
+   * Resize to a new number of buckets, with automatically computed width.
+   *
+   * \param [in] newSize The new number of buckets.
+   */
   void Resize (uint32_t newSize);
+  /**
+   * Compute the new bucket size, based on up to the first 25 entries.
+   *
+   * \returns The new width.
+   */
   uint32_t CalculateNewWidth (void);
+  /**
+   * Initialize the calendar queue.
+   *
+   * \param [in] nBuckets The number of buckets.
+   * \param [in] width The bucket size, in dimensionless time units.
+   * \param [in] startPrio The starting time.
+   */
   void Init (uint32_t nBuckets,
              uint64_t width,
              uint64_t startPrio);
+  /**
+   * Hash the dimensionless time to a bucket.
+   *
+   * \param [in] key The dimensionless time.
+   * \returns The bucket index.
+   */
   inline uint32_t Hash (uint64_t key) const;
+  /** Print the configuration and bucket size distribution. */
   void PrintInfo (void);
+  /**
+   * Resize the number of buckets and width.
+   *
+   * \param [in] newSize The number of buckets.
+   * \param [in] newWidth The size of the new buckets.
+   */
   void DoResize (uint32_t newSize, uint32_t newWidth);
+  /**
+   * Remove the earliest event.
+   *
+   * \returns The earliest event.
+   */
   Scheduler::Event DoRemoveNext (void);
-  void DoInsert (const Event &ev);
+  /**
+   * Insert a new event in to the correct bucket.
+   *
+   * \param [in] ev The new Event.
+   */
+  void DoInsert (const Scheduler::Event &ev);
 
+  /** Calendar bucket type: a list of Events. */
   typedef std::list<Scheduler::Event> Bucket;
+  
+  /** Array of buckets. */
   Bucket *m_buckets;
-  // number of buckets in array
+  /** Number of buckets in the array. */
   uint32_t m_nBuckets;
-  // duration of a bucket
+  /** Duration of a bucket, in dimensionless time units. */
   uint64_t m_width;
-  // bucket index from which the last event was dequeued
+  /** Bucket index from which the last event was dequeued. */
   uint32_t m_lastBucket;
-  // priority at the top of the bucket from which last event was dequeued
+  /** Priority at the top of the bucket from which last event was dequeued. */
   uint64_t m_bucketTop;
-  // the priority of the last event removed
+  /** The priority of the last event removed. */
   uint64_t m_lastPrio;
-  // number of events in queue
+  /** Number of events in queue. */
   uint32_t m_qSize;
 };
 
diff -Naur ns-3.23/src/core/model/callback.cc ns-3.24/src/core/model/callback.cc
--- ns-3.23/src/core/model/callback.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/callback.cc	2015-09-15 11:18:44.000000000 -0700
@@ -85,7 +85,7 @@
 namespace ns3 {
 
 std::string
-CallbackBase::Demangle (const std::string& mangled)
+CallbackImplBase::Demangle (const std::string& mangled)
 {
   NS_LOG_FUNCTION (mangled);
 
diff -Naur ns-3.23/src/core/model/callback.h ns-3.24/src/core/model/callback.h
--- ns-3.23/src/core/model/callback.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/callback.h	2015-09-15 11:18:44.000000000 -0700
@@ -122,8 +122,8 @@
 struct CallbackTraits<T *>
 {
   /**
-   * \param p object pointer
-   * \return a reference to the object pointed to by p
+   * \param [in] p Object pointer
+   * \return A reference to the object pointed to by p
    */
   static T & GetReference (T * const p)
   {
@@ -144,10 +144,41 @@
   /**
    * Equality test
    *
-   * \param other Callback Ptr
-   * \return true if we are equal
+   * \param [in] other Callback Ptr
+   * \return \c true if we are equal
    */
   virtual bool IsEqual (Ptr<const CallbackImplBase> other) const = 0;
+  /** Get the type as a string. */
+  virtual std::string GetTypeid (void) const = 0;
+
+protected:
+  /**
+   * \param [in] mangled The mangled string
+   * \return The demangled form of mangled
+   */
+  static std::string Demangle (const std::string& mangled);
+  /**
+   * Helper to get the C++ typeid as a string.
+   *
+   * \tparam T The type of the argument.
+   * \param t The object.
+   * \returns The result of applying typeid to the argument.
+   */
+  template <typename T>
+  static std::string GetCppTypeid (void)
+  {
+    std::string typeName;
+    try
+      {
+        typeName = typeid (T).name ();
+        typeName = Demangle (typeName);
+      }
+    catch (const std::bad_typeid &e)
+      {
+        typeName = e.what ();
+      }
+    return typeName;
+  }
 };
 
 /**
@@ -169,6 +200,17 @@
 public:
   virtual ~CallbackImpl () {}
   virtual R operator() (void) = 0;      //!< Abstract operator
+  virtual std::string GetTypeid (void) const
+  {
+    return DoGetTypeid ();
+  }
+  static std::string DoGetTypeid (void)
+  {
+    static std::string id = "CallbackImpl<" +
+      GetCppTypeid<R> () +
+      ">";
+    return id;
+  }
 };
 /** CallbackImpl class with one argument. */
 template <typename R, typename T1>
@@ -176,6 +218,18 @@
 public:
   virtual ~CallbackImpl () {}
   virtual R operator() (T1) = 0;        //!< Abstract operator
+  virtual std::string GetTypeid (void) const
+  {
+    return DoGetTypeid ();
+  }
+  static std::string DoGetTypeid (void)
+  {
+    static std::string id = "CallbackImpl<" +
+      GetCppTypeid<R> () + "," +
+      GetCppTypeid<T1> () +
+      ">";
+    return id;
+  }
 };
 /** CallbackImpl class with two arguments. */
 template <typename R, typename T1, typename T2>
@@ -183,6 +237,19 @@
 public:
   virtual ~CallbackImpl () {}
   virtual R operator() (T1, T2) = 0;    //!< Abstract operator
+  virtual std::string GetTypeid (void) const
+  {
+    return DoGetTypeid ();
+  }
+  static std::string DoGetTypeid (void)
+  {
+    static std::string id = "CallbackImpl<" +
+      GetCppTypeid<R> () + "," +
+      GetCppTypeid<T1> () + "," +
+      GetCppTypeid<T2> () +
+      ">";
+    return id;
+  }
 };
 /** CallbackImpl class with three arguments. */
 template <typename R, typename T1, typename T2, typename T3>
@@ -190,6 +257,20 @@
 public:
   virtual ~CallbackImpl () {}
   virtual R operator() (T1, T2, T3) = 0;  //!< Abstract operator
+  virtual std::string GetTypeid (void) const
+  {
+    return DoGetTypeid ();
+  }
+  static std::string DoGetTypeid (void)
+  {
+    static std::string id = "CallbackImpl<" +
+      GetCppTypeid<R> () + "," +
+      GetCppTypeid<T1> () + "," +
+      GetCppTypeid<T2> () + "," +
+      GetCppTypeid<T3> () +
+      ">";
+    return id;
+  }
 };
 /** CallbackImpl class with four arguments. */
 template <typename R, typename T1, typename T2, typename T3, typename T4>
@@ -197,6 +278,21 @@
 public:
   virtual ~CallbackImpl () {}
   virtual R operator() (T1, T2, T3, T4) = 0;  //!< Abstract operator
+  virtual std::string GetTypeid (void) const
+  {
+    return DoGetTypeid ();
+  }
+  static std::string DoGetTypeid (void)
+  {
+    static std::string id = "CallbackImpl<" +
+      GetCppTypeid<R> () + "," +
+      GetCppTypeid<T1> () + "," +
+      GetCppTypeid<T2> () + "," +
+      GetCppTypeid<T3> () + "," +
+      GetCppTypeid<T4> () +
+      ">";
+    return id;
+  }
 };
 /** CallbackImpl class with five arguments. */
 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
@@ -204,6 +300,22 @@
 public:
   virtual ~CallbackImpl () {}
   virtual R operator() (T1, T2, T3, T4, T5) = 0;  //!< Abstract operator
+  virtual std::string GetTypeid (void) const
+  {
+    return DoGetTypeid ();
+  }
+  static std::string DoGetTypeid (void)
+  {
+    static std::string id = "CallbackImpl<" +
+      GetCppTypeid<R> () + "," +
+      GetCppTypeid<T1> () + "," +
+      GetCppTypeid<T2> () + "," +
+      GetCppTypeid<T3> () + "," +
+      GetCppTypeid<T4> () + "," +
+      GetCppTypeid<T5> () +
+      ">";
+    return id;
+  }
 };
 /** CallbackImpl class with six arguments. */
 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
@@ -211,6 +323,23 @@
 public:
   virtual ~CallbackImpl () {}
   virtual R operator() (T1, T2, T3, T4, T5, T6) = 0;  //!< Abstract operator
+  virtual std::string GetTypeid (void) const
+  {
+    return DoGetTypeid ();
+  }
+  static std::string DoGetTypeid (void)
+  {
+    static std::string id = "CallbackImpl<" +
+      GetCppTypeid<R> () + "," +
+      GetCppTypeid<T1> () + "," +
+      GetCppTypeid<T2> () + "," +
+      GetCppTypeid<T3> () + "," +
+      GetCppTypeid<T4> () + "," +
+      GetCppTypeid<T5> () + "," +
+      GetCppTypeid<T6> () +
+      ">";
+    return id;
+  }
 };
 /** CallbackImpl class with seven arguments. */
 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
@@ -218,6 +347,24 @@
 public:
   virtual ~CallbackImpl () {}
   virtual R operator() (T1, T2, T3, T4, T5, T6, T7) = 0;  //!< Abstract operator
+  virtual std::string GetTypeid (void) const
+  {
+    return DoGetTypeid ();
+  }
+  static std::string DoGetTypeid (void)
+  {
+    static std::string id = "CallbackImpl<" +
+      GetCppTypeid<R> () + "," +
+      GetCppTypeid<T1> () + "," +
+      GetCppTypeid<T2> () + "," +
+      GetCppTypeid<T3> () + "," +
+      GetCppTypeid<T4> () + "," +
+      GetCppTypeid<T5> () + "," +
+      GetCppTypeid<T6> () + "," +
+      GetCppTypeid<T7> () +
+      ">";
+    return id;
+  }
 };
 /** CallbackImpl class with eight arguments. */
 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
@@ -225,6 +372,25 @@
 public:
   virtual ~CallbackImpl () {}
   virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8) = 0;  //!< Abstract operator
+  virtual std::string GetTypeid (void) const
+  {
+    return DoGetTypeid ();
+  }
+  static std::string DoGetTypeid (void)
+  {
+    static std::string id = "CallbackImpl<" +
+      GetCppTypeid<R> () + "," +
+      GetCppTypeid<T1> () + "," +
+      GetCppTypeid<T2> () + "," +
+      GetCppTypeid<T3> () + "," +
+      GetCppTypeid<T4> () + "," +
+      GetCppTypeid<T5> () + "," +
+      GetCppTypeid<T6> () + "," +
+      GetCppTypeid<T7> () + "," +
+      GetCppTypeid<T8> () +
+      ">";
+    return id;
+  }
 };
 /** CallbackImpl class with nine arguments. */
 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
@@ -232,6 +398,26 @@
 public:
   virtual ~CallbackImpl () {}
   virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8, T9) = 0;  //!< Abstract operator
+  virtual std::string GetTypeid (void) const
+  {
+    return DoGetTypeid ();
+  }
+  static std::string DoGetTypeid (void)
+  {
+    static std::string id = "CallbackImpl<" +
+      GetCppTypeid<R> () + "," +
+      GetCppTypeid<T1> () + "," +
+      GetCppTypeid<T2> () + "," +
+      GetCppTypeid<T3> () + "," +
+      GetCppTypeid<T4> () + "," +
+      GetCppTypeid<T5> () + "," +
+      GetCppTypeid<T6> () + "," +
+      GetCppTypeid<T7> () + "," +
+      GetCppTypeid<T8> () + "," +
+      GetCppTypeid<T9> () +
+      ">";
+    return id;
+  }
 };
 /**@}*/
 
@@ -246,7 +432,7 @@
   /**
    * Construct from a functor
    *
-   * \param functor the functor 
+   * \param [in] functor The functor 
    */
   FunctorCallbackImpl (T const &functor)
     : m_functor (functor) {}
@@ -260,99 +446,99 @@
     return m_functor ();
   }
   /**
-   * \param a1 first argument
+   * \param [in] a1 First argument
    * \return Callback value
    */
   R operator() (T1 a1) {
     return m_functor (a1);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2) {
     return m_functor (a1,a2);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3) {
     return m_functor (a1,a2,a3);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
     return m_functor (a1,a2,a3,a4);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
     return m_functor (a1,a2,a3,a4,a5);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
     return m_functor (a1,a2,a3,a4,a5,a6);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
     return m_functor (a1,a2,a3,a4,a5,a6,a7);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
-   * \param a8 eighth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
+   * \param [in] a8 eighth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
     return m_functor (a1,a2,a3,a4,a5,a6,a7,a8);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
-   * \param a8 eighth argument
-   * \param a9 ninth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
+   * \param [in] a8 eighth argument
+   * \param [in] a9 ninth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) {
@@ -362,8 +548,8 @@
   /**
    * Equality test.
    *
-   * \param other CallbackImpl Ptr
-   * \return true if this and other have the same functor
+   * \param [in] other CallbackImpl Ptr
+   * \return \c true if this and other have the same functor
    */
   virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
     FunctorCallbackImpl<T,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived = 
@@ -392,8 +578,8 @@
   /**
    * Construct from an object pointer and member function pointer
    *
-   * \param objPtr the object pointer
-   * \param memPtr the object class member function
+   * \param [in] objPtr The object pointer
+   * \param [in] memPtr The object class member function
    */
   MemPtrCallbackImpl (OBJ_PTR const&objPtr, MEM_PTR memPtr)
     : m_objPtr (objPtr), m_memPtr (memPtr) {}
@@ -407,99 +593,99 @@
     return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)();
   }
   /**
-   * \param a1 first argument
+   * \param [in] a1 First argument
    * \return Callback value
    */
   R operator() (T1 a1) {
     return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2) {
     return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3) {
     return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
     return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
     return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
     return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
     return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
-   * \param a8 eighth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
+   * \param [in] a8 Eighth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
     return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr)(a1, a2, a3, a4, a5, a6, a7, a8);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
-   * \param a8 eighth argument
-   * \param a9 ninth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
+   * \param [in] a8 Eighth argument
+   * \param [in] a9 Ninth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) {
@@ -509,8 +695,8 @@
   /**
    * Equality test.
    *
-   * \param other Callback Ptr
-   * \return true if we have the same object and member function
+   * \param [in] other Callback Ptr
+   * \return \c true if we have the same object and member function
    */
   virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
     MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived = 
@@ -540,8 +726,8 @@
 public:
   /**
    * Construct from functor and a bound argument
-   * \param functor the functor 
-   * \param a the argument to bind
+   * \param [in] functor The functor 
+   * \param [in] a The argument to bind
    */
   template <typename FUNCTOR, typename ARG>
   BoundFunctorCallbackImpl (FUNCTOR functor, ARG a)
@@ -556,84 +742,84 @@
     return m_functor (m_a);
   }
   /**
-   * \param a1 first argument
+   * \param [in] a1 First argument
    * \return Callback value
    */
   R operator() (T1 a1) {
     return m_functor (m_a,a1);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2) {
     return m_functor (m_a,a1,a2);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3) {
     return m_functor (m_a,a1,a2,a3);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
     return m_functor (m_a,a1,a2,a3,a4);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
     return m_functor (m_a,a1,a2,a3,a4,a5);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
     return m_functor (m_a,a1,a2,a3,a4,a5,a6);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
     return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
-   * \param a8 eighth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
+   * \param [in] a8 Eighth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
@@ -643,8 +829,8 @@
   /**
    * Equality test.
    *
-   * \param other Callback Ptr
-   * \return true if we have the same functor and bound arguments
+   * \param [in] other Callback Ptr
+   * \return \c true if we have the same functor and bound arguments
    */
   virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
     BoundFunctorCallbackImpl<T,R,TX,T1,T2,T3,T4,T5,T6,T7,T8> const *otherDerived = 
@@ -674,9 +860,9 @@
 public:
   /**
    * Construct from functor and two arguments
-   * \param functor the functor
-   * \param arg1 the first argument to bind
-   * \param arg2 the second argument to bind
+   * \param [in] functor The functor
+   * \param [in] arg1 The first argument to bind
+   * \param [in] arg2 The second argument to bind
    */
   template <typename FUNCTOR, typename ARG1, typename ARG2>
   TwoBoundFunctorCallbackImpl (FUNCTOR functor, ARG1 arg1, ARG2 arg2)
@@ -691,70 +877,70 @@
     return m_functor (m_a1,m_a2);
   }
   /**
-   * \param a1 first argument
+   * \param [in] a1 First argument
    * \return Callback value
    */
   R operator() (T1 a1) {
     return m_functor (m_a1,m_a2,a1);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2) {
     return m_functor (m_a1,m_a2,a1,a2);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3) {
     return m_functor (m_a1,m_a2,a1,a2,a3);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
     return m_functor (m_a1,m_a2,a1,a2,a3,a4);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
     return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
     return m_functor (m_a1,m_a2,a1,a2,a3,a4,a5,a6);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
@@ -764,8 +950,8 @@
   /**
    * Equality test.
    *
-   * \param other Callback Ptr
-   * \return true if we have the same functor and bound arguments
+   * \param [in] other Callback Ptr
+   * \return \c true if we have the same functor and bound arguments
    */
   virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
     TwoBoundFunctorCallbackImpl<T,R,TX1,TX2,T1,T2,T3,T4,T5,T6,T7> const *otherDerived = 
@@ -796,10 +982,10 @@
 public:
   /**
    * Construct from functor and three arguments
-   * \param functor the functor
-   * \param arg1 the first argument to bind
-   * \param arg2 the second argument to bind
-   * \param arg3 the third argument to bind
+   * \param [in] functor The functor
+   * \param [in] arg1 The first argument to bind
+   * \param [in] arg2 The second argument to bind
+   * \param [in] arg3 The third argument to bind
    */
   template <typename FUNCTOR, typename ARG1, typename ARG2, typename ARG3>
   ThreeBoundFunctorCallbackImpl (FUNCTOR functor, ARG1 arg1, ARG2 arg2, ARG3 arg3)
@@ -814,57 +1000,57 @@
     return m_functor (m_a1,m_a2,m_a3);
   }
   /**
-   * \param a1 first argument
+   * \param [in] a1 First argument
    * \return Callback value
    */
   R operator() (T1 a1) {
     return m_functor (m_a1,m_a2,m_a3,a1);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2) {
     return m_functor (m_a1,m_a2,m_a3,a1,a2);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3) {
     return m_functor (m_a1,m_a2,m_a3,a1,a2,a3);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
     return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
     return m_functor (m_a1,m_a2,m_a3,a1,a2,a3,a4,a5);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
    * \return Callback value
    */
   R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
@@ -874,8 +1060,8 @@
   /**
    * Equality test.
    *
-   * \param other Callback Ptr
-   * \return true if we have the same functor and bound arguments
+   * \param [in] other Callback Ptr
+   * \return \c true if we have the same functor and bound arguments
    */
   virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
     ThreeBoundFunctorCallbackImpl<T,R,TX1,TX2,TX3,T1,T2,T3,T4,T5,T6> const *otherDerived = 
@@ -906,21 +1092,15 @@
 class CallbackBase {
 public:
   CallbackBase () : m_impl () {}
-  /** \return the impl pointer */
+  /** \return The impl pointer */
   Ptr<CallbackImplBase> GetImpl (void) const { return m_impl; }
 protected:
   /**
    * Construct from a pimpl
-   * \param impl the CallbackImplBase Ptr
+   * \param [in] impl The CallbackImplBase Ptr
    */
   CallbackBase (Ptr<CallbackImplBase> impl) : m_impl (impl) {}
   Ptr<CallbackImplBase> m_impl;         //!< the pimpl
-
-  /**
-   * \param mangled the mangled string
-   * \return the demangled form of mangled
-   */
-  static std::string Demangle (const std::string& mangled);
 };
 
 /**
@@ -988,7 +1168,7 @@
   /**
    * Construct a functor call back, supporting operator() calls
    *
-   * \param functor the functor to run on this callback
+   * \param [in] functor The functor to run on this callback
    *
    * \internal
    * There are two dummy args below to ensure that this constructor is
@@ -1002,8 +1182,8 @@
   /**
    * Construct a member function pointer call back.
    *
-   * \param objPtr pointer to the object
-   * \param memPtr  pointer to the member function
+   * \param [in] objPtr Pointer to the object
+   * \param [in] memPtr Pointer to the member function
    */
   template <typename OBJ_PTR, typename MEM_PTR>
   Callback (OBJ_PTR const &objPtr, MEM_PTR memPtr)
@@ -1013,7 +1193,7 @@
   /**
    * Construct from a CallbackImpl pointer
    *
-   * \param impl the CallbackImpl Ptr
+   * \param [in] impl The CallbackImpl Ptr
    */
   Callback (Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > const &impl)
     : CallbackBase (impl)
@@ -1022,8 +1202,8 @@
   /**
    * Bind the first arguments
    *
-   * \param a argument to bind
-   * \return the bound callback
+   * \param [in] a Argument to bind
+   * \return The bound callback
    */
   template <typename T>
   Callback<R,T2,T3,T4,T5,T6,T7,T8,T9> Bind (T a) {
@@ -1038,9 +1218,9 @@
   /**
    * Bind the first two arguments
    *
-   * \param a1 first argument to bind
-   * \param a2 second argument to bind
-   * \return the bound callback
+   * \param [in] a1 First argument to bind
+   * \param [in] a2 Second argument to bind
+   * \return The bound callback
    */
   template <typename TX1, typename TX2>
   Callback<R,T3,T4,T5,T6,T7,T8,T9> TwoBind (TX1 a1, TX2 a2) {
@@ -1055,10 +1235,10 @@
   /**
    * Bind the first three arguments
    *
-   * \param a1 first argument to bind
-   * \param a2 second argument to bind
-   * \param a3 third argument to bind
-   * \return the bound callback
+   * \param [in] a1 First argument to bind
+   * \param [in] a2 Second argument to bind
+   * \param [in] a3 Third argument to bind
+   * \return The bound callback
    */
   template <typename TX1, typename TX2, typename TX3>
   Callback<R,T4,T5,T6,T7,T8,T9> ThreeBind (TX1 a1, TX2 a2, TX3 a3) {
@@ -1073,7 +1253,7 @@
   /**
    * Check for null implementation
    *
-   * \return true if I don't have an implementation
+   * \return \c true if I don't have an implementation
    */
   bool IsNull (void) const {
     return (DoPeekImpl () == 0) ? true : false;
@@ -1092,99 +1272,99 @@
     return (*(DoPeekImpl ()))();
   }
   /**
-   * \param a1 first argument
+   * \param [in] a1 First argument
    * \return Callback value
    */
   R operator() (T1 a1) const {
     return (*(DoPeekImpl ()))(a1);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
    * \return Callback value
    */
   R operator() (T1 a1, T2 a2) const {
     return (*(DoPeekImpl ()))(a1,a2);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
    * \return Callback value
    */
   R operator() (T1 a1, T2 a2, T3 a3) const {
     return (*(DoPeekImpl ()))(a1,a2,a3);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
    * \return Callback value
    */
   R operator() (T1 a1, T2 a2, T3 a3, T4 a4) const {
     return (*(DoPeekImpl ()))(a1,a2,a3,a4);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
    * \return Callback value
    */
   R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5) const {
     return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
    * \return Callback value
    */
   R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6) const {
     return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
    * \return Callback value
    */
   R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7) const {
     return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
-   * \param a8 seventh argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
+   * \param [in] a8 Eighth argument
    * \return Callback value
    */
   R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) const {
     return (*(DoPeekImpl ()))(a1,a2,a3,a4,a5,a6,a7,a8);
   }
   /**
-   * \param a1 first argument
-   * \param a2 second argument
-   * \param a3 third argument
-   * \param a4 fourth argument
-   * \param a5 fifth argument
-   * \param a6 sixth argument
-   * \param a7 seventh argument
-   * \param a8 eighth argument
-   * \param a9 ninth argument
+   * \param [in] a1 First argument
+   * \param [in] a2 Second argument
+   * \param [in] a3 Third argument
+   * \param [in] a4 Fourth argument
+   * \param [in] a5 Fifth argument
+   * \param [in] a6 Sixth argument
+   * \param [in] a7 Seventh argument
+   * \param [in] a8 Eighth argument
+   * \param [in] a9 Ninth argument
    * \return Callback value
    */
   R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) const {
@@ -1195,8 +1375,8 @@
   /**
    * Equality test.
    *
-   * \param other Callback
-   * \return true if we are equal
+   * \param [in] other Callback
+   * \return \c true if we are equal
    */
   bool IsEqual (const CallbackBase &other) const {
     return m_impl->IsEqual (other.GetImpl ());
@@ -1205,8 +1385,8 @@
   /**
    * Check for compatible types
    *
-   * \param other Callback Ptr
-   * \return true if other can be dynamic_cast to my type
+   * \param [in] other Callback Ptr
+   * \return \c true if other can be dynamic_cast to my type
    */
   bool CheckType (const CallbackBase & other) const {
     return DoCheckType (other.GetImpl ());
@@ -1214,24 +1394,25 @@
   /**
    * Adopt the other's implementation, if type compatible
    *
-   * \param other Callback
+   * \param [in] other Callback
    */
-  void Assign (const CallbackBase &other) {
-    DoAssign (other.GetImpl ());
+  bool Assign (const CallbackBase &other) {
+    return DoAssign (other.GetImpl ());
   }
 private:
-  /** \return the pimpl pointer */
+  /** \return The pimpl pointer */
   CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *DoPeekImpl (void) const {
     return static_cast<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (m_impl));
   }
   /**
    * Check for compatible types
    *
-   * \param other Callback Ptr
-   * \return true if other can be dynamic_cast to my type
+   * \param [in] other Callback Ptr
+   * \return \c true if other can be dynamic_cast to my type
    */
   bool DoCheckType (Ptr<const CallbackImplBase> other) const {
-    if (other != 0 && dynamic_cast<const CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (other)) != 0)
+    if (other != 0 &&
+        dynamic_cast<const CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (other)) != 0)
       {
         return true;
       }
@@ -1247,17 +1428,20 @@
   /**
    * Adopt the other's implementation, if type compatible
    *
-   * \param other Callback Ptr to adopt from
+   * \param [in] other Callback Ptr to adopt from
    */
-  void DoAssign (Ptr<const CallbackImplBase> other) {
+  bool DoAssign (Ptr<const CallbackImplBase> other) {
     if (!DoCheckType (other))
       {
-        Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > expected;
-        NS_FATAL_ERROR ("Incompatible types. (feed to \"c++filt -t\" if needed)" << std::endl <<
-                        "got=" << Demangle ( typeid (*other).name () ) << std::endl <<
-                        "expected=" << Demangle ( typeid (*expected).name () ));
+        std::string othTid = other->GetTypeid ();
+        std::string myTid = CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9>::DoGetTypeid ();
+        NS_FATAL_ERROR_CONT ("Incompatible types. (feed to \"c++filt -t\" if needed)" << std::endl <<
+                        "got=" << othTid << std::endl <<
+                        "expected=" << myTid);
+        return false;
       }
     m_impl = const_cast<CallbackImplBase *> (PeekPointer (other));
+    return true;
   }
 };
 
@@ -1265,10 +1449,10 @@
 /**
  * Inequality test.
  *
- * \param a Callback
- * \param b Callback
+ * \param [in] a Callback
+ * \param [in] b Callback
  *
- * \return true if the Callbacks are not equal
+ * \return \c true if the Callbacks are not equal
  */
 template <typename R, typename T1, typename T2,
           typename T3, typename T4,
@@ -1285,9 +1469,9 @@
  * @{
  */
 /**
- * \param memPtr class method member pointer
- * \param objPtr class instance
- * \return a wrapper Callback
+ * \param [in] memPtr Class method member pointer
+ * \param [in] objPtr Class instance
+ * \return A wrapper Callback
  * 
  * Build Callbacks for class method members which take varying numbers of arguments
  * and potentially returning a value.
@@ -1379,8 +1563,8 @@
  * @{
  */
 /**
- * \param fnPtr function pointer
- * \return a wrapper Callback
+ * \param [in] fnPtr Function pointer
+ * \return A wrapper Callback
  * 
  * Build Callbacks for functions which take varying numbers of arguments
  * and potentially returning a value.
@@ -1432,7 +1616,7 @@
  * @{
  */
 /**
- * \return a wrapper Callback
+ * \return A wrapper Callback
  *
  * Build null Callbacks which take no arguments,
  * for varying number of template arguments,
@@ -1485,9 +1669,9 @@
  * \ingroup makeboundcallback
  * @{
  * Make Callbacks with one bound argument.
- * \param fnPtr function pointer
- * \param a1 first bound argument
- * \return a bound Callback
+ * \param [in] fnPtr Function pointer
+ * \param [in] a1 First bound argument
+ * \return A bound Callback
  */   
 template <typename R, typename TX, typename ARG>
 Callback<R> MakeBoundCallback (R (*fnPtr)(TX), ARG a1) {
@@ -1557,10 +1741,10 @@
  * \ingroup makeboundcallback
  * @{
  * Make Callbacks with two bound arguments.
- * \param fnPtr function pointer
- * \param a1 first bound argument
- * \param a2 second bound argument 
- * \return a bound Callback
+ * \param [in] fnPtr Function pointer
+ * \param [in] a1 First bound argument
+ * \param [in] a2 Second bound argument 
+ * \return A bound Callback
  */
 template <typename R, typename TX1, typename TX2, typename ARG1, typename ARG2>
 Callback<R> MakeBoundCallback (R (*fnPtr)(TX1,TX2), ARG1 a1, ARG2 a2) {
@@ -1623,11 +1807,11 @@
  * \ingroup makeboundcallback
  * @{
  * Make Callbacks with three bound arguments.
- * \param a1 first bound argument
- * \param a2 second bound argument 
- * \param a3 third bound argument 
- * \param fnPtr function pointer
- * \return a bound Callback
+ * \param [in] a1 First bound argument
+ * \param [in] a2 Second bound argument 
+ * \param [in] a3 Third bound argument 
+ * \param [in] fnPtr Function pointer
+ * \return A bound Callback
  */
 template <typename R, typename TX1, typename TX2, typename TX3, typename ARG1, typename ARG2, typename ARG3>
 Callback<R> MakeBoundCallback (R (*fnPtr)(TX1,TX2,TX3), ARG1 a1, ARG2 a2, ARG3 a3) {
@@ -1691,35 +1875,35 @@
   CallbackValue ();
   /**
    * Copy constructor
-   * \param base Callback to copy
+   * \param [in] base Callback to copy
    */
   CallbackValue (const CallbackBase &base);
   /** Destructor */
   virtual ~CallbackValue ();
-  /** \param base The CallbackBase to use */
+  /** \param [in] base The CallbackBase to use */
   void Set (CallbackBase base);
   /**
    * Give value my callback, if type compatible
    *
-   * \param value destination callback
-   * \returns true if successful
+   * \param [out] value Destination callback
+   * \returns \c true if successful
    */
   template <typename T>
   bool GetAccessor (T &value) const;
-  /** \return a copy of this CallBack */
+  /** \return A copy of this CallBack */
   virtual Ptr<AttributeValue> Copy (void) const;
   /**
    * Serialize to string
-   * \param checker the checker to validate with
-   * \return serialize this pimpl
+   * \param [in] checker The checker to validate with
+   * \return Serialized form of this Callback.
    */
   virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
   /**
    * Deserialize from string (not implemented)
    *
-   * \param value source string
-   * \param checker checker to validate with
-   * \return true if successful
+   * \param [in] value Source string
+   * \param [in] checker Checker to validate with
+   * \return \c true if successful
    */
   virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
 private:
@@ -1738,7 +1922,8 @@
 {
   if (value.CheckType (m_value))
     {
-      value.Assign (m_value);
+      if (!value.Assign (m_value))
+        NS_FATAL_ERROR_NO_MSG ();
       return true;
     }
   return false;
diff -Naur ns-3.23/src/core/model/command-line.h ns-3.24/src/core/model/command-line.h
--- ns-3.23/src/core/model/command-line.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/command-line.h	2015-09-15 11:18:44.000000000 -0700
@@ -206,14 +206,14 @@
   /**
    * Copy constructor
    *
-   * \param cmd the CommandLine to copy from
+   * \param [in] cmd The CommandLine to copy from
    */
   CommandLine (const CommandLine &cmd);
   /**
    * Assignment
    *
-   * \param cmd the CommandLine to assign from
-   * \return the CommandLine
+   * \param [in] cmd The CommandLine to assign from
+   * \return The CommandLine
    */
   CommandLine &operator = (const CommandLine &cmd);
   /** Destructor */
@@ -222,16 +222,16 @@
   /**
    * Supply the program usage and documentation.
    *
-   * \param usage Program usage message to write with \c --help.
+   * \param [in] usage Program usage message to write with \c --help.
    */
   void Usage (const std::string usage);
   
   /**
    * Add a program argument, assigning to POD
    *
-   * \param name the name of the program-supplied argument
-   * \param help the help text used by \c \-\-PrintHelp
-   * \param value a reference to the variable where the
+   * \param [in] name The name of the program-supplied argument
+   * \param [in] help The help text used by \c \-\-PrintHelp
+   * \param [out] value A reference to the variable where the
    *        value parsed will be stored (if no value
    *        is parsed, this variable is not modified).
    */
@@ -243,9 +243,9 @@
   /**
    * Add a program argument, using a Callback to parse the value
    *
-   * \param name the name of the program-supplied argument
-   * \param help the help text used by \c --help
-   * \param callback a Callback function that will be invoked to parse and
+   * \param [in] name The name of the program-supplied argument
+   * \param [in] help The help text used by \c --help
+   * \param [in] callback A Callback function that will be invoked to parse and
    *   store the value.
    *
    * The callback should have the signature
@@ -258,8 +258,8 @@
   /**
    * Add a program argument as a shorthand for an Attribute.
    *
-   * \param name the name of the program-supplied argument.
-   * \param attributePath the fully-qualified name of the Attribute
+   * \param [in] name The name of the program-supplied argument.
+   * \param [out] attributePath The fully-qualified name of the Attribute
    */
   void AddValue (const std::string &name,
                  const std::string &attributePath);
@@ -267,9 +267,9 @@
   /**
    * Parse the program arguments
    *
-   * \param argc the 'argc' variable: number of arguments (including the
+   * \param [in] argc The 'argc' variable: number of arguments (including the
    *        main program name as first element).
-   * \param argv the 'argv' variable: a null-terminated array of strings,
+   * \param [in] argv The 'argv' variable: a null-terminated array of strings,
    *        each of which identifies a command-line argument.
    * 
    * Obviously, this method will parse the input command-line arguments and
@@ -283,7 +283,7 @@
   /**
    * Get the program name
    *
-   * \return the program name.  Only valid after calling Parse()
+   * \return The program name.  Only valid after calling Parse()
    */
   std::string GetName () const;
 
@@ -293,13 +293,13 @@
    * Handler for \c \-\-PrintHelp and \c \-\-help:  print Usage(), argument names, and help strings
    *
    * Alternatively, an overloaded operator << can be used:
-   * @code
+   * \code
    *       CommandLine cmd;
    *       cmd.Parse (argc, argv);
    *     ...
    *
    *       std::cerr << cmd;
-   * @endcode
+   * \endcode
    *
    * \param [in,out] os The output stream to print on.
    */
@@ -320,16 +320,16 @@
     /**
      * Parse from a string.
      *
-     * \param value the string representation
-     * \return true if parsing the value succeeded
+     * \param [in] value The string representation
+     * \return \c true if parsing the value succeeded
      */
     virtual bool Parse (const std::string value) = 0;
     /**
-     * \return true if this item have a default value?
+     * \return \c true if this item have a default value?
      */
     virtual bool HasDefault () const;
     /**
-     * \return the default value
+     * \return The default value
      */
     virtual std::string GetDefault () const;
   };
@@ -345,8 +345,8 @@
     /**
      * Parse from a string.
      *
-     * \param value the string representation
-     * \return true if parsing the value succeeded
+     * \param [in] value The string representation
+     * \return \c true if parsing the value succeeded
      */
     virtual bool Parse (const std::string value);
 
@@ -367,8 +367,8 @@
     /**
      * Parse from a string.
      *
-     * \param value the string representation
-     * \return true if parsing the value succeeded
+     * \param [in] value The string representation
+     * \return \c true if parsing the value succeeded
      */
     virtual bool Parse (const std::string value);
     Callback<bool, std::string> m_callback;  /**< The Callback */
@@ -378,16 +378,16 @@
    * Match name against the program or general arguments,
    * and dispatch to the appropriate handler.
    *
-   * \param name the argument name
-   * \param value the command line value
+   * \param [in] name The argument name
+   * \param [in] value The command line value
    */
   void HandleArgument (const std::string &name, const std::string &value) const;
   /**
    * Callback function to handle attributes.
    *
-   * \param name The full name of the Attribute.
-   * \param value The value to assign to \p name.
-   * \return true if the value was set successfully, false otherwise.
+   * \param [in] name The full name of the Attribute.
+   * \param [in] value The value to assign to \p name.
+   * \return \c true if the value was set successfully, false otherwise.
    */  
   static bool HandleAttribute (const std::string name, const std::string value);
 
@@ -396,33 +396,33 @@
   /**
    * Handler for \c \-\-PrintAttributes:  print the attributes for a given type.
    *
-   * \param os the output stream.
-   * \param type the TypeId whose Attributes should be displayed
+   * \param [in,out] os the output stream.
+   * \param [in] type The TypeId whose Attributes should be displayed
    */
   void PrintAttributes (std::ostream &os, const std::string &type) const;
   /**
    * Handler for \c \-\-PrintGroup:  print all types belonging to a given group.
    *
-   * \param os the output stream.
-   * \param group the name of the TypeId group to display
+   * \param [in,out] os The output stream.
+   * \param [in] group The name of the TypeId group to display
    */
   void PrintGroup (std::ostream &os, const std::string &group) const;
   /**
    * Handler for \c \-\-PrintTypeIds:  print all TypeId names.
    *
-   * \param os the output stream.
+   * \param [in,out] os The output stream.
    */
   void PrintTypeIds (std::ostream &os) const;
   /**
    * Handler for \c \-\-PrintGroups:  print all TypeId group names
    *
-   * \param os the output stream.
+   * \param [in,out] os The output stream.
    */
   void PrintGroups (std::ostream &os) const;
   /**
    * Copy constructor
    *
-   * \param cmd CommandLine to copy
+   * \param [in] cmd CommandLine to copy
    */
   void Copy (const CommandLine &cmd);
   /** Remove all arguments, Usage(), name */
@@ -448,9 +448,9 @@
    * \ingroup commandlinehelper
    * \brief Helpers to specialize CommandLine::UserItem::Parse() on bool
    *
-   * \param value the argument name
-   * \param val the argument location
-   * \return true if parsing was successful
+   * \param [in] value The argument name
+   * \param [out] val The argument location
+   * \return \c true if parsing was successful
    * @{
    */
   template <typename T>
@@ -463,8 +463,8 @@
    * \ingroup commandlinehelper
    * \brief Helper to specialize CommandLine::UserItem::GetDefault() on bool
    *
-   * \param val the argument value
-   * \return the string representation of value
+   * \param [in] val The argument value
+   * \return The string representation of value
    * @{
    */
   template <typename T>
diff -Naur ns-3.23/src/core/model/config.cc ns-3.24/src/core/model/config.cc
--- ns-3.23/src/core/model/config.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/config.cc	2015-09-15 11:18:44.000000000 -0700
@@ -148,13 +148,34 @@
 
 } // namespace Config
 
+
+/** Helper to test if an array entry matches a config path specification. */
 class ArrayMatcher
 {
 public:
+  /**
+   * Construct from a Config path specification.
+   *
+   * \param [in] element The Config path specification.
+   */
   ArrayMatcher (std::string element);
+  /**
+   * Test if a specific index matches the Config Path.
+   *
+   * \param [in] i The index.
+   * \returns \c true if the index matches the Config Path.
+   */
   bool Matches (uint32_t i) const;
 private:
+  /**
+   * Convert a string to an \c uint32_t.
+   *
+   * \param [in] str The string.
+   * \param [in] value The location to store the \c uint32_t.
+   * \returns \c true if the string could be converted.
+   */
   bool StringToUint32 (std::string str, uint32_t *value) const;
+  /** The Config path element. */
   std::string m_element;
 };
 
@@ -238,22 +259,71 @@
   return !iss.bad () && !iss.fail ();
 }
 
-
+/**
+ * Abstract class to parse Config paths into object references.
+ */
 class Resolver
 {
 public:
+  /**
+   * Construct from a base Config path.
+   *
+   * \param [in] path The Config path.
+   */
   Resolver (std::string path);
+  /** Destructor. */
   virtual ~Resolver ();
 
+  /**
+   * Parse the stored Config path into an object reference,
+   * beginning at the indicated root object.
+   *
+   * \param [in] root The object corresponding to the current position in
+   *                  in the Config path.
+   */
   void Resolve (Ptr<Object> root);
+  
 private:
+  /** Ensure the Config path starts and ends with a '/'. */
   void Canonicalize (void);
+  /**
+   * Parse the next element in the Config path.
+   *
+   * \param [in] path The remaining portion of the Config path.
+   * \param [in] root The object corresponding to the current positon
+   *                  in the Config path.
+   */
   void DoResolve (std::string path, Ptr<Object> root);
+  /**
+   * Parse an index on the Config path.
+   *
+   * \param [in] path The remaining Config path.
+   * \param [in,out] vector The resulting list of matching objects.
+   */
   void DoArrayResolve (std::string path, const ObjectPtrContainerValue &vector);
+  /**
+   * Handle one object found on the path.
+   *
+   * \param [in] object The current object on the Config path.
+   */
   void DoResolveOne (Ptr<Object> object);
+  /**
+   * Get the current Config path.
+   *
+   * \returns The current Config path.
+   */
   std::string GetResolvedPath (void) const;
+  /**
+   * Handle one found object.
+   *
+   * \param [in] object The found object.
+   * \param [in] path The matching Config path context.
+   */
   virtual void DoOne (Ptr<Object> object, std::string path) = 0;
+
+  /** Current list of path tokens. */
   std::vector<std::string> m_workStack;
+  /** The Config path. */
   std::string m_path;
 };
 
@@ -502,26 +572,47 @@
     }
 }
 
-
-class ConfigImpl 
+/** Config system implementation class. */
+class ConfigImpl : public Singleton<ConfigImpl>
 {
 public:
+  /** \copydoc Config::Set() */
   void Set (std::string path, const AttributeValue &value);
+  /** \copydoc Config::ConnectWithoutContext() */
   void ConnectWithoutContext (std::string path, const CallbackBase &cb);
+  /** \copydoc Config::Connect() */
   void Connect (std::string path, const CallbackBase &cb);
+  /** \copydoc Config::DisconnectWithoutContext() */
   void DisconnectWithoutContext (std::string path, const CallbackBase &cb);
+  /** \copydoc Config::Disconnect() */
   void Disconnect (std::string path, const CallbackBase &cb);
+  /** \copydoc Config::LookupMatches() */
   Config::MatchContainer LookupMatches (std::string path);
 
+  /** \copydoc Config::RegisterRootNamespaceObject() */
   void RegisterRootNamespaceObject (Ptr<Object> obj);
+  /** \copydoc Config::UnregisterRootNamespaceObject() */
   void UnregisterRootNamespaceObject (Ptr<Object> obj);
 
+  /** \copydoc Config::GetRootNamespaceObjectN() */
   uint32_t GetRootNamespaceObjectN (void) const;
+  /** \copydoc Config::GetRootNamespaceObject() */
   Ptr<Object> GetRootNamespaceObject (uint32_t i) const;
 
 private:
+  /**
+   * Break a Config path into the leading path and the last leaf token.
+   * \param [in] path The Config path.
+   * \param [in,out] root The leading part of the \p path,
+   *   up to the final slash.
+   * \param [in,out] leaf The trailing part of the \p path.
+   */
   void ParsePath (std::string path, std::string *root, std::string *leaf) const;
+
+  /** Container type to hold the root Config path tokens. */
   typedef std::vector<Ptr<Object> > Roots;
+
+  /** The list of Config path roots. */
   Roots m_roots;
 };
 
@@ -678,7 +769,7 @@
 void Set (std::string path, const AttributeValue &value)
 {
   NS_LOG_FUNCTION (path << &value);
-  Singleton<ConfigImpl>::Get ()->Set (path, value);
+  ConfigImpl::Get ()->Set (path, value);
 }
 void SetDefault (std::string name, const AttributeValue &value)
 {
@@ -733,53 +824,53 @@
 void ConnectWithoutContext (std::string path, const CallbackBase &cb)
 {
   NS_LOG_FUNCTION (path << &cb);
-  Singleton<ConfigImpl>::Get ()->ConnectWithoutContext (path, cb);
+  ConfigImpl::Get ()->ConnectWithoutContext (path, cb);
 }
 void DisconnectWithoutContext (std::string path, const CallbackBase &cb)
 {
   NS_LOG_FUNCTION (path << &cb);
-  Singleton<ConfigImpl>::Get ()->DisconnectWithoutContext (path, cb);
+  ConfigImpl::Get ()->DisconnectWithoutContext (path, cb);
 }
 void 
 Connect (std::string path, const CallbackBase &cb)
 {
   NS_LOG_FUNCTION (path << &cb);
-  Singleton<ConfigImpl>::Get ()->Connect (path, cb);
+  ConfigImpl::Get ()->Connect (path, cb);
 }
 void 
 Disconnect (std::string path, const CallbackBase &cb)
 {
   NS_LOG_FUNCTION (path << &cb);
-  Singleton<ConfigImpl>::Get ()->Disconnect (path, cb);
+  ConfigImpl::Get ()->Disconnect (path, cb);
 }
 Config::MatchContainer LookupMatches (std::string path)
 {
   NS_LOG_FUNCTION (path);
-  return Singleton<ConfigImpl>::Get ()->LookupMatches (path);
+  return ConfigImpl::Get ()->LookupMatches (path);
 }
 
 void RegisterRootNamespaceObject (Ptr<Object> obj)
 {
   NS_LOG_FUNCTION (obj);
-  Singleton<ConfigImpl>::Get ()->RegisterRootNamespaceObject (obj);
+  ConfigImpl::Get ()->RegisterRootNamespaceObject (obj);
 }
 
 void UnregisterRootNamespaceObject (Ptr<Object> obj)
 {
   NS_LOG_FUNCTION (obj);
-  Singleton<ConfigImpl>::Get ()->UnregisterRootNamespaceObject (obj);
+  ConfigImpl::Get ()->UnregisterRootNamespaceObject (obj);
 }
 
 uint32_t GetRootNamespaceObjectN (void)
 {
   NS_LOG_FUNCTION_NOARGS ();
-  return Singleton<ConfigImpl>::Get ()->GetRootNamespaceObjectN ();
+  return ConfigImpl::Get ()->GetRootNamespaceObjectN ();
 }
 
 Ptr<Object> GetRootNamespaceObject (uint32_t i)
 {
   NS_LOG_FUNCTION (i);
-  return Singleton<ConfigImpl>::Get ()->GetRootNamespaceObject (i);
+  return ConfigImpl::Get ()->GetRootNamespaceObject (i);
 }
 
 } // namespace Config
diff -Naur ns-3.23/src/core/model/config.h ns-3.24/src/core/model/config.h
--- ns-3.23/src/core/model/config.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/config.h	2015-09-15 11:18:44.000000000 -0700
@@ -57,8 +57,8 @@
 
 /**
  * \ingroup config
- * \param path a path to match attributes.
- * \param value the value to set in all matching attributes.
+ * \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
@@ -67,8 +67,8 @@
 void Set (std::string path, const AttributeValue &value);
 /**
  * \ingroup config
- * \param name the full name of the attribute
- * \param value the value to set.
+ * \param [in] name The full name of the attribute
+ * \param [in] value The value to set.
  *
  * This method overrides the initial value of the 
  * matching attribute. This method cannot fail: it will
@@ -77,9 +77,9 @@
 void SetDefault (std::string name, const AttributeValue &value);
 /**
  * \ingroup config
- * \param name the full name of the attribute
- * \param value the value to set.
- * \returns true if the value was set successfully, false otherwise.
+ * \param [in] name The full name of the attribute
+ * \param [in] value The value to set.
+ * \returns \c true if the value was set successfully, false otherwise.
  *
  * This method overrides the initial value of the 
  * matching attribute. 
@@ -87,24 +87,25 @@
 bool SetDefaultFailSafe (std::string name, const AttributeValue &value);
 /**
  * \ingroup config
- * \param name the name of the requested GlobalValue.
- * \param value the value to set
+ * \param [in] name The name of the requested GlobalValue.
+ * \param [in] value The value to set
  *
  * This method is equivalent to GlobalValue::Bind
  */
 void SetGlobal (std::string name, const AttributeValue &value);
 /**
  * \ingroup config
- * \param name the name of the requested GlobalValue.
- * \param value the value to set
+ * \param [in] name The name of the requested GlobalValue.
+ * \param [in] value The value to set
+ * \return \c true if the GlobalValue could be set.
  *
  * This method is equivalent to GlobalValue::BindFailSafe
  */
 bool SetGlobalFailSafe (std::string name, const AttributeValue &value);
 /**
  * \ingroup config
- * \param path a path to match trace sources.
- * \param cb the callback to connect to the matching trace sources.
+ * \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
@@ -113,16 +114,16 @@
 void ConnectWithoutContext (std::string path, const CallbackBase &cb);
 /**
  * \ingroup config
- * \param path a path to match trace sources.
- * \param cb the callback to disconnect to the matching trace sources.
+ * \param [in] path A path to match trace sources.
+ * \param [in] cb The callback to disconnect to the matching trace sources.
  *
  * This function undoes the work of Config::Connect.
  */
 void DisconnectWithoutContext (std::string path, const CallbackBase &cb);
 /**
  * \ingroup config
- * \param path a path to match trace sources.
- * \param cb the callback to connect to the matching trace sources.
+ * \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
@@ -132,8 +133,8 @@
 void Connect (std::string path, const CallbackBase &cb);
 /**
  * \ingroup config
- * \param path a path to match trace sources.
- * \param cb the callback to connect to the matching trace sources.
+ * \param [in] path A path to match trace sources.
+ * \param [in] cb The callback to connect to the matching trace sources.
  *
  * This function undoes the work of Config::ConnectWithContext.
  */
@@ -150,46 +151,53 @@
 class MatchContainer
 {
 public:
+  /** Const iterator over the objects in this container. */
   typedef std::vector<Ptr<Object> >::const_iterator Iterator;
   MatchContainer ();
-  // constructor used only by implementation.
+  /**
+   * Constructor used only by implementation.
+   *
+   * \param [in] objects The vector of objects to store in this container.
+   * \param [in] contexts The corresponding contexts.
+   * \param [in] path The path used for object matching.
+   */
   MatchContainer (const std::vector<Ptr<Object> > &objects, 
                   const std::vector<std::string> &contexts, 
                   std::string path);
 
   /**
-   * \returns an iterator which points to the first item in the container
+   * \returns An iterator which points to the first item in the container
    */
   MatchContainer::Iterator Begin (void) const;
   /**
-   * \returns an iterator which points to the last item in the container
+   * \returns An iterator which points to the last item in the container
    */
   MatchContainer::Iterator End (void) const;
   /**
-   * \returns the number of items in the container
+   * \returns The number of items in the container
    */
   uint32_t GetN (void) const;
   /**
-   * \param i index of item to lookup ([0,n[)
-   * \returns the item requested.
+   * \param [in] i Index of item to lookup ([0,n[)
+   * \returns The item requested.
    */
   Ptr<Object> Get (uint32_t i) const;
   /**
-   * \param i index of item to lookup ([0,n[)
-   * \returns the fully-qualified matching path associated
+   * \param [in] i Index of item to lookup ([0,n[)
+   * \returns The fully-qualified matching path associated
    *          to the requested item.
    *
    * The matching patch uniquely identifies the requested object.
    */
   std::string GetMatchedPath (uint32_t i) const;
   /**
-   * \returns the path used to perform the object matching.
+   * \returns The path used to perform the object matching.
    */
   std::string GetPath (void) const;
 
   /**
-   * \param name name of attribute to set
-   * \param value value to set to the attribute
+   * \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.
@@ -197,8 +205,8 @@
    */
   void Set (std::string name, const AttributeValue &value);
   /**
-   * \param name the name of the trace source to connect to
-   * \param cb the sink to connect to the trace source
+   * \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.
@@ -206,8 +214,8 @@
    */
   void Connect (std::string name, const CallbackBase &cb);
   /**
-   * \param name the name of the trace source to connect to
-   * \param cb the sink to connect to the trace source
+   * \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.
@@ -215,8 +223,8 @@
    */
   void ConnectWithoutContext (std::string name, const CallbackBase &cb);
   /**
-   * \param name the name of the trace source to disconnect from
-   * \param cb the sink to disconnect from the trace source
+   * \param [in] name The name of the trace source to disconnect from
+   * \param [in] cb The sink to disconnect from the trace source
    *
    * Disconnect the specified sink from all the objects stored in this
    * container.
@@ -224,31 +232,35 @@
    */
   void Disconnect (std::string name, const CallbackBase &cb);
   /**
-   * \param name the name of the trace source to disconnect from
-   * \param cb the sink to disconnect from the trace source
+   * \param [in] name The name of the trace source to disconnect from
+   * \param [in] cb The sink to disconnect from the trace source
    *
    * Disconnect the specified sink from all the objects stored in this
    * container.
    * \sa ns3::Config::DisconnectWithoutContext
    */
   void DisconnectWithoutContext (std::string name, const CallbackBase &cb);
+  
 private:
+  /** The list of objects in this container. */
   std::vector<Ptr<Object> > m_objects;
+  /** The context for each object. */
   std::vector<std::string> m_contexts;
+  /** The path used to perform the object matching. */
   std::string m_path;
 };
 
 /**
  * \ingroup config
- * \param path the path to perform a match against
- * \returns a container which contains all the objects which match the input
+ * \param [in] path The path to perform a match against
+ * \returns A container which contains all the objects which match the input
  *          path.
  */
 MatchContainer LookupMatches (std::string path);
 
 /**
  * \ingroup config
- * \param obj a new root object
+ * \param [in] obj A new root object
  *
  * Each root object is used during path matching as
  * the root of the path by Config::Connect, and Config::Set.
@@ -256,7 +268,7 @@
 void RegisterRootNamespaceObject (Ptr<Object> obj);
 /**
  * \ingroup config
- * \param obj a new root object
+ * \param [in] obj A new root object
  *
  * This function undoes the work of Config::RegisterRootNamespaceObject.
  */
@@ -264,14 +276,14 @@
 
 /**
  * \ingroup config
- * \returns the number of registered root namespace objects.
+ * \returns The number of registered root namespace objects.
  */
 uint32_t GetRootNamespaceObjectN (void);
 
 /**
  * \ingroup config
- * \param i the index of the requested object.
- * \returns the requested root namespace object
+ * \param [in] i The index of the requested object.
+ * \returns The requested root namespace object
  */
 Ptr<Object> GetRootNamespaceObject (uint32_t i);
 
diff -Naur ns-3.23/src/core/model/default-deleter.h ns-3.24/src/core/model/default-deleter.h
--- ns-3.23/src/core/model/default-deleter.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/default-deleter.h	2015-09-15 11:18:44.000000000 -0700
@@ -35,7 +35,7 @@
  *        last reference to an object they manage
  *        disappears.
  *
- * \tparam T The object type being deleted.
+ * \tparam T \deduced The object type being deleted.
  * \sa ns3::SimpleRefCount
  */
 template <typename T>
@@ -46,7 +46,7 @@
    * \code
    *   delete object;
    * \endcode
-   * \tparam T The object type being deleted.
+   * \tparam T \deduced The object type being deleted.
    * \param [in] object The object to delete.
    */
   inline static void Delete (T *object) {
diff -Naur ns-3.23/src/core/model/default-simulator-impl.cc ns-3.24/src/core/model/default-simulator-impl.cc
--- ns-3.23/src/core/model/default-simulator-impl.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/default-simulator-impl.cc	2015-09-15 11:18:44.000000000 -0700
@@ -84,6 +84,8 @@
 DefaultSimulatorImpl::DoDispose (void)
 {
   NS_LOG_FUNCTION (this);
+  ProcessEventsWithContext ();
+
   while (!m_events->IsEmpty ())
     {
       Scheduler::Event next = m_events->RemoveNext ();
@@ -213,22 +215,22 @@
 }
 
 void 
-DefaultSimulatorImpl::Stop (Time const &time)
+DefaultSimulatorImpl::Stop (Time const &delay)
 {
-  NS_LOG_FUNCTION (this << time.GetTimeStep ());
-  Simulator::Schedule (time, &Simulator::Stop);
+  NS_LOG_FUNCTION (this << delay.GetTimeStep ());
+  Simulator::Schedule (delay, &Simulator::Stop);
 }
 
 //
 // Schedule an event for a _relative_ time in the future.
 //
 EventId
-DefaultSimulatorImpl::Schedule (Time const &time, EventImpl *event)
+DefaultSimulatorImpl::Schedule (Time const &delay, EventImpl *event)
 {
-  NS_LOG_FUNCTION (this << time.GetTimeStep () << event);
+  NS_LOG_FUNCTION (this << delay.GetTimeStep () << event);
   NS_ASSERT_MSG (SystemThread::Equals (m_main), "Simulator::Schedule Thread-unsafe invocation!");
 
-  Time tAbsolute = time + TimeStep (m_currentTs);
+  Time tAbsolute = delay + TimeStep (m_currentTs);
 
   NS_ASSERT (tAbsolute.IsPositive ());
   NS_ASSERT (tAbsolute >= TimeStep (m_currentTs));
@@ -244,13 +246,13 @@
 }
 
 void
-DefaultSimulatorImpl::ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event)
+DefaultSimulatorImpl::ScheduleWithContext (uint32_t context, Time const &delay, EventImpl *event)
 {
-  NS_LOG_FUNCTION (this << context << time.GetTimeStep () << event);
+  NS_LOG_FUNCTION (this << context << delay.GetTimeStep () << event);
 
   if (SystemThread::Equals (m_main))
     {
-      Time tAbsolute = time + TimeStep (m_currentTs);
+      Time tAbsolute = delay + TimeStep (m_currentTs);
       Scheduler::Event ev;
       ev.impl = event;
       ev.key.m_ts = (uint64_t) tAbsolute.GetTimeStep ();
@@ -264,7 +266,8 @@
     {
       EventWithContext ev;
       ev.context = context;
-      ev.timestamp = time.GetTimeStep ();
+      // Current time added in ProcessEventsWithContext()
+      ev.timestamp = delay.GetTimeStep ();
       ev.event = event;
       {
         CriticalSection cs (m_eventsWithContextMutex);
diff -Naur ns-3.23/src/core/model/default-simulator-impl.h ns-3.24/src/core/model/default-simulator-impl.h
--- ns-3.23/src/core/model/default-simulator-impl.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/default-simulator-impl.h	2015-09-15 11:18:44.000000000 -0700
@@ -47,17 +47,24 @@
 class DefaultSimulatorImpl : public SimulatorImpl
 {
 public:
+  /**
+   *  Register this type.
+   *  \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
+  /** Constructor. */
   DefaultSimulatorImpl ();
+  /** Destructor. */
   ~DefaultSimulatorImpl ();
 
+  // Inherited
   virtual void Destroy ();
   virtual bool IsFinished (void) const;
   virtual void Stop (void);
-  virtual void Stop (Time const &time);
-  virtual EventId Schedule (Time const &time, EventImpl *event);
-  virtual void ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event);
+  virtual void Stop (Time const &delay);
+  virtual EventId Schedule (Time const &delay, EventImpl *event);
+  virtual void ScheduleWithContext (uint32_t context, Time const &delay, EventImpl *event);
   virtual EventId ScheduleNow (EventImpl *event);
   virtual EventId ScheduleDestroy (EventImpl *event);
   virtual void Remove (const EventId &id);
@@ -73,32 +80,57 @@
 
 private:
   virtual void DoDispose (void);
+
+  /** Process the next event. */
   void ProcessOneEvent (void);
+  /** Move events from a different context into the main event queue. */
   void ProcessEventsWithContext (void);
  
+  /** Wrap an event with its execution context. */
   struct EventWithContext {
+    /** The event context. */
     uint32_t context;
+    /** Event timestamp. */
     uint64_t timestamp;
+    /** The event implementation. */
     EventImpl *event;
   };
+  /** Container type for the events from a different context. */
   typedef std::list<struct EventWithContext> EventsWithContext;
+  /** The container of events from a different context. */
   EventsWithContext m_eventsWithContext;
+  /**
+   * Flag \c true if all events with context have been moved to the
+   * primary event queue.
+   */
   bool m_eventsWithContextEmpty;
+  /** Mutex to control access to the list of events with context. */
   SystemMutex m_eventsWithContextMutex;
 
+  /** Container type for the events to run at Simulator::Destroy() */
   typedef std::list<EventId> DestroyEvents;
+  /** The container of events to run at Destroy. */
   DestroyEvents m_destroyEvents;
+  /** Flag calling for the end of the simulation. */
   bool m_stop;
+  /** The event priority queue. */
   Ptr<Scheduler> m_events;
 
+  /** Next event unique id. */
   uint32_t m_uid;
+  /** Unique id of the current event. */
   uint32_t m_currentUid;
+  /** Timestamp of the current event. */
   uint64_t m_currentTs;
+  /** Execution context of the current event. */
   uint32_t m_currentContext;
-  // number of events that have been inserted but not yet scheduled,
-  // not counting the "destroy" events; this is used for validation
+  /**
+   * Number of events that have been inserted but not yet scheduled,
+   *  not counting the Destroy events; this is used for validation
+   */
   int m_unscheduledEvents;
 
+  /** Main execution thread. */
   SystemThread::ThreadId m_main;
 };
 
diff -Naur ns-3.23/src/core/model/deprecated.h ns-3.24/src/core/model/deprecated.h
--- ns-3.23/src/core/model/deprecated.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/deprecated.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- 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
+ *
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
 #ifndef NS3_DEPRECATED_H
 #define NS3_DEPRECATED_H
 
@@ -16,7 +36,11 @@
  *
  * When deprecating a feature, please update the documentation
  * with information for users on how to update their code.
+ *
+ * For example,
+ * \snippet src/core/doc/deprecated-example.h doxygen snippet
  */
+
 #if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ > 1)
 #define NS_DEPRECATED __attribute__ ((deprecated))
 #else
diff -Naur ns-3.23/src/core/model/double.cc ns-3.24/src/core/model/double.cc
--- ns-3.23/src/core/model/double.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/double.cc	2015-09-15 11:18:44.000000000 -0700
@@ -41,9 +41,9 @@
  * \ingroup attribute_Double
  * Make a Double attribute checker with embedded numeric type name.
  *
- * \param min The minimum allowed value.
- * \param max The maximum allowed value.
- * \param name The original type name ("float", "double").
+ * \param [in] min The minimum allowed value.
+ * \param [in] max The maximum allowed value.
+ * \param [in] name The original type name ("float", "double").
  * \returns The AttributeChecker.
  */
 Ptr<const AttributeChecker> MakeDoubleChecker (double min, double max, std::string name)
diff -Naur ns-3.23/src/core/model/event-id.h ns-3.24/src/core/model/event-id.h
--- ns-3.23/src/core/model/event-id.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/event-id.h	2015-09-15 11:18:44.000000000 -0700
@@ -100,15 +100,15 @@
 private:
   /**
    * Test if two EventId's are equal.
-   * \param a The first EventId.
-   * \param b The second EventId.
+   * \param [in] a The first EventId.
+   * \param [in] b The second EventId.
    * \return \c true if the \p a and \p b represent the same event.
    */
   friend bool operator == (const EventId &a, const EventId &b);
   /**
    * Test if two EventId's are not equal.
-   * \param a The first EventId.
-   * \param b The second EventId.
+   * \param [in] a The first EventId.
+   * \param [in] b The second EventId.
    * \return \c true if the \p a and \p b are not the same event.
    */
   friend bool operator != (const EventId &a, const EventId &b);
diff -Naur ns-3.23/src/core/model/fatal-error.h ns-3.24/src/core/model/fatal-error.h
--- ns-3.23/src/core/model/fatal-error.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/fatal-error.h	2015-09-15 11:18:44.000000000 -0700
@@ -52,57 +52,113 @@
  * on the attempt to execute the flush() function.
  */
 
-
 /**
  * \ingroup fatal
  *
- * \brief Fatal error handling
+ * \brief Fatal error reporting implementation.
  *
- * When this macro is hit at runtime, details of filename
- * and line number is printed to stderr, and the program
- * is halted by calling std::terminate(). This will
- * trigger any clean up code registered by
- * std::set_terminate (NS3 default is a stream-flushing
- * code), but may be overridden.
+ * When this macro is hit at runtime the error details will
+ * printed to \c stderr, including the supplied \c msg,
+ * and the file name and line number.  Optionally, if \c fatal is true,
+ * the macro will invoke \c std::terminate().  If \c fatal is false,
+ * the invoking function should return an error code to its caller,
+ * which is expected to call NS_FATAL_ERROR to cause termination.
+ *
+ * \param [in] msg The error message to print, if not empty.
+ * \param [in] fatal Call \c std::terminate() if true.
  *
  * This macro is enabled unconditionally in all builds,
  * including debug and optimized builds.
  */
-#define NS_FATAL_ERROR_NO_MSG()                           \
+#define NS_FATAL_ERROR_IMPL_NO_MSG(fatal) \
   do                                                      \
     {                                                     \
       std::cerr << "file=" << __FILE__ << ", line=" <<    \
-      __LINE__ << std::endl;                            \
+        __LINE__ << std::endl;                            \
       ::ns3::FatalImpl::FlushStreams ();                  \
-      std::terminate ();                                  \
+      if (fatal) std::terminate ();                       \
     }                                                     \
   while (false)
 
+
+#define NS_FATAL_ERROR_IMPL(msg,fatal) \
+  do                                                    \
+    {                                                   \
+      std::cerr << "msg=\"" << msg << "\", ";           \
+      NS_FATAL_ERROR_IMPL_NO_MSG (fatal);               \
+    }                                                   \
+  while (false)
+
+
 /**
  * \ingroup fatal
  *
- * \brief Fatal error handling
+ * \brief Report a fatal error and terminate.
  *
- * \param msg message to output when this macro is hit.
+ * When this macro is hit at runtime, details of filename
+ * and line number are printed to \c stderr, and the program
+ * is halted by calling \c std::terminate(). This will
+ * trigger any clean up code registered by
+ * \c std::set_terminate (NS3 default is a stream-flushing
+ * code), but may be overridden.
+ *
+ * This macro is enabled unconditionally in all builds,
+ * including debug and optimized builds.
+ */
+#define NS_FATAL_ERROR_NO_MSG()       NS_FATAL_ERROR_IMPL_NO_MSG (true)
+
+/**
+ * \ingroup fatal
+ *
+ * \brief Report a fatal error, deferring termination.
+ *
+ * When this macro is hit at runtime, details of filename
+ * and line number are printed to \c stderr, however the program
+ * is _not_ halted.  It is expected that the function using this
+ * macro will return an error code, and its caller will
+ * invoke NS_FATAL_ERROR(msg) triggering std::terminate().
+ *
+ * This macro is enabled unconditionally in all builds,
+ * including debug and optimized builds.
+ */
+#define NS_FATAL_ERROR_NO_MSG_CONT()  NS_FATAL_ERROR_IMPL_NO_MSG (false)
+
+/**
+ * \ingroup fatal
+ *
+ * \brief Report a fatal error with a message and terminate.
+ *
+ * \param [in] msg message to output when this macro is hit.
  *
  * When this macro is hit at runtime, the user-specified
- * error message is printed to stderr, followed by a call
+ * error message are printed to \c stderr, followed by a call
  * to the NS_FATAL_ERROR_NO_MSG() macro which prints the
- * details of filename and line number to stderr. The
- * program will be halted by calling std::terminate(),
+ * details of filename and line number to \c stderr. The
+ * program will be halted by calling \c std::terminate(),
  * triggering any clean up code registered by
- * std::set_terminate (NS3 default is a stream-flushing
+ * \c std::set_terminate (NS3 default is a stream-flushing
  * code, but may be overridden).
  *
  * This macro is enabled unconditionally in all builds,
  * including debug and optimized builds.
  */
-#define NS_FATAL_ERROR(msg)                             \
-  do                                                    \
-    {                                                   \
-      std::cerr << "msg=\"" << msg << "\", ";           \
-      NS_FATAL_ERROR_NO_MSG ();                          \
-    }                                                   \
-  while (false)
+#define NS_FATAL_ERROR(msg)           NS_FATAL_ERROR_IMPL (msg, true)
+
+/**
+ * \ingroup fatal
+ *
+ * \brief Report a fatal error with a message, deferring termination.
+ *
+ * When this macro is hit at runtime, details of filename
+ * and line number are printed to \c stderr, however the program
+ * is _not_ halted.  It is expected that the function using this
+ * macro will return an error code, and its caller will
+ * invoke NS_FATAL_ERROR(msg) triggering \c std::terminate().
+ *
+ * This macro is enabled unconditionally in all builds,
+ * including debug and optimized builds.
+ */
+#define NS_FATAL_ERROR_CONT(msg)      NS_FATAL_ERROR_IMPL (msg, false)
+
 
 #endif /* FATAL_ERROR_H */
diff -Naur ns-3.23/src/core/model/fatal-impl.cc ns-3.24/src/core/model/fatal-impl.cc
--- ns-3.23/src/core/model/fatal-impl.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/fatal-impl.cc	2015-09-15 11:18:44.000000000 -0700
@@ -92,31 +92,6 @@
   return *pstreams;
 }
 
-/**
- * \ingroup fatalimpl
- * \brief Destructor for the list of fatal streams.
- *
- * \todo Is this ever called?
- * Not obvious that it is.  Test with something like
- * \code
- *   main (int argc, char ** argv)
- *   {
- *     NS_FATAL_MSG ("Aborting.")
- *   }
- * \endcode
- * Then run under valgrind or the debugger.  If this isn't called,
- * try adding the call to \c sigHandler.
- */
-struct destructor
-{
-  ~destructor ()
-  {
-    NS_LOG_FUNCTION (this);
-    std::list<std::ostream*> **pstreams = PeekStreamList ();
-    delete *pstreams;
-    *pstreams = 0;
-  }
-};
 }  // anonymous namespace
 
 void
@@ -158,7 +133,7 @@
  *
  * This is private to the fatal implementation.
  *
- * \param sig The signal condition.
+ * \param [in] sig The signal condition.
  */
 void sigHandler (int sig)
 {
diff -Naur ns-3.23/src/core/model/fatal-impl.h ns-3.24/src/core/model/fatal-impl.h
--- ns-3.23/src/core/model/fatal-impl.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/fatal-impl.h	2015-09-15 11:18:44.000000000 -0700
@@ -53,7 +53,7 @@
  * this function should ensure the stream remains valid until
  * it had been unregistered.
  *
- * \param stream The stream to be flushed on abnormal exit.
+ * \param [in] stream The stream to be flushed on abnormal exit.
  */
 void RegisterStream (std::ostream* stream);
 
@@ -68,7 +68,7 @@
  *
  * If the stream is not registered, nothing will happen.
  *
- * \param stream The stream to be unregistered.
+ * \param [in] stream The stream to be unregistered.
  */
 void UnregisterStream (std::ostream* stream);
 
diff -Naur ns-3.23/src/core/model/global-value.h ns-3.24/src/core/model/global-value.h
--- ns-3.23/src/core/model/global-value.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/global-value.h	2015-09-15 11:18:44.000000000 -0700
@@ -53,17 +53,21 @@
  */
 class GlobalValue
 {
+  /** Container type for holding all the GlobalValues. */
   typedef std::vector<GlobalValue *> Vector;
+  
 public:
+  /** Iterator type for the list of all global values. */
   typedef Vector::const_iterator Iterator;
 
   /**
-   * \param name the name of this global value.
-   * \param help some help text which describes the purpose of this
+   * Constructor.
+   * \param [in] name the name of this global value.
+   * \param [in] help some help text which describes the purpose of this
    *        global value.
-   * \param initialValue the value to assign to this global value
+   * \param [in] initialValue the value to assign to this global value
    *        during construction.
-   * \param checker a pointer to an AttributeChecker which can verify
+   * \param [in] checker a pointer to an AttributeChecker which can verify
    *        that any user-supplied value to override the initial
    *        value matches the requested type constraints.
    */
@@ -72,77 +76,90 @@
                Ptr<const AttributeChecker> checker);
 
   /**
-   * \returns the name of this GlobalValue.
+   * Get the name.
+   * \returns The name of this GlobalValue.
    */
   std::string GetName (void) const;
   /**
-   * \returns the help text of this GlobalValue.
+   * Get the help string.
+   * \returns The help text of this GlobalValue.
    */
   std::string GetHelp (void) const;
   /**
-   * \returns the current value of this GlobalValue.
+   * 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;
   /**
-   * \returns the checker associated to this GlobalValue.
+   * Get the AttributeChecker.
+   * \returns The checker associated to this GlobalValue.
    */
   Ptr<const AttributeChecker> GetChecker (void) const;
   /**
-   * \param value the new value to set in this GlobalValue.
+   * Set the value of this GlobalValue.
+   * \param [in] value the new value to set in this GlobalValue.
+   * \returns \c true if the Global Value was set successfully.
    */
   bool SetValue (const AttributeValue &value);
 
+  /** Reset to the initial value. */
   void ResetInitialValue (void);
 
   /**
-   * \param name the name of the global value
-   * \param value the value to set in the requested global value.
-   *
    * Iterate over the set of GlobalValues until a matching name is found
    * and then set its value with GlobalValue::SetValue.
    *
+   * \param [in] name the name of the global value
+   * \param [in] value the value to set in the requested global value.
+   *
    * This method cannot fail. It will crash if the input is not valid.
    */
   static void Bind (std::string name, const AttributeValue &value);
 
   /**
-   * \param name the name of the global value
-   * \param value the value to set in the requested global value.
-   * \returns true if the value could be set successfully, false otherwise.
-   *
    * Iterate over the set of GlobalValues until a matching name is found
    * and then set its value with GlobalValue::SetValue.
+   *
+   * \param [in] name the name of the global value
+   * \param [in] value the value to set in the requested global value.
+   * \returns \c true if the value could be set successfully,
+   *          \c false otherwise.
    */
   static bool BindFailSafe (std::string name, const AttributeValue &value);
 
   /**
-   * \returns an iterator which represents a pointer to the first GlobalValue registered.
+   * The Begin iterator.
+   * \returns An iterator which represents a pointer to the first GlobalValue registered.
    */
   static Iterator Begin (void);
   /**
-   * \returns an iterator which represents a pointer to the last GlobalValue registered.
+   * The End iterator.
+   * \returns An iterator which represents a pointer to the last GlobalValue registered.
    */
   static Iterator End (void);
 
 
   /** 
-   * finds the GlobalValue with the given name and returns its value
+   * Finds the GlobalValue with the given name and returns its value
    * 
-   * @param name the name of the GlobalValue to be found
-   * @param value where to store the value of the found GlobalValue
+   * \param [in] name the name of the GlobalValue to be found
+   * \param [out] value where to store the value of the found GlobalValue
    * 
-   * @return true if the GlobalValue was found, false otherwise
+   * \return \c true if the GlobalValue was found, \c false otherwise
    */
   static bool GetValueByNameFailSafe (std::string name, AttributeValue &value);
 
   /** 
-   * finds the GlobalValue with the given name and returns its
-   * value. This method cannot fail, i.e., it will trigger a
+   * Finds the GlobalValue with the given name and returns its
+   * value.
+   *
+   * This method cannot fail, i.e., it will trigger a
    * NS_FATAL_ERROR if the requested GlobalValue is not found.
    * 
-   * @param name the name of the GlobalValue to be found
-   * @param value where to store the value of the found GlobalValue
-   * 
+   * \param [in] name the name of the GlobalValue to be found
+   * \param [out] value where to store the value of the found GlobalValue
    */
   static void GetValueByName (std::string name, AttributeValue &value);
 
@@ -150,12 +167,24 @@
 private:
   friend class ::GlobalValueTestCase;
 
+  /**
+   * Get the static vector of all GlobalValues.
+   *
+   * \returns The vector.
+   */
   static Vector *GetVector (void);
+  /** Initialize from the \c NS_GLOBAL_VALUE environment variable. */
   void InitializeFromEnv (void);
+
+  /** The name of this GlobalValue. */
   std::string m_name;
+  /** The help string. */
   std::string m_help;
+  /** The initial value. */
   Ptr<AttributeValue> m_initialValue;
+  /** The current value. */
   Ptr<AttributeValue> m_currentValue;
+  /** The AttributeChecker for this GlobalValue. */
   Ptr<const AttributeChecker> m_checker;
 };
 
diff -Naur ns-3.23/src/core/model/hash-fnv.cc ns-3.24/src/core/model/hash-fnv.cc
--- ns-3.23/src/core/model/hash-fnv.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/hash-fnv.cc	2015-09-15 11:18:44.000000000 -0700
@@ -368,9 +368,9 @@
  * fnv_32a_buf - perform a 32 bit Fowler/Noll/Vo FNV-1a hash on a buffer
  *
  * input:
- * \param	buf	start of buffer to hash
- * \param	len	length of buffer in octets
- * \param	hval	previous hash value or 0 if first call
+ * \param  [in] buf	start of buffer to hash
+ * \param  [in] len	length of buffer in octets
+ * \param  [in] hval	previous hash value or 0 if first call
  *
  * \returns		32 bit hash as a static hash type.
  *
@@ -408,8 +408,8 @@
  * fnv_32a_str - perform a 32 bit Fowler/Noll/Vo FNV-1a hash on a string
  *
  * input:
- * \param	str	string to hash
- * \param	hval	previous hash value or 0 if first call
+ * \param  [in] str	string to hash
+ * \param  [in] hval	previous hash value or 0 if first call
  *
  * \returns		32 bit hash as a static hash type
  *
@@ -531,9 +531,9 @@
  * fnv_64a_buf - perform a 64 bit Fowler/Noll/Vo FNV-1a hash on a buffer
  *
  * input:
- * \param	buf	start of buffer to hash
- * \param	len	length of buffer in octets
- * \param	hval	previous hash value or 0 if first call
+ * \param  [in] buf	start of buffer to hash
+ * \param  [in] len	length of buffer in octets
+ * \param  [in] hval	previous hash value or 0 if first call
  *
  * \returns		64 bit hash as a static hash type
  *
@@ -637,8 +637,8 @@
  * fnv_64a_str - perform a 64 bit Fowler/Noll/Vo FNV-1a hash on a buffer
  *
  * input:
- * \param	str	string to hash
- * \param	hval	previous hash value or 0 if first call
+ * \param  [in] str	string to hash
+ * \param  [in] hval	previous hash value or 0 if first call
  *
  * \returns		64 bit hash as a static hash type
  *
diff -Naur ns-3.23/src/core/model/hash.h ns-3.24/src/core/model/hash.h
--- ns-3.23/src/core/model/hash.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/hash.h	2015-09-15 11:18:44.000000000 -0700
@@ -168,7 +168,7 @@
    *   h.clear ().GetHash64 (...);
    * \endcode
    *
-   * \return this
+   * \return This hasher.
    */
   Hasher & clear (void);
 
diff -Naur ns-3.23/src/core/model/hash-murmur3.cc ns-3.24/src/core/model/hash-murmur3.cc
--- ns-3.23/src/core/model/hash-murmur3.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/hash-murmur3.cc	2015-09-15 11:18:44.000000000 -0700
@@ -84,8 +84,8 @@
 /**
  * Barrel shift (rotate) left on 32 bits.
  *
- * \param x The initial value.
- * \param r The number of bit positions to rotate.
+ * \param [in] x The initial value.
+ * \param [in] r The number of bit positions to rotate.
  * \return The rotated value.
  */
 inline uint32_t rotl32 ( uint32_t x, int8_t r )
@@ -96,8 +96,8 @@
 /**
  * Barrel shift (rotate) left on 64 bits.
  *
- * \param x The initial value.
- * \param r The number of bit positions to rotate.
+ * \param [in] x The initial value.
+ * \param [in] r The number of bit positions to rotate.
  * \return The rotated value.
  */
 inline uint64_t rotl64 ( uint64_t x, int8_t r )
@@ -115,8 +115,8 @@
  * If your platform needs to do endian-swapping or can only
  * handle aligned reads, do the conversion here.
  *
- * \param p Block base address.
- * \param i Index into the block.
+ * \param [in] p Block base address.
+ * \param [in] i Index into the block.
  * \returns The \c i'th word from the block.
  */
 inline uint32_t getblock ( const uint32_t * p, int i )
@@ -133,7 +133,7 @@
 /**
  * Finalization mix - force all bits of a hash block to avalanche.
  *
- * \param h Final word of the hash block.
+ * \param [in] h Final word of the hash block.
  * \returns Fully mixed final word.
  */
 inline uint32_t fmix ( uint32_t h )
@@ -166,19 +166,19 @@
 /**
  * Initial and incremental hash.
  *
- * \param key Data to be hashed.
- * \param len Number of words in the \c key.
- * \param seed Initial or current hash state.
- * \param out Output hash value.
+ * \param [in] key Data to be hashed.
+ * \param [in] len Number of words in the \c key.
+ * \param [in] seed Initial or current hash state.
+ * \param [out] out Output hash value.
  */
 void MurmurHash3_x86_32_incr ( const void * key, int len,
                                uint32_t seed, void * out );
 /**
  * Finalize a hash.
  *
- * \param len Total number of words that have gone in to the hash.
- * \param seed Initial or current hash state.
- * \param out Output hash value.
+ * \param [in] len Total number of words that have gone in to the hash.
+ * \param [in] seed Initial or current hash state.
+ * \param [out] out Output hash value.
  */
 void MurmurHash3_x86_32_fin ( int len,
                               uint32_t seed, void * out );
@@ -262,19 +262,19 @@
 /**
  * Initial and incremental hash.
  *
- * \param key Data to be hashed.
- * \param len Number of words in the \c key.
- * \param seeds Initial or current hash state.
- * \param out Output hash value.
+ * \param [in] key Data to be hashed.
+ * \param [in] len Number of words in the \c key.
+ * \param [in] seeds Initial or current hash state.
+ * \param [out] out Output hash value.
  */
 void MurmurHash3_x86_128_incr ( const void * key, const int len,
                                 uint32_t * seeds, void * out );
 /**
  * Finalize a hash.
  *
- * \param len Total number of words that have gone in to the hash.
- * \param seeds Initial or current hash state.
- * \param out Output hash value.
+ * \param [in] len Total number of words that have gone in to the hash.
+ * \param [in] seeds Initial or current hash state.
+ * \param [out] out Output hash value.
  */
 void MurmurHash3_x86_128_fin ( const int len,
                                uint32_t * seeds, void * out );
@@ -283,10 +283,10 @@
 /**
  * Initial and incremental hash.
  *
- * \param key Data to be hashed.
- * \param len Number of words in the \c key.
- * \param seed Initial or current hash state.
- * \param out Output hash value.
+ * \param [in] key Data to be hashed.
+ * \param [in] len Number of words in the \c key.
+ * \param [in] seed Initial or current hash state.
+ * \param [out] out Output hash value.
  */
 void MurmurHash3_x86_128 ( const void * key, const int len,
                            uint32_t seed, void * out )
diff -Naur ns-3.23/src/core/model/heap-scheduler.h ns-3.24/src/core/model/heap-scheduler.h
--- ns-3.23/src/core/model/heap-scheduler.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/heap-scheduler.h	2015-09-15 11:18:44.000000000 -0700
@@ -53,36 +53,114 @@
 class HeapScheduler : public Scheduler
 {
 public:
+  /**
+   *  Register this type.
+   *  \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
+  /** Constructor. */
   HeapScheduler ();
+  /** Destructor. */
   virtual ~HeapScheduler ();
 
-  virtual void Insert (const Event &ev);
+  // Inherited
+  virtual void Insert (const Scheduler::Event &ev);
   virtual bool IsEmpty (void) const;
-  virtual Event PeekNext (void) const;
-  virtual Event RemoveNext (void);
-  virtual void Remove (const Event &ev);
+  virtual Scheduler::Event PeekNext (void) const;
+  virtual Scheduler::Event RemoveNext (void);
+  virtual void Remove (const Scheduler::Event &ev);
 
 private:
-  typedef std::vector<Event> BinaryHeap;
+  /** Event list type:  vector of Events, managed as a heap. */
+  typedef std::vector<Scheduler::Event> BinaryHeap;
 
+  /**
+   * Get the parent index of a given entry.
+   *
+   * \param [in] id The child index.
+   * \return The index of the parent of \p id.
+   */
   inline uint32_t Parent (uint32_t id) const;
+  /**
+   * Get the next sibling of a given entry.
+   *
+   * \param [in] id The starting index.
+   * \returns The next sibling of \p id.
+   */
   uint32_t Sibling (uint32_t id) const;
+  /**
+   * Get the left child of a given entry.
+   *
+   * \param [in] id The parent index.
+   * \returns The index of the left (first) child.
+   */
   inline uint32_t LeftChild (uint32_t id) const;
+  /**
+   * Get the right child index of a given entry.
+   *
+   * \param [in] id The parent index.
+   * \returns The index of the right (second) child.
+   */
   inline uint32_t RightChild (uint32_t id) const;
+  /**
+   * Get the root index of the heap.
+   *
+   * \returns The root index.
+   */
   inline uint32_t Root (void) const;
-  /* Return the position in the array of the last element included in it. */
+  /**
+   * Return the index of the last element.
+   * \returns The last index.
+   */
   uint32_t Last (void) const;
+  /**
+   * Test if an index is the root.
+   *
+   * \param [in] id The index to test.
+   * \returns \c true if the \p id is the root.
+   */
   inline bool IsRoot (uint32_t id) const;
+  /**
+   * Test if an index is at the bottom of the heap.
+   *
+   * \param [in] id The index to test.
+   * \returns \c true if the index is at the bottom.
+   */
   inline bool IsBottom (uint32_t id) const;
+  /**
+   * Compare (less than) two items.
+   *
+   * \param [in] a The first item.
+   * \param [in] b The second item.
+   * \returns \c true if \c a < \c b
+   */
   inline bool IsLessStrictly (uint32_t a, uint32_t b) const;
+  /**
+   * Minimum of two items.
+   *
+   * \param [in] a The first item.
+   * \param [in] b The second item.
+   * \returns The smaller of the two items.
+   */
   inline uint32_t Smallest (uint32_t a, uint32_t b) const;
-
+  /**
+   * Swap two items.
+   *
+   * \param [in] a The first item.
+   * \param [in] b The second item.
+   */
   inline void Exch (uint32_t a, uint32_t b);
+  /** Percolate a newly inserted Last item to its proper position. */ 
   void BottomUp (void);
+  /**
+   * Percolate a deletion bubble down the heap.
+   *
+   * \param [in] start Starting entry.
+   */
   void TopDown (uint32_t start);
 
+  /** The event list. */
   BinaryHeap m_heap;
 };
 
diff -Naur ns-3.23/src/core/model/int64x64-128.cc ns-3.24/src/core/model/int64x64-128.cc
--- ns-3.23/src/core/model/int64x64-128.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/int64x64-128.cc	2015-09-15 11:18:44.000000000 -0700
@@ -25,7 +25,7 @@
 /**
  * \file
  * \ingroup highprec
- * Implementation of the ns3::int64x64_t type using a native int128_t type..
+ * Implementation of the ns3::int64x64_t type using a native int128_t type.
  */
 
 namespace ns3 {
@@ -44,7 +44,7 @@
  * \param [in]  sb The signed value of the second operand.
  * \param [out] ua The unsigned magnitude of the first operand.
  * \param [out] ub The unsigned magnitude of the second operand.
- * \returns True if the result will be negative.
+ * \returns \c true if the result will be negative.
  */
 static inline  
 bool
diff -Naur ns-3.23/src/core/model/int64x64-cairo.h ns-3.24/src/core/model/int64x64-cairo.h
--- ns-3.23/src/core/model/int64x64-cairo.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/int64x64-cairo.h	2015-09-15 11:18:44.000000000 -0700
@@ -125,7 +125,7 @@
   /**
    * Construct from an integral type.
    *
-   * \param [in] v integer value to represent
+   * \param [in] v Integer value to represent
    */
   inline int64x64_t (const int v)
   {
diff -Naur ns-3.23/src/core/model/int64x64.cc ns-3.24/src/core/model/int64x64.cc
--- ns-3.23/src/core/model/int64x64.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/int64x64.cc	2015-09-15 11:18:44.000000000 -0700
@@ -40,6 +40,20 @@
 NS_LOG_COMPONENT_DEFINE ("int64x64");
 
 /**
+ * \ingroup highprec
+ * Print the high and low words of an int64x64 in hex, for debugging.
+ *
+ * \param [in] hi The high (integer) word.
+ * \param [in] lo The low (fractional) work.
+ */
+#define HEXHILOW(hi, lo) \
+  std::hex << std::setfill ('0') << std::right << " (0x"		\
+	   << std::setw (16) << hi << " "				\
+	   << std::setw (16) << lo					\
+	   << std::dec << std::setfill (' ') << std::left << ")"
+
+  
+/**
  * \internal
  * This algorithm is exact to the precision requested, up to the full
  * 64 decimal digits required to exactly represent a 64-bit fraction.
@@ -74,13 +88,6 @@
   int64x64_t low(0, absVal.GetLow ());
   int places = 0;    // Number of decimal places printed so far
   bool more = true;  // Should we print more digits?
-
-#define HEXHILOW(hi, lo) \
-  std::hex << std::setfill ('0') << std::right << " (0x"		\
-	   << std::setw (16) << hi << " "				\
-	   << std::setw (16) << lo					\
-	   << std::dec << std::setfill (' ') << std::left << ")"
-
   
   NS_LOG_LOGIC (std::endl
 		<< (floatfield ? " f" : "  ")
diff -Naur ns-3.23/src/core/model/int64x64-double.h ns-3.24/src/core/model/int64x64-double.h
--- ns-3.23/src/core/model/int64x64-double.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/int64x64-double.h	2015-09-15 11:18:44.000000000 -0700
@@ -80,7 +80,7 @@
   /**
    * Construct from a floating point value.
    *
-   * \param [in] v floating value to represent
+   * \param [in] v Floating value to represent
    */
   inline int64x64_t (double v)
     : _v (v) {}
@@ -92,7 +92,7 @@
   /**
    * Construct from an integral type.
    *
-   * \param [in] v integer value to represent
+   * \param [in] v Integer value to represent
    */
   inline int64x64_t (int v)
     : _v (v) {}
@@ -154,7 +154,7 @@
   /**
    * Get the high and low portions of this value.
    *
-   * \return a pair of the high and low words
+   * \return A pair of the high and low words
    */
   std::pair<int64_t, uint64_t> GetHighLow (void) const
     {
diff -Naur ns-3.23/src/core/model/int64x64.h ns-3.24/src/core/model/int64x64.h
--- ns-3.23/src/core/model/int64x64.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/int64x64.h	2015-09-15 11:18:44.000000000 -0700
@@ -160,7 +160,7 @@
  * all digits of the fractional part are printed, up to the
  * representation limit of 20 digits; trailing zeros are omitted.
  *
- * \param [in] os The output stream.
+ * \param [in,out] os The output stream.
  * \param [in] value The numerical value to print.
  * \returns The stream.
  */
@@ -169,7 +169,7 @@
  * \ingroup highprec
  * Input streamer for int64x64_t.
  *
- * \param [in] is The input stream.
+ * \param [in,out] is The input stream.
  * \param [out] value The numerical value to set.
  * \returns The stream.
  */
@@ -178,7 +178,7 @@
 /**
  * \ingroup highprec
  * Absolute value.
- * \param value The value to operate on.
+ * \param [in] value The value to operate on.
  * \return The absolute value of \p value.
  */
 inline int64x64_t Abs (const int64x64_t &value)
diff -Naur ns-3.23/src/core/model/integer.cc ns-3.24/src/core/model/integer.cc
--- ns-3.23/src/core/model/integer.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/integer.cc	2015-09-15 11:18:44.000000000 -0700
@@ -40,9 +40,9 @@
  * \ingroup attribute_Integer
  * Make an Integer attribute checker with embedded numeric type name.
  *
- * \param min The minimum allowed value.
- * \param max The maximum allowed value.
- * \param name The original type name ("int8_t", "int16_t", _etc_.).
+ * \param [in] min The minimum allowed value.
+ * \param [in] max The maximum allowed value.
+ * \param [in] name The original type name ("int8_t", "int16_t", _etc_.).
  * \returns The AttributeChecker.
  */
 Ptr<const AttributeChecker>
diff -Naur ns-3.23/src/core/model/int-to-type.h ns-3.24/src/core/model/int-to-type.h
--- ns-3.23/src/core/model/int-to-type.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/int-to-type.h	2015-09-15 11:18:44.000000000 -0700
@@ -36,7 +36,7 @@
  *
  * For an example, see timer-impl.h
  *
- * \tparam v The integral constant value distinguishing this type
+ * \tparam v \explicit The integral constant value distinguishing this type
  *           from other values.
  */
 template <int v>
diff -Naur ns-3.23/src/core/model/list-scheduler.h ns-3.24/src/core/model/list-scheduler.h
--- ns-3.23/src/core/model/list-scheduler.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/list-scheduler.h	2015-09-15 11:18:44.000000000 -0700
@@ -46,20 +46,31 @@
 class ListScheduler : public Scheduler
 {
 public:
+  /**
+   *  Register this type.
+   *  \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
+  /** Constructor. */
   ListScheduler ();
+  /** Destructor. */
   virtual ~ListScheduler ();
 
-  virtual void Insert (const Event &ev);
+  // Inherited
+  virtual void Insert (const Scheduler::Event &ev);
   virtual bool IsEmpty (void) const;
-  virtual Event PeekNext (void) const;
-  virtual Event RemoveNext (void);
-  virtual void Remove (const Event &ev);
+  virtual Scheduler::Event PeekNext (void) const;
+  virtual Scheduler::Event RemoveNext (void);
+  virtual void Remove (const Scheduler::Event &ev);
 
 private:
-  typedef std::list<Event> Events;
-  typedef std::list<Event>::iterator EventsI;
+  /** Event list type: a simple list of Events. */
+  typedef std::list<Scheduler::Event> Events;
+  /** Events iterator. */
+  typedef std::list<Scheduler::Event>::iterator EventsI;
+
+  /** The event list. */
   Events m_events;
 };
 
diff -Naur ns-3.23/src/core/model/log.cc ns-3.24/src/core/model/log.cc
--- ns-3.23/src/core/model/log.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/log.cc	2015-09-15 11:18:44.000000000 -0700
@@ -488,7 +488,7 @@
  * Check if a log component exists.
  * This is private to the logging implementation.
  *
- * \param componentName The putative log component name.
+ * \param [in] componentName The putative log component name.
  * \returns \c true if \c componentName exists.
  */
 static bool ComponentExists(std::string componentName) 
diff -Naur ns-3.23/src/core/model/log.h ns-3.24/src/core/model/log.h
--- ns-3.23/src/core/model/log.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/log.h	2015-09-15 11:18:44.000000000 -0700
@@ -127,8 +127,8 @@
  * Same as running your program with the NS_LOG environment
  * variable set as NS_LOG='name=level'.
  *
- * \param name The log component name.
- * \param level The logging level.
+ * \param [in] name The log component name.
+ * \param [in] level The logging level.
  */
 void LogComponentEnable (char const *name, enum LogLevel level);
 
@@ -138,7 +138,7 @@
  * Same as running your program with the NS_LOG environment
  * variable set as NS_LOG='*=level'
  *
- * \param level The logging level.
+ * \param [in] level The logging level.
  */
 void LogComponentEnableAll (enum LogLevel level);
 
@@ -149,15 +149,15 @@
  * The logging output can be later re-enabled with a call
  * to LogComponentEnable.
  *
- * \param name The log component name.
- * \param level The logging level.
+ * \param [in] name The log component name.
+ * \param [in] level The logging level.
  */
 void LogComponentDisable (char const *name, enum LogLevel level);
 
 /**
  * Disable all logging for all components.
  *
- * \param level The logging level.
+ * \param [in] level The logging level.
  */
 void LogComponentDisableAll (enum LogLevel level);
 
@@ -196,7 +196,7 @@
  *   // Further definitions outside of the ns3 namespace
  *\endcode
  *
- * \param name The log component name.
+ * \param [in] name The log component name.
  */
 #define NS_LOG_COMPONENT_DEFINE(name)                           \
   static ns3::LogComponent g_log = ns3::LogComponent (name, __FILE__)
@@ -206,8 +206,8 @@
  *
  * See LogComponent().
  *
- * \param name The log component name.
- * \param mask The default mask.
+ * \param [in] name The log component name.
+ * \param [in] mask The default mask.
  */
 #define NS_LOG_COMPONENT_DEFINE_MASK(name, mask)                \
   static ns3::LogComponent g_log = ns3::LogComponent (name, __FILE__, mask)
@@ -215,7 +215,7 @@
 /**
  * Use \ref NS_LOG to output a message of level LOG_ERROR.
  *
- * \param msg The message to log.
+ * \param [in] msg The message to log.
  */
 #define NS_LOG_ERROR(msg) \
   NS_LOG (ns3::LOG_ERROR, msg)
@@ -223,7 +223,7 @@
 /**
  * Use \ref NS_LOG to output a message of level LOG_WARN.
  *
- * \param msg The message to log.
+ * \param [in] msg The message to log.
  */
 #define NS_LOG_WARN(msg) \
   NS_LOG (ns3::LOG_WARN, msg)
@@ -231,7 +231,7 @@
 /**
  * Use \ref NS_LOG to output a message of level LOG_DEBUG.
  *
- * \param msg The message to log.
+ * \param [in] msg The message to log.
  */
 #define NS_LOG_DEBUG(msg) \
   NS_LOG (ns3::LOG_DEBUG, msg)
@@ -239,7 +239,7 @@
 /**
  * Use \ref NS_LOG to output a message of level LOG_INFO.
  *
- * \param msg The message to log.
+ * \param [in] msg The message to log.
  */
 #define NS_LOG_INFO(msg) \
   NS_LOG (ns3::LOG_INFO, msg)
@@ -247,7 +247,7 @@
 /**
  * Use \ref NS_LOG to output a message of level LOG_LOGIC
  *
- * \param msg The message to log.
+ * \param [in] msg The message to log.
  */
 #define NS_LOG_LOGIC(msg) \
   NS_LOG (ns3::LOG_LOGIC, msg)
@@ -266,14 +266,14 @@
  * Function signature for prepending the simulation time
  * to a log message.
  *
- * \param os The output stream to print on.
+ * \param [in,out] os The output stream to print on.
  */
 typedef void (*LogTimePrinter)(std::ostream &os);
 /**
  * Function signature for prepending the node id
  * to a log message.
  *
- * \param os The output stream to print on.
+ * \param [in,out] os The output stream to print on.
  */
 typedef void (*LogNodePrinter)(std::ostream &os);
 
@@ -281,7 +281,7 @@
  * Set the LogTimePrinter function to be used
  * to prepend log messages with the simulation time.
  *
- * \param lp The LogTimePrinter function.
+ * \param [in] lp The LogTimePrinter function.
  */
 void LogSetTimePrinter (LogTimePrinter lp);
 /**
@@ -294,7 +294,7 @@
  * Set the LogNodePrinter function to be used
  * to prepend log messages with the node id.
  *
- * \param np The LogNodePrinter function.
+ * \param [in] np The LogNodePrinter function.
  */
 void LogSetNodePrinter (LogNodePrinter np);
 /**
@@ -368,7 +368,7 @@
   /**
    * Prevent the enabling of a specific LogLevel.
    *
-   * \param level The LogLevel to block.
+   * \param [in] level The LogLevel to block.
    */
   void SetMask (const enum LogLevel level);
 
diff -Naur ns-3.23/src/core/model/log-macros-enabled.h ns-3.24/src/core/model/log-macros-enabled.h
--- ns-3.23/src/core/model/log-macros-enabled.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/log-macros-enabled.h	2015-09-15 11:18:44.000000000 -0700
@@ -144,8 +144,8 @@
  * NS_LOG (LOG_DEBUG, "a number="<<aNumber<<", anotherNumber="<<anotherNumber);
  * \endcode
  *
- * \param level the log level
- * \param msg the message to log
+ * \param [in] level The log level
+ * \param [in] msg The message to log
  * \internal
  * Logging implementation macro; should not be called directly.
  */
@@ -208,7 +208,7 @@
  * (at least) NS_LOG_FUNCTION(this).  Static functions should use
  * NS_LOG_FUNCTION_NOARGS() instead.
  *
- * \param parameters the parameters to output.
+ * \param [in] parameters The parameters to output.
  */
 #define NS_LOG_FUNCTION(parameters)                             \
   NS_LOG_CONDITION                                              \
@@ -233,7 +233,7 @@
  *
  * Output the requested message unconditionaly.
  *
- * \param msg the message to log
+ * \param [in] msg The message to log
  */
 #define NS_LOG_UNCOND(msg)              \
   NS_LOG_CONDITION                                              \
diff -Naur ns-3.23/src/core/model/make-event.h ns-3.24/src/core/model/make-event.h
--- ns-3.23/src/core/model/make-event.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/make-event.h	2015-09-15 11:18:44.000000000 -0700
@@ -45,10 +45,10 @@
  * Make an EventImpl from class method members which take
  * varying numbers of arguments.
  *
- * \tparam MEM The class method function signature.
- * \tparam OBJ The class type holding the method.
- * \param mem_ptr Class method member function pointer
- * \param obj Class instance.
+ * \tparam MEM \deduced The class method function signature.
+ * \tparam OBJ \deduced The class type holding the method.
+ * \param [in] mem_ptr Class method member function pointer
+ * \param [in] obj Class instance.
  * \returns The constructed EventImpl.
  */
 template <typename MEM, typename OBJ>
@@ -56,12 +56,12 @@
 
 /**
  * \copybrief MakeEvent(MEM,OBJ)
- * \tparam MEM The class method function signature.
- * \tparam OBJ The class type holding the method.
- * \tparam T1 Type of the argument to the underlying function.
- * \param mem_ptr Class method member function pointer
- * \param obj Class instance.
- * \param a1 Argument value to be bound to the underlying function.
+ * \tparam MEM \deduced The class method function signature.
+ * \tparam OBJ \deduced The class type holding the method.
+ * \tparam T1 \deduced Type of the argument to the underlying function.
+ * \param [in] mem_ptr Class method member function pointer
+ * \param [in] obj Class instance.
+ * \param [in] a1 Argument value to be bound to the underlying function.
  * \returns The constructed EventImpl.
  */
 template <typename MEM, typename OBJ,
@@ -70,14 +70,14 @@
 
 /**
  * \copybrief MakeEvent(MEM,OBJ)
- * \tparam MEM The class method function signature.
- * \tparam OBJ The class type holding the method.
- * \tparam T1 Type of the first argument to the underlying function.
- * \tparam T2 Type of the second argument to the underlying function.
- * \param mem_ptr Class method member function pointer
- * \param obj Class instance.
- * \param a1 First argument value to be bound to the underlying function.
- * \param a2 Second argument value to be bound to the underlying function.
+ * \tparam MEM \deduced The class method function signature.
+ * \tparam OBJ \deduced The class type holding the method.
+ * \tparam T1 \deduced Type of the first argument to the underlying function.
+ * \tparam T2 \deduced Type of the second argument to the underlying function.
+ * \param [in] mem_ptr Class method member function pointer
+ * \param [in] obj Class instance.
+ * \param [in] a1 First argument value to be bound to the underlying function.
+ * \param [in] a2 Second argument value to be bound to the underlying function.
  * \returns The constructed EventImpl.
  */
 template <typename MEM, typename OBJ,
@@ -86,16 +86,16 @@
 
 /**
  * \copybrief MakeEvent(MEM,OBJ)
- * \tparam MEM The class method function signature.
- * \tparam OBJ The class type holding the method.
- * \tparam T1 Type of the first argument to the underlying function.
- * \tparam T2 Type of the second argument to the underlying function.
- * \tparam T3 Type of the third argument to the underlying function.
- * \param mem_ptr Class method member function pointer
- * \param obj Class instance.
- * \param a1 First argument value to be bound to the underlying function.
- * \param a2 Second argument value to be bound to the underlying function.
- * \param a3 Third argument value to be bound to the underlying function.
+ * \tparam MEM \deduced The class method function signature.
+ * \tparam OBJ \deduced The class type holding the method.
+ * \tparam T1 \deduced Type of the first argument to the underlying function.
+ * \tparam T2 \deduced Type of the second argument to the underlying function.
+ * \tparam T3 \deduced Type of the third argument to the underlying function.
+ * \param [in] mem_ptr Class method member function pointer
+ * \param [in] obj Class instance.
+ * \param [in] a1 First argument value to be bound to the underlying function.
+ * \param [in] a2 Second argument value to be bound to the underlying function.
+ * \param [in] a3 Third argument value to be bound to the underlying function.
  * \returns The constructed EventImpl.
  */
 template <typename MEM, typename OBJ,
@@ -104,18 +104,18 @@
 
 /**
  * \copybrief MakeEvent(MEM,OBJ)
- * \tparam MEM The class method function signature.
- * \tparam OBJ The class type holding the method.
- * \tparam T1 Type of the first argument to the underlying function.
- * \tparam T2 Type of the second argument to the underlying function.
- * \tparam T3 Type of the third argument to the underlying function.
- * \tparam T4 Type of the fourth argument to the underlying function.
- * \param mem_ptr Class method member function pointer
- * \param obj Class instance.
- * \param a1 First argument value to be bound to the underlying function.
- * \param a2 Second argument value to be bound to the underlying function.
- * \param a3 Third argument value to be bound to the underlying function.
- * \param a4 Fourth argument value to be bound to the underlying function.
+ * \tparam MEM \deduced The class method function signature.
+ * \tparam OBJ \deduced The class type holding the method.
+ * \tparam T1 \deduced Type of the first argument to the underlying function.
+ * \tparam T2 \deduced Type of the second argument to the underlying function.
+ * \tparam T3 \deduced Type of the third argument to the underlying function.
+ * \tparam T4 \deduced Type of the fourth argument to the underlying function.
+ * \param [in] mem_ptr Class method member function pointer
+ * \param [in] obj Class instance.
+ * \param [in] a1 First argument value to be bound to the underlying function.
+ * \param [in] a2 Second argument value to be bound to the underlying function.
+ * \param [in] a3 Third argument value to be bound to the underlying function.
+ * \param [in] a4 Fourth argument value to be bound to the underlying function.
  * \returns The constructed EventImpl.
  */
 template <typename MEM, typename OBJ,
@@ -124,20 +124,20 @@
 
 /**
  * \copybrief MakeEvent(MEM,OBJ)
- * \tparam MEM The class method function signature.
- * \tparam OBJ The class type holding the method.
- * \tparam T1 Type of the first argument to the underlying function.
- * \tparam T2 Type of the second argument to the underlying function.
- * \tparam T3 Type of the third argument to the underlying function.
- * \tparam T4 Type of the fourth argument to the underlying function.
- * \tparam T5 Type of the fifth argument to the underlying function.
- * \param mem_ptr Class method member function pointer
- * \param obj Class instance.
- * \param a1 First argument value to be bound to the underlying function.
- * \param a2 Second argument value to be bound to the underlying function.
- * \param a3 Third argument value to be bound to the underlying function.
- * \param a4 Fourth argument value to be bound to the underlying function.
- * \param a5 Fifh argument value to be bound to the underlying function.
+ * \tparam MEM \deduced The class method function signature.
+ * \tparam OBJ \deduced The class type holding the method.
+ * \tparam T1 \deduced Type of the first argument to the underlying function.
+ * \tparam T2 \deduced Type of the second argument to the underlying function.
+ * \tparam T3 \deduced Type of the third argument to the underlying function.
+ * \tparam T4 \deduced Type of the fourth argument to the underlying function.
+ * \tparam T5 \deduced Type of the fifth argument to the underlying function.
+ * \param [in] mem_ptr Class method member function pointer
+ * \param [in] obj Class instance.
+ * \param [in] a1 First argument value to be bound to the underlying function.
+ * \param [in] a2 Second argument value to be bound to the underlying function.
+ * \param [in] a3 Third argument value to be bound to the underlying function.
+ * \param [in] a4 Fourth argument value to be bound to the underlying function.
+ * \param [in] a5 Fifh argument value to be bound to the underlying function.
  * \returns The constructed EventImpl.
  */
 template <typename MEM, typename OBJ,
@@ -159,17 +159,17 @@
  * Make an EventImpl from a function pointer taking varying numbers
  * of arguments.
  *
- * \param f The function pointer.
+ * \param [in] f The function pointer.
  * \returns The constructed EventImpl.
  */
 EventImpl * MakeEvent (void (*f)(void));
 
 /**
  * \copybrief MakeEvent(void(*f)(void))
- * \tparam U1 Formal type of the argument to the function.
- * \tparam T1 Actual type of the argument to the function.
- * \param f The function pointer.
- * \param a1 Argument to be bound to the function.
+ * \tparam U1 \deduced Formal type of the argument to the function.
+ * \tparam T1 \deduced Actual type of the argument to the function.
+ * \param [in] f The function pointer.
+ * \param [in] a1 Argument to be bound to the function.
  * \returns The constructed EventImpl.
  */
 template <typename U1,
@@ -178,13 +178,13 @@
 
 /**
  * \copybrief MakeEvent(void(*f)(void))
- * \tparam U1 Formal type of the first argument to the function.
- * \tparam U2 Formal type of the second argument to the function.
- * \tparam T1 Actual type of the first argument to the function.
- * \tparam T2 Actual type of the second argument to the function.
- * \param f The function pointer.
- * \param a1 First argument to be bound to the function.
- * \param a2 Second argument to be bound to the function.
+ * \tparam U1 \deduced Formal type of the first argument to the function.
+ * \tparam U2 \deduced Formal type of the second argument to the function.
+ * \tparam T1 \deduced Actual type of the first argument to the function.
+ * \tparam T2 \deduced Actual type of the second argument to the function.
+ * \param [in] f The function pointer.
+ * \param [in] a1 First argument to be bound to the function.
+ * \param [in] a2 Second argument to be bound to the function.
  * \returns The constructed EventImpl.
  */
 template <typename U1, typename U2,
@@ -193,16 +193,16 @@
 
 /**
  * \copybrief MakeEvent(void(*f)(void))
- * \tparam U1 Formal type of the first argument to the function.
- * \tparam U2 Formal type of the second argument to the function.
- * \tparam U3 Formal type of the third argument to the function.
- * \tparam T1 Actual type of the first argument to the function.
- * \tparam T2 Actual type of the second argument to the function.
- * \tparam T3 Actual type of the third argument to the function.
- * \param f The function pointer.
- * \param a1 First argument to be bound to the function.
- * \param a2 Second argument to be bound to the function.
- * \param a3 Third argument to be bound to the function.
+ * \tparam U1 \deduced Formal type of the first argument to the function.
+ * \tparam U2 \deduced Formal type of the second argument to the function.
+ * \tparam U3 \deduced Formal type of the third argument to the function.
+ * \tparam T1 \deduced Actual type of the first argument to the function.
+ * \tparam T2 \deduced Actual type of the second argument to the function.
+ * \tparam T3 \deduced Actual type of the third argument to the function.
+ * \param [in] f The function pointer.
+ * \param [in] a1 First argument to be bound to the function.
+ * \param [in] a2 Second argument to be bound to the function.
+ * \param [in] a3 Third argument to be bound to the function.
  * \returns The constructed EventImpl.
  */
 template <typename U1, typename U2, typename U3,
@@ -211,19 +211,19 @@
 
 /**
  * \copybrief MakeEvent(void(*f)(void))
- * \tparam U1 Formal type of the first argument to the function.
- * \tparam U2 Formal type of the second argument to the function.
- * \tparam U3 Formal type of the third argument to the function.
- * \tparam U4 Formal type of the fourth argument to the function.
- * \tparam T1 Actual type of the first argument to the function.
- * \tparam T2 Actual type of the second argument to the function.
- * \tparam T3 Actual type of the third argument to the function.
- * \tparam T4 Actual type of the fourth argument to the function.
- * \param f The function pointer.
- * \param a1 First argument to be bound to the function.
- * \param a2 Second argument to be bound to the function.
- * \param a3 Third argument to be bound to the function.
- * \param a4 Fourth argument to be bound to the function.
+ * \tparam U1 \deduced Formal type of the first argument to the function.
+ * \tparam U2 \deduced Formal type of the second argument to the function.
+ * \tparam U3 \deduced Formal type of the third argument to the function.
+ * \tparam U4 \deduced Formal type of the fourth argument to the function.
+ * \tparam T1 \deduced Actual type of the first argument to the function.
+ * \tparam T2 \deduced Actual type of the second argument to the function.
+ * \tparam T3 \deduced Actual type of the third argument to the function.
+ * \tparam T4 \deduced Actual type of the fourth argument to the function.
+ * \param [in] f The function pointer.
+ * \param [in] a1 First argument to be bound to the function.
+ * \param [in] a2 Second argument to be bound to the function.
+ * \param [in] a3 Third argument to be bound to the function.
+ * \param [in] a4 Fourth argument to be bound to the function.
  * \returns The constructed EventImpl.
  */
 template <typename U1, typename U2, typename U3, typename U4,
@@ -232,22 +232,22 @@
 
 /**
  * \copybrief MakeEvent(void(*f)(void))
- * \tparam U1 Formal type of the first argument to the function.
- * \tparam U2 Formal type of the second argument to the function.
- * \tparam U3 Formal type of the third argument to the function.
- * \tparam U4 Formal type of the fourth argument to the function.
- * \tparam U5 Formal type of the fifth argument to the function.
- * \tparam T1 Actual type of the first argument to the function.
- * \tparam T2 Actual type of the second argument to the function.
- * \tparam T3 Actual type of the third argument to the function.
- * \tparam T4 Actual type of the fourth argument to the function.
- * \tparam T5 Actual type of the fifth argument to the function.
- * \param f The function pointer.
- * \param a1 First argument to be bound to the function.
- * \param a2 Second argument to be bound to the function.
- * \param a3 Third argument to be bound to the function.
- * \param a4 Fourth argument to be bound to the function.
- * \param a5 Fifth argument to be bound to the function.
+ * \tparam U1 \deduced Formal type of the first argument to the function.
+ * \tparam U2 \deduced Formal type of the second argument to the function.
+ * \tparam U3 \deduced Formal type of the third argument to the function.
+ * \tparam U4 \deduced Formal type of the fourth argument to the function.
+ * \tparam U5 \deduced Formal type of the fifth argument to the function.
+ * \tparam T1 \deduced Actual type of the first argument to the function.
+ * \tparam T2 \deduced Actual type of the second argument to the function.
+ * \tparam T3 \deduced Actual type of the third argument to the function.
+ * \tparam T4 \deduced Actual type of the fourth argument to the function.
+ * \tparam T5 \deduced Actual type of the fifth argument to the function.
+ * \param [in] f The function pointer.
+ * \param [in] a1 First argument to be bound to the function.
+ * \param [in] a2 Second argument to be bound to the function.
+ * \param [in] a3 Third argument to be bound to the function.
+ * \param [in] a4 Fourth argument to be bound to the function.
+ * \param [in] a5 Fifth argument to be bound to the function.
  * \returns The constructed EventImpl.
  */
 template <typename U1, typename U2, typename U3, typename U4, typename U5,
@@ -274,7 +274,7 @@
  *
  * This is the generic template declaration (with empty body).
  *
- * \tparam T The class type.
+ * \tparam T \explicit The class type.
  */
 template <typename T>
 struct EventMemberImplObjTraits;
@@ -287,13 +287,13 @@
  *
  * This is the specialization for pointer types.
  *
- * \tparam T The class type.
+ * \tparam T \explicit The class type.
  */
 template <typename T>
 struct EventMemberImplObjTraits<T *>
 {
   /**
-   * \param p Object pointer.
+   * \param [in] p Object pointer.
    * \return A reference to the object pointed to by p.
    */
   static T &GetReference (T *p)
diff -Naur ns-3.23/src/core/model/map-scheduler.h ns-3.24/src/core/model/map-scheduler.h
--- ns-3.23/src/core/model/map-scheduler.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/map-scheduler.h	2015-09-15 11:18:44.000000000 -0700
@@ -44,22 +44,33 @@
 class MapScheduler : public Scheduler
 {
 public:
+  /**
+   *  Register this type.
+   *  \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
+  /** Constructor. */
   MapScheduler ();
+  /** Destructor. */
   virtual ~MapScheduler ();
 
-  virtual void Insert (const Event &ev);
+  // Inherited
+  virtual void Insert (const Scheduler::Event &ev);
   virtual bool IsEmpty (void) const;
-  virtual Event PeekNext (void) const;
-  virtual Event RemoveNext (void);
-  virtual void Remove (const Event &ev);
+  virtual Scheduler::Event PeekNext (void) const;
+  virtual Scheduler::Event RemoveNext (void);
+  virtual void Remove (const Scheduler::Event &ev);
+
 private:
+  /** Event list type: a Map from EventKey to EventImpl. */
   typedef std::map<Scheduler::EventKey, EventImpl*> EventMap;
+  /** EventMap iterator. */
   typedef std::map<Scheduler::EventKey, EventImpl*>::iterator EventMapI;
+  /** EventMap const iterator. */
   typedef std::map<Scheduler::EventKey, EventImpl*>::const_iterator EventMapCI;
 
-
+  /** The event list. */
   EventMap m_list;
 };
 
diff -Naur ns-3.23/src/core/model/names.cc ns-3.24/src/core/model/names.cc
--- ns-3.23/src/core/model/names.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/names.cc	2015-09-15 11:18:44.000000000 -0700
@@ -22,6 +22,7 @@
 #include "assert.h"
 #include "abort.h"
 #include "names.h"
+#include "singleton.h"
 
 /**
  * \file
@@ -34,20 +35,48 @@
 
 NS_LOG_COMPONENT_DEFINE ("Names");
 
+/**
+ * \ingroup config
+ *  Node in the naming tree.
+ */
 class NameNode
 {
 public:
+  /** Default constructor. */
   NameNode ();
+  /**
+   * Copy constructor.
+   *
+   * \param [in] nameNode The NameNode to copy from.
+   */
   NameNode (const NameNode &nameNode);
+  /**
+   * Constructor.
+   *
+   * \param [in] parent The parent NameNode.
+   * \param [in] name The name of this NameNode
+   * \param [in] object The object corresponding to this NameNode.
+   */
   NameNode (NameNode *parent, std::string name, Ptr<Object> object);
+  /**
+   * Assignment operator.
+   *
+   * \param [in] rhs The NameNode to copy from.
+   * \returns The lhs NameNode.
+   */
   NameNode &operator = (const NameNode &rhs);
 
+  /** Destructor. */
   ~NameNode ();
 
+  /** The parent NameNode. */
   NameNode *m_parent;
+  /** The name of this NameNode. */
   std::string m_name;
+  /** The object corresponding to this NameNode. */
   Ptr<Object> m_object;
 
+  /** Children of this NameNode. */
   std::map<std::string, NameNode *> m_nameMap;
 };
 
@@ -85,48 +114,91 @@
   NS_LOG_FUNCTION (this);
 }
 
-class NamesPriv 
+/**
+ * \ingroup config
+ * The singleton root Names object.
+ */
+class NamesPriv : public Singleton<NamesPriv>
 {
 public:
+  /** Constructor. */
   NamesPriv ();
+  /** Destructor. */
   ~NamesPriv ();
 
+  /**
+   * \copydoc Names::Add(std::string,Ptr<Object>object)
+   * \return \c true if the object was named successfully.
+   */
   bool Add (std::string name, Ptr<Object> object);
+  /**
+   * \copydoc Names::Add(std::string,std::string,Ptr<Object>)
+   * \return \c true if the object was named successfully.
+   */
   bool Add (std::string path, std::string name, Ptr<Object> object);
+  /**
+   * \copydoc Names::Add(Ptr<Object>,std::string,Ptr<Object>)
+   * \return \c true if the object was named successfully.
+   */
   bool Add (Ptr<Object> context, std::string name, Ptr<Object> object);
 
+  /**
+   * \copydoc Names::Rename(std::string,std::string)
+   * \return \c true if the object was renamed successfully.
+   */
   bool Rename (std::string oldpath, std::string newname);
+  /**
+   * \copydoc Names::Rename(std::string,std::string,std::string)
+   * \return \c true if the object was renamed successfully.
+   */
   bool Rename (std::string path, std::string oldname, std::string newname);
+  /**
+   * \copydoc Names::Rename(Ptr<Object>,std::string,std::string)
+   * \return \c true if the object was renamed successfully.
+   */
   bool Rename (Ptr<Object> context, std::string oldname, std::string newname);
 
+  /** \copydoc Names::FindName() */
   std::string FindName (Ptr<Object> object);
+  /** \copydoc Names::FindPath() */
   std::string FindPath (Ptr<Object> object);
 
+  /** \copydoc Names::Clear() */
   void Clear (void);
 
-  Ptr<Object> Find (std::string name);
+  /** \copydoc Names::Find(std::string) */
+  Ptr<Object> Find (std::string path);
+  /** \copydoc Names::Find(std::string,std::string) */
   Ptr<Object> Find (std::string path, std::string name);
+  /** \copydoc Names::Find(Ptr<Object>,std::string) */
   Ptr<Object> Find (Ptr<Object> context, std::string name);
 
 private:
   friend class Names;
-  static NamesPriv *Get (void);
 
-  NameNode *IsNamed (Ptr<Object>);
+  /**
+   * Check if an object has a name.
+   *
+   * \param [in] object The object to check.
+   * \returns The corresponding NameNode, if it exists.
+   */
+  NameNode *IsNamed (Ptr<Object> object);
+  /**
+   * Check if a name already exists as a child of a NameNode.
+   *
+   * \param [in] node The node to search.
+   * \param [in] name The name to search for.
+   * \returns \c true if \c name already exists as a child of \c node.
+   */
   bool IsDuplicateName (NameNode *node, std::string name);
 
+  /** The root NameNode. */
   NameNode m_root;
+
+  /** Map from object pointers to their NameNodes. */
   std::map<Ptr<Object>, NameNode *> m_objectMap;
 };
 
-NamesPriv *
-NamesPriv::Get (void)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  static NamesPriv namesPriv;
-  return &namesPriv;
-}
-
 NamesPriv::NamesPriv ()
 {
   NS_LOG_FUNCTION (this);
diff -Naur ns-3.23/src/core/model/names.h ns-3.24/src/core/model/names.h
--- ns-3.23/src/core/model/names.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/names.h	2015-09-15 11:18:44.000000000 -0700
@@ -31,341 +31,385 @@
 namespace ns3 {
 
 /**
- * \brief A directory of name and Ptr<Object> associations that allows us to
- * give any ns3 Object a name.
+ * \ingroup config
+ * \brief A directory of name and Ptr<Object> associations that allows
+ * us to give any ns3 Object a name.
  */
 class Names
 {
 public:
 
   /**
-   * \brief Add the association between the string "name" and the Ptr<Object> obj.
+   * \brief Add the association between the string "name" and the
+   * Ptr<Object> obj.
    *
-   * The name may begin either with "/Names" to explicitly call out the fact 
-   * that the name provided is installed under the root of the name space, 
-   * or it may begin with the name of the first object in the path.  For example, 
-   * Names::Add ("/Names/client", obj) and Names::Add ("client", obj) accomplish 
-   * exactly the same thing.  A name at a given level in the name space path must
-   * be unique.  In the case of the example above, it would be illegal to try and
-   * associate a different object with the same name: "client" at the same level 
-   * ("/Names") in the path.
-   *
-   * As well as specifying a name at the root of the "/Names" namespace, the 
-   * name parameter can contain a path that fully qualifies the name to 
-   * be added.  For example, if you previously have named an object "client"
-   * in the root namespace as above, you could name an object "under" that
-   * name by making a call like Names::Add ("/Names/client/eth0", obj).  This 
-   * will define the name "eth0" and make it reachable using the path specified.
-   * Note that Names::Add ("client/eth0", obj) would accomplish exactly the same 
-   * thing.
-   *
-   * Duplicate names are not allowed at the same level in a path, however you may
-   * associate similar names with different paths.  For example, if you define
-   * "/Names/Client", you may not define another "/Names/Client" just as you may
-   * not have two files with the same name in a classical filesystem.  However,
-   * you may have "/Names/Client/eth0" and "/Names/Server/eth0" defined at the 
-   * same time just as you might have different files of the same name under 
-   * different directories.
+   * The name may begin either with "/Names" to explicitly call out
+   * the fact that the name provided is installed under the root of
+   * the name space, or it may begin with the name of the first object
+   * in the path.  For example, Names::Add ("/Names/client", obj) and
+   * Names::Add ("client", obj) accomplish exactly the same thing.  A
+   * name at a given level in the name space path must be unique.  In
+   * the case of the example above, it would be illegal to try and
+   * associate a different object with the same name: "client" at the
+   * same level ("/Names") in the path.
+   *
+   * As well as specifying a name at the root of the "/Names"
+   * namespace, the name parameter can contain a path that fully
+   * qualifies the name to be added.  For example, if you previously
+   * have named an object "client" in the root namespace as above, you
+   * could name an object "under" that name by making a call like
+   * Names::Add ("/Names/client/eth0", obj).  This will define the
+   * name "eth0" and make it reachable using the path specified.  Note
+   * that Names::Add ("client/eth0", obj) would accomplish exactly the
+   * same thing.
+   *
+   * Duplicate names are not allowed at the same level in a path,
+   * however you may associate similar names with different paths.
+   * For example, if you define "/Names/Client", you may not define
+   * another "/Names/Client" just as you may not have two files with
+   * the same name in a classical filesystem.  However, you may have
+   * "/Names/Client/eth0" and "/Names/Server/eth0" defined at the same
+   * time just as you might have different files of the same name
+   * under different directories.
    *
-   * \param name The name of the object you want to associate; which may be 
+   * \param [in] name The name of the object you want to associate; which may be 
    *             prepended with a path to that object.
-   * \param object A smart pointer to the object itself.
+   * \param [in] object A smart pointer to the object itself.
    */
   static void Add (std::string name, Ptr<Object> object);
 
   /**
-   * \brief An intermediate form of Names::Add allowing you to provide a path to
-   * the parent object (under which you want this name to be defined) in the form
-   * of a name path string.
-   *
-   * In some cases, it is desirable to break up the path used to describe an item
-   * in the names namespace into a path and a name.  This is analogous to a
-   * file system operation in which you provide a directory name and a file name.
-   *
-   * For example, consider a situation where you have previously named an object
-   * "/Names/server".  If you further want to create an association for between a 
-   * Ptr<Object> object that you want to live "under" the server in the name space
-   * -- perhaps "eth0" -- you could do this in two ways, depending on which was 
-   * more convenient: Names::Add ("/Names/server/eth0", object) or, using the split
-   * path and name approach, Names::Add ("/Names/server", "eth0", object).
-   *
-   * Duplicate names are not allowed at the same level in a path, however you may
-   * associate similar names with different paths.  For example, if you define
-   * "/Names/Client", you may not define another "/Names/Client" just as you may
-   * not have two files with the same name in a classical filesystem.  However,
-   * you may have "/Names/Client/eth0" and "/Names/Server/eth0" defined at the 
-   * same time just as you might have different files of the same name under 
-   * different directories.
-   *
-   * \param path A path name describing a previously named object under which 
-   *             you want this new name to be defined.
-   * \param name The name of the object you want to associate.
-   * \param object A smart pointer to the object itself.
+   * \brief An intermediate form of Names::Add allowing you to provide
+   * a path to the parent object (under which you want this name to be
+   * defined) in the form of a name path string.
+   *
+   * In some cases, it is desirable to break up the path used to
+   * describe an item in the names namespace into a path and a name.
+   * This is analogous to a file system operation in which you provide
+   * a directory name and a file name.
+   *
+   * For example, consider a situation where you have previously named
+   * an object "/Names/server".  If you further want to create an
+   * association for between a Ptr<Object> object that you want to
+   * live "under" the server in the name space -- perhaps "eth0" --
+   * you could do this in two ways, depending on which was more
+   * convenient: Names::Add ("/Names/server/eth0", object) or, using
+   * the split path and name approach, Names::Add ("/Names/server",
+   * "eth0", object).
+   *
+   * Duplicate names are not allowed at the same level in a path,
+   * however you may associate similar names with different paths.
+   * For example, if you define "/Names/Client", you may not define
+   * another "/Names/Client" just as you may not have two files with
+   * the same name in a classical filesystem.  However, you may have
+   * "/Names/Client/eth0" and "/Names/Server/eth0" defined at the same
+   * time just as you might have different files of the same name
+   * under different directories.
+   *
+   * \param [in] path A path name describing a previously named object
+   *             under which you want this new name to be defined.
+   * \param [in] name The name of the object you want to associate.
+   * \param [in] object A smart pointer to the object itself.
    *
-   * \see Names::Add (Ptr<Object> context, std::string name, Ptr<Object> object);
+   * \see Names::Add (Ptr<Object>,std::string,Ptr<Object>);
    */
   static void Add (std::string path, std::string name, Ptr<Object> object);
 
   /**
-   * \brief A low-level form of Names::Add allowing you to specify the path to
-   * the parent object (under which you want this name to be defined) in the form
-   * of a previously named object.
-   *
-   * In some use cases, it is desirable to break up the path in the names name
-   * space into a path and a name.  This is analogous to a file system operation 
-   * in which you provide a directory name and a file name.  Recall that the path
-   * string actually refers to a previously named object, "under" which you want
-   * to accomplish some naming action.
+   * \brief A low-level form of Names::Add allowing you to specify the
+   * path to the parent object (under which you want this name to be
+   * defined) in the form of a previously named object.
+   *
+   * In some use cases, it is desirable to break up the path in the
+   * names name space into a path and a name.  This is analogous to a
+   * file system operation in which you provide a directory name and a
+   * file name.  Recall that the path string actually refers to a
+   * previously named object, "under" which you want to accomplish
+   * some naming action.
    * 
-   * However, the path is sometimes not available, and you only have the object 
-   * that is represented by the path in the names name space.  To support this 
-   * use-case in a reasonably high-performance way, the path string is can be 
-   * replaced by the object pointer to which that path would refer.  In the spirit
-   * of the Config code where this use-case is most prominent, we refer to this
-   * object as the "context" for the names operation.
-   *
-   * You can think of the context roughly as the inode number of a directory file
-   * in Unix.  The inode number can be used to look up the directory file which 
-   * contains the list of file names defined at that directory level.  Similarly
-   * the context is used to look up an internal name service entry which contains
-   * the names defined for that context.
-   *
-   * For example, consider a situation where you have previously named an object
-   * "/Names/server".  If you further want to create an association for between a 
-   * Ptr<Object> object that you want to live "under" the server in the name space
-   * -- perhaps "eth0" -- you could do this by providing a complete path to the 
-   * new name: Names::Add ("/Names/server/eth0", object).  If, however, somewhere
-   * in your code you only had a pointer to the server, say Ptr<Node> node, and 
-   * not a handy path string,  you could also accomplish this by 
-   * Names::Add (node, "eth0", object).
-   *
-   * Duplicate names are not allowed at the same level in a path.  In the case
-   * of this method, the context object gives the same information as a path
-   * string.  You may associate similar names with different paths.  For example,
-   *  if you define"/Names/Client", you may not define another "/Names/Client" 
-   * just as you may not have two files with the same name in a classical filesystem.
-   * However, you may have "/Names/Client/eth0" and "/Names/Server/eth0" defined at 
-   * the same time just as you might have different files of the same name under 
-   * different directories.
-   *
-   * \param context A smart pointer to an object that is used in place of the path
-   *                under which you want this new name to be defined.
-   * \param name The name of the object you want to associate.
-   * \param object A smart pointer to the object itself.
+   * However, the path is sometimes not available, and you only have
+   * the object that is represented by the path in the names name
+   * space.  To support this use-case in a reasonably high-performance
+   * way, the path string is can be replaced by the object pointer to
+   * which that path would refer.  In the spirit of the Config code
+   * where this use-case is most prominent, we refer to this object as
+   * the "context" for the names operation.
+   *
+   * You can think of the context roughly as the inode number of a
+   * directory file in Unix.  The inode number can be used to look up
+   * the directory file which contains the list of file names defined
+   * at that directory level.  Similarly the context is used to look
+   * up an internal name service entry which contains the names
+   * defined for that context.
+   *
+   * For example, consider a situation where you have previously named
+   * an object "/Names/server".  If you further want to create an
+   * association for between a Ptr<Object> object that you want to
+   * live "under" the server in the name space -- perhaps "eth0" --
+   * you could do this by providing a complete path to the new name:
+   * Names::Add ("/Names/server/eth0", object).  If, however,
+   * somewhere in your code you only had a pointer to the server, say
+   * Ptr<Node> node, and not a handy path string, you could also
+   * accomplish this by Names::Add (node, "eth0", object).
+   *
+   * Duplicate names are not allowed at the same level in a path.  In
+   * the case of this method, the context object gives the same
+   * information as a path string.  You may associate similar names
+   * with different paths.  For example, if you define"/Names/Client",
+   * you may not define another "/Names/Client" just as you may not
+   * have two files with the same name in a classical filesystem.
+   * However, you may have "/Names/Client/eth0" and
+   * "/Names/Server/eth0" defined at the same time just as you might
+   * have different files of the same name under different
+   * directories.
+   *
+   * \param [in] context A smart pointer to an object that is used
+   *             in place of the path under which you want this new
+   *             name to be defined.
+   * \param [in] name The name of the object you want to associate.
+   * \param [in] object A smart pointer to the object itself.
    */
   static void Add (Ptr<Object> context, std::string name, Ptr<Object> object);
 
   /**
    * \brief Rename a previously associated name.
    *
-   * The name may begin either with "/Names" to explicitly call out the fact 
-   * that the name provided is installed under the root of the name space, 
-   * or it may begin with the name of the first object in the path.  For example, 
-   * Names::Rename ("/Names/client", "server") and Names::Rename ("client", "server") 
-   * accomplish exactly the same thing.  Names at a given level in the name space
-   * path must be unique. In the case of the example above, it would be illegal 
-   * to try and rename a different object to the same name: "server" at the same 
-   * level ("/Names") in the path.
-   *
-   * As well as specifying a name at the root of the "/Names" namespace, the 
-   * name parameter can contain a path that fully qualifies the name to 
-   * be changed.  For example, if you previously have (re)named an object 
-   * "server" in the root namespace as above, you could then rename an object 
-   * "under" that name by making a call like Names::Rename ("/Names/server/csma", "eth0").
-   * This will rename the object previously associated with "/Names/server/csma" 
-   * to "eth0" and make leave it reachable using the path "/Names/server/eth0".
-   * Note that Names::Rename ("server/csma", "eth0") would accomplish exactly the 
-   * same thing.
-   *
-   * \param oldpath The current path name to the object you want to change.
-   * \param newname The new name of the object you want to change.
+   * The name may begin either with "/Names" to explicitly call out
+   * the fact that the name provided is installed under the root of
+   * the name space, or it may begin with the name of the first object
+   * in the path.  For example, Names::Rename ("/Names/client",
+   * "server") and Names::Rename ("client", "server") accomplish
+   * exactly the same thing.  Names at a given level in the name space
+   * path must be unique. In the case of the example above, it would
+   * be illegal to try and rename a different object to the same name:
+   * "server" at the same level ("/Names") in the path.
+   *
+   * As well as specifying a name at the root of the "/Names"
+   * namespace, the name parameter can contain a path that fully
+   * qualifies the name to be changed.  For example, if you previously
+   * have (re)named an object "server" in the root namespace as above,
+   * you could then rename an object "under" that name by making a
+   * call like Names::Rename ("/Names/server/csma", "eth0").  This
+   * will rename the object previously associated with
+   * "/Names/server/csma" to "eth0" and make leave it reachable using
+   * the path "/Names/server/eth0".  Note that Names::Rename
+   * ("server/csma", "eth0") would accomplish exactly the same thing.
+   *
+   * \param [in] oldpath The current path name to the object you want
+   *             to change.
+   * \param [in] newname The new name of the object you want to change.
    *
    * \see Names::Add (std::string name, Ptr<Object> obj)
    */
   static void Rename (std::string oldpath, std::string newname);
 
   /**
-   * \brief An intermediate form of Names::Rename allowing you to provide a path to
-   * the parent object (under which you want this name to be changed) in the form
-   * of a name path string.
-   *
-   * In some cases, it is desirable to break up the path used to describe an item
-   * in the names namespace into a path and a name.  This is analogous to a
-   * file system operation in which you provide a directory name and a file name.
-   *
-   * For example, consider a situation where you have previously named an object
-   * "/Names/server/csma".  If you want to change the name "csma" to "eth0", you
-   * could do this in two ways, depending on which was more convenient: 
-   * Names::Rename ("/Names/server/csma", "eth0") or, using the split
-   * path and name approach, Names::Rename ("/Names/server", "csma", "eth0").
-   *
-   * \param path A path name describing a previously named object under which 
-   *             you want this name change to occur (cf. directory).
-   * \param oldname The currently defined name of the object.
-   * \param newname The new name you want the object to have.
+   * \brief An intermediate form of Names::Rename allowing you to
+   * provide a path to the parent object (under which you want this
+   * name to be changed) in the form of a name path string.
+   *
+   * In some cases, it is desirable to break up the path used to
+   * describe an item in the names namespace into a path and a name.
+   * This is analogous to a file system operation in which you provide
+   * a directory name and a file name.
+   *
+   * For example, consider a situation where you have previously named
+   * an object "/Names/server/csma".  If you want to change the name
+   * "csma" to "eth0", you could do this in two ways, depending on
+   * which was more convenient: Names::Rename ("/Names/server/csma",
+   * "eth0") or, using the split path and name approach, Names::Rename
+   * ("/Names/server", "csma", "eth0").
+   *
+   * \param [in] path A path name describing a previously named object
+   *             under which you want this name change to occur
+   *             (cf. directory).
+   * \param [in] oldname The currently defined name of the object.
+   * \param [in] newname The new name you want the object to have.
    */
   static void Rename (std::string path, std::string oldname, std::string newname);
 
   /**
-   * \brief A low-level form of Names::Rename allowing you to specify the path to
-   * the parent object (under which you want this name to be changed) in the form
-   * of a previously named object.
-   *
-   * In some use cases, it is desirable to break up the path in the names name
-   * space into a path and a name.  This is analogous to a file system operation 
-   * in which you provide a directory name and a file name.  Recall that the path
-   * string actually refers to a previously named object, "under" which you want
-   * to accomplish some naming action.
+   * \brief A low-level form of Names::Rename allowing you to specify
+   * the path to the parent object (under which you want this name to
+   * be changed) in the form of a previously named object.
+   *
+   * In some use cases, it is desirable to break up the path in the
+   * names name space into a path and a name.  This is analogous to a
+   * file system operation in which you provide a directory name and a
+   * file name.  Recall that the path string actually refers to a
+   * previously named object, "under" which you want to accomplish
+   * some naming action.
    * 
-   * However, the path is sometimes not available, and you only have the object 
-   * that is represented by the path in the names name space.  To support this 
-   * use-case in a reasonably high-performance way, the path string is can be 
-   * replaced by the object pointer to which that path would refer.  In the spirit
-   * of the Config code where this use-case is most prominent, we refer to this
-   * object as the "context" for the names operation.
-   *
-   * You can think of the context roughly as the inode number of a directory file
-   * in Unix.  The inode number can be used to look up the directory file which 
-   * contains the list of file names defined at that directory level.  Similarly
-   * the context is used to look up an internal name service entry which contains
-   * the names defined for that context.
-   *
-   * For example, consider a situation where you have previously named an object
-   * "/Names/server/csma".  If you later decide to rename the csma object to say
-   * "eth0" -- you could do this by providing a complete path as in
-   * Names::Rename ("/Names/server/csma", "eth0").  If, however, somewhere
-   * in your code you only had a pointer to the server, and not a handy path 
-   * string, say Ptr<Node> node, you could also accomplish this by 
-   * Names::Rename (node, "csma", "eth0").
-   *
-   * \param context A smart pointer to an object that is used in place of the path
-   *                under which you want this new name to be defined.
-   * \param oldname The current shortname of the object you want to change.
-   * \param newname The new shortname of the object you want to change.
+   * However, the path is sometimes not available, and you only have
+   * the object that is represented by the path in the names name
+   * space.  To support this use-case in a reasonably high-performance
+   * way, the path string is can be replaced by the object pointer to
+   * which that path would refer.  In the spirit of the Config code
+   * where this use-case is most prominent, we refer to this object as
+   * the "context" for the names operation.
+   *
+   * You can think of the context roughly as the inode number of a
+   * directory file in Unix.  The inode number can be used to look up
+   * the directory file which contains the list of file names defined
+   * at that directory level.  Similarly the context is used to look
+   * up an internal name service entry which contains the names
+   * defined for that context.
+   *
+   * For example, consider a situation where you have previously named
+   * an object "/Names/server/csma".  If you later decide to rename
+   * the csma object to say "eth0" -- you could do this by providing a
+   * complete path as in Names::Rename ("/Names/server/csma", "eth0").
+   * If, however, somewhere in your code you only had a pointer to the
+   * server, and not a handy path string, say Ptr<Node> node, you
+   * could also accomplish this by Names::Rename (node, "csma",
+   * "eth0").
+   *
+   * \param [in] context A smart pointer to an object that is used
+   *             in place of the path under which you want this
+   *             new name to be defined.
+   * \param [in] oldname The current shortname of the object you want
+   *             to change.
+   * \param [in] newname The new shortname of the object you want
+   *             to change.
    */
   static void Rename (Ptr<Object> context, std::string oldname, std::string newname);
 
   /**
-   * Given a pointer to an object, look to see if that object has a name
-   * associated with it and, if so, return the name of the object otherwise
-   * return an empty string.
-   *
-   * An object can be referred to in two ways.  Either you can talk about it
-   * using its fully qualified path name, for example, "/Names/client/eth0"
-   * or you can refer to it by its name, in this case "eth0".
+   * \brief Given a pointer to an object, look to see if that object
+   * has a name associated with it and, if so, return the name of the
+   * object otherwise return an empty string.
+   *
+   * An object can be referred to in two ways.  Either you can talk
+   * about it using its fully qualified path name, for example,
+   * "/Names/client/eth0" or you can refer to it by its name, in this
+   * case "eth0".
    *
    * This method returns the name of the object, e.g., "eth0".
    *
-   * \param object A smart pointer to an object for which you want to find
-   *               its name.
+   * \param [in] object A smart pointer to an object for which you want
+   *             to find its name.
    *
-   * \returns a string containing the name of the object if found, otherwise
-   *          the empty string.
+   * \returns A string containing the name of the object if found,
+   *          otherwise the empty string.
    */
   static std::string FindName (Ptr<Object> object);
 
   /**
-   * Given a pointer to an object, look to see if that object has a name
-   * associated with it and return the fully qualified name path of the 
-   * object otherwise return an empty string.
+   * \brief Given a pointer to an object, look to see if that object
+   * has a name associated with it and return the fully qualified name
+   * path of the object otherwise return an empty string.
+   *
+   * An object can be referred to in two ways.  Either you can talk
+   * about it using its fully qualified path name, for example,
+   * "/Names/client/eth0" or you can refer to it by its name, in this
+   * case "eth0".
    *
-   * An object can be referred to in two ways.  Either you can talk about it
-   * using its fully qualified path name, for example, "/Names/client/eth0"
-   * or you can refer to it by its name, in this case "eth0".
-   *
-   * This method returns the name path of the object, e.g., "Names/client/eth0".
+   * This method returns the name path of the object, e.g.,
+   * "Names/client/eth0".
    *
-   * \param object A smart pointer to an object for which you want to find
-   *               its fullname.
+   * \param [in] object A smart pointer to an object for which you
+   *             want to find its fullname.
    *
-   * \returns a string containing the name path of the object, otherwise
-   *          the empty string.
+   * \returns A string containing the name path of the object,
+   *          otherwise the empty string.
    */
   static std::string FindPath (Ptr<Object> object);
 
   /**
-   * Clear the list of objects associated with names.
+   * \brief Clear the list of objects associated with names.
    */
 
   static void Clear (void);
 
   /**
-   * Given a name path string, look to see if there's an object in the system
-   * with that associated to it.  If there is, do a GetObject on the resulting
-   * object to convert it to the requested typename and return it.
+   * \brief Given a name path string, look to see if there's an object
+   * in the system with that associated to it.  If there is, do a
+   * GetObject on the resulting object to convert it to the requested
+   * typename and return it.
    * 
-   * An object can be referred to in two ways.  Either you can talk about it
-   * using its fully qualified path name, for example, "/Names/client/eth0"
-   * or you can refer to it by its name, in this case "eth0".
+   * An object can be referred to in two ways.  Either you can talk
+   * about it using its fully qualified path name, for example,
+   * "/Names/client/eth0" or you can refer to it by its name, in this
+   * case "eth0".
    *
-   * This method requires that the name path of the object be provided, e.g., 
-   * "Names/client/eth0".
+   * This method requires that the name path of the object be
+   * provided, e.g., "Names/client/eth0".
    *
-   * \param path A string containing a name space path used to locate the object.
+   * \param [in] path A string containing a name space path used
+   *             to locate the object.
    *
-   * \returns a smart pointer to the named object converted to the requested
-   *          type.
+   * \returns A smart pointer to the named object converted to
+   *          the requested type.
    */
   template <typename T>
   static Ptr<T> Find (std::string path);
 
   /**
-   * Given a path to an object and an object name, look through the names defined
-   * under the path to see if there's an object there with the given name.
-   *
-   * In some cases, it is desirable to break up the path used to describe an item
-   * in the names namespace into a path and a name.  This is analogous to a
-   * file system operation in which you provide a directory name and a file name.
-   *
-   * For example, consider a situation where you have previously named an object
-   * "/Names/server/eth0".  If you want to discover the object which you associated
-   * with this path, you could do this in two ways, depending on which was more 
-   * convenient: Names::Find ("/Names/server/eth0") or, using the split path and 
-   * name approach, Names::Find ("/Names/server", "eth0").
-   *
-   * \param path A path name describing a previously named object under which 
-   *             you want to look for the specified name.
-   * \param name A string containing a name to search for.
+   * \brief Given a path to an object and an object name, look through
+   * the names defined under the path to see if there's an object
+   * there with the given name.
+   *
+   * In some cases, it is desirable to break up the path used to
+   * describe an item in the names namespace into a path and a name.
+   * This is analogous to a file system operation in which you provide
+   * a directory name and a file name.
+   *
+   * For example, consider a situation where you have previously named
+   * an object "/Names/server/eth0".  If you want to discover the
+   * object which you associated with this path, you could do this in
+   * two ways, depending on which was more convenient: Names::Find
+   * ("/Names/server/eth0") or, using the split path and name
+   * approach, Names::Find ("/Names/server", "eth0").
+   *
+   * \param [in] path A path name describing a previously named object
+   *             under which you want to look for the specified name.
+   * \param [in] name A string containing a name to search for.
    *
-   * \returns a smart pointer to the named object converted to the requested
-   *          type.
+   * \returns A smart pointer to the named object converted to
+   *          the requested type.
    */
   template <typename T>
   static Ptr<T> Find (std::string path, std::string name);
 
   /**
-   * Given a path to an object and an object name, look through the names defined
-   * under the path to see if there's an object there with the given name.
-   *
-   * In some cases, it is desirable to break up the path used to describe an item
-   * in the names namespace into a path and a name.  This is analogous to a
-   * file system operation in which you provide a directory name and a file name.
-   *
-   * For example, consider a situation where you have previously named an object
-   * "/Names/server/eth0".  If you want to discover the object which you associated
-   * with this path, you could do this in two ways, depending on which was more 
-   * convenient: Names::Find ("/Names/server/eth0") or, using the split path and 
-   * name approach, Names::Find ("/Names/server", "eth0").
-   *
-   * However, the path is sometimes not available, and you only have the object 
-   * that is represented by the path in the names name space.  To support this 
-   * use-case in a reasonably high-performance way, the path string is can be 
-   * replaced by the object pointer to which that path would refer.  In the spirit
-   * of the Config code where this use-case is most prominent, we refer to this
-   * object as the "context" for the names operation.
-   *
-   * You can think of the context roughly as the inode number of a directory file
-   * in Unix.  The inode number can be used to look up the directory file which 
-   * contains the list of file names defined at that directory level.  Similarly
-   * the context is used to look up an internal name service entry which contains
-   * the names defined for that context.
-   *
-   * \param context A smart pointer to an object that is used in place of the path
-   *                under which you want this new name to be defined.
-   * \param name A string containing a name to search for.
+   * \brief Given a path to an object and an object name, look through
+   * the names defined under the path to see if there's an object
+   * there with the given name.
+   *
+   * In some cases, it is desirable to break up the path used to
+   * describe an item in the names namespace into a path and a name.
+   * This is analogous to a file system operation in which you provide
+   * a directory name and a file name.
+   *
+   * For example, consider a situation where you have previously named
+   * an object "/Names/server/eth0".  If you want to discover the
+   * object which you associated with this path, you could do this in
+   * two ways, depending on which was more convenient: Names::Find
+   * ("/Names/server/eth0") or, using the split path and name
+   * approach, Names::Find ("/Names/server", "eth0").
+   *
+   * However, the path is sometimes not available, and you only have
+   * the object that is represented by the path in the names name
+   * space.  To support this use-case in a reasonably high-performance
+   * way, the path string is can be replaced by the object pointer to
+   * which that path would refer.  In the spirit of the Config code
+   * where this use-case is most prominent, we refer to this object as
+   * the "context" for the names operation.
+   *
+   * You can think of the context roughly as the inode number of a
+   * directory file in Unix.  The inode number can be used to look up
+   * the directory file which contains the list of file names defined
+   * at that directory level.  Similarly the context is used to look
+   * up an internal name service entry which contains the names
+   * defined for that context.
+   *
+   * \param [in] context A smart pointer to an object that is used
+   *             in place of the path under which you want this
+   *             new name to be defined.
+   * \param [in] name A string containing a name to search for.
    *
-   * \returns a smart pointer to the named object converted to the requested
-   *          type.
+   * \returns A smart pointer to the named object converted to
+   *          the requested type.
    */
   template <typename T>
   static Ptr<T> Find (Ptr<Object> context, std::string name);
@@ -374,42 +418,44 @@
   /**
    * \brief Non-templated internal version of Names::Find
    *
-   * \param path A string containing the path of the object to look for.
+   * \param [in] path A string containing the path of the object
+   *             to look for.
    *
-   * \returns a smart pointer to the named object.
+   * \returns A smart pointer to the named object.
    */
   static Ptr<Object> FindInternal (std::string path);
 
   /**
    * \brief Non-templated internal version of Names::Find
    *
-   * \param path A string containing the path to search for the object in.
-   * \param name A string containing the name of the object to look for.
+   * \param [in] path A string containing the path to search
+   *             for the object in.
+   * \param [in] name A string containing the name of the object
+   *             to look for.
    *
-   * \returns a smart pointer to the named object.
+   * \returns A smart pointer to the named object.
    */
   static Ptr<Object> FindInternal (std::string path, std::string name);
 
   /**
    * \brief Non-templated internal version of Names::Find
    *
-   * \param context A smart pointer to an object under which you want to look 
-   *                for the provided name.
-   * \param name A string containing the name to look for.
+   * \param [in] context A smart pointer to an object under which
+   *             you want to look for the provided name.
+   * \param [in] name A string containing the name to look for.
    *
-   * \returns a smart pointer to the named object.
+   * \returns A smart pointer to the named object.
    */
   static Ptr<Object> FindInternal (Ptr<Object> context, std::string name);
 };
 
-/**
- * \brief Template definition of corresponding template declaration found in class Names.
- */
+  
 template <typename T>
+/* static */
 Ptr<T> 
-Names::Find (std::string name)
+Names::Find (std::string path)
 {
-  Ptr<Object> obj = FindInternal (name);
+  Ptr<Object> obj = FindInternal (path);
   if (obj)
     {
       return obj->GetObject<T> ();
@@ -420,10 +466,8 @@
     }
 }
 
-/**
- * \brief Template definition of corresponding template declaration found in class Names.
- */
 template <typename T>
+/* static */
 Ptr<T> 
 Names::Find (std::string path, std::string name)
 {
@@ -438,10 +482,8 @@
     }
 }
 
-/**
- * \brief Template definition of corresponding template declaration found in class Names.
- */
 template <typename T>
+/* static */
 Ptr<T> 
 Names::Find (Ptr<Object> context, std::string name)
 {
diff -Naur ns-3.23/src/core/model/non-copyable.h ns-3.24/src/core/model/non-copyable.h
--- ns-3.23/src/core/model/non-copyable.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/core/model/non-copyable.h	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,75 @@
+/* -*- 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 class declaration and implementation.
+ */
+
+/**
+ * \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 ns-3.23/src/core/model/nstime.h ns-3.24/src/core/model/nstime.h
--- ns-3.23/src/core/model/nstime.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/nstime.h	2015-09-15 11:18:44.000000000 -0700
@@ -77,9 +77,9 @@
  *
  * You can also use the following non-member functions to manipulate
  * any of these ns3::Time object:
- *  - \ref Abs()
- *  - \ref Max()
- *  - \ref Min()
+ *  - Abs(Time)
+ *  - Max(Time,Time)
+ *  - Min(Time,Time)
  *
  * This class also controls the resolution of the underlying time value.
  * The resolution is the smallest representable time interval.
@@ -123,7 +123,7 @@
   /**
    *  Assignment operator
    * \param [in] o Time to assign.
-   * \return the Time.
+   * \return The Time.
    */      
   inline Time & operator = (const Time & o)
   {
@@ -161,7 +161,6 @@
    *  Construct from a numeric value.
    *  The current time resolution will be assumed as the unit.
    *  \param [in] v The value.
-   *  @{
    */
   explicit inline Time (double v)
     : m_data (lround (v))
@@ -228,7 +227,6 @@
       }
   }
   /**@}*/
-  /**@}*/
   
   /**
    * \brief Construct Time object from common time expressions like "1ms"
@@ -248,7 +246,7 @@
    * There can be no white space between the numerical portion
    * and the units.  Any otherwise malformed string causes a fatal error to
    * occur.
-   * \param s The string to parse into a Time
+   * \param [in] s The string to parse into a Time
    */
   explicit Time (const std::string & s);
 
@@ -272,27 +270,27 @@
       }
   }
 
-  /** \return true if the time is zero, false otherwise. */
+  /** \return \c true if the time is zero, \c false otherwise. */
   inline bool IsZero (void) const
   {
     return m_data == 0;
   }
-  /** \return true if the time is negative or zero, false otherwise. */
+  /** \return \c true if the time is negative or zero, \c false otherwise. */
   inline bool IsNegative (void) const
   {
     return m_data <= 0;
   }
-  /** \return true if the time is positive or zero, false otherwise. */
+  /** \return \c true if the time is positive or zero, \c false otherwise. */
   inline bool IsPositive (void) const
   {
     return m_data >= 0;
   }
-  /** \return true if the time is strictly negative, false otherwise. */
+  /** \return \c true if the time is strictly negative, \c false otherwise. */
   inline bool IsStrictlyNegative (void) const
   {
     return m_data < 0;
   }
-  /** \return true if the time is strictly positive, false otherwise. */
+  /** \return \c true if the time is strictly positive, \c false otherwise. */
   inline bool IsStrictlyPositive (void) const
   {
     return m_data > 0;
@@ -309,11 +307,20 @@
   }
 
   /**
+   * \name Convert to Number in a Unit.
+   * Convert a Time to number, in indicated units.
+   *
+   * Conversions to seconds and larger will return doubles, with
+   * possible loss of precision.  Conversions to units smaller than
+   * seconds will by rounded.
+   *
+   * @{
+   */
+  /**
    * Get an approximation of the time stored in this instance
    * in the indicated unit.
    *
    * \return An approximate value in the indicated unit.
-   * @{
    */
   inline double GetYears (void) const
   {
@@ -358,9 +365,15 @@
   /**@}*/
 
   /**
-   * \returns the raw time value, in the current unit
+   * \name Convert to Raw Value.
+   * Convert a Time to a number in the current resolution units.
+   *
    * @{
    */
+  /**
+   * Get the raw time value, in the current resolution unit.
+   * \returns The raw time value
+   */
   inline int64_t GetTimeStep (void) const
   {
     return m_data;
@@ -377,7 +390,7 @@
 
 
   /**
-   * \param resolution the new resolution to use
+   * \param [in] resolution The new resolution to use
    *
    * Change the global resolution used to convert all
    * user-provided time values in Time objects and Time objects
@@ -385,7 +398,7 @@
    */
   static void SetResolution (enum Unit resolution);
   /**
-   * \returns the current global resolution.
+   * \returns The current global resolution.
    */
   static enum Unit GetResolution (void);
 
@@ -401,12 +414,17 @@
     return Time (value);
   }
   /**
+   * \name Create Times from Values and Units.
+   * Create Times from values given in the indicated units.
+   *
+   * @{
+   */
+  /**
    *  Create a Time equal to \p value  in unit \c unit
    *
    *  \param [in] value The new Time value, expressed in \c unit
    *  \param [in] unit The unit of \p value
    *  \return The Time representing \p value in \c unit
-   *  @{
    */
   inline static Time FromInteger (uint64_t value, enum Unit unit)
   {
@@ -443,13 +461,18 @@
   }
   /**@}*/
 
-  
+
+  /**
+   * \name Get Times as Numbers in Specified Units
+   * Get the Time as integers or doubles in the indicated unit.
+   *
+   * @{
+   */
   /**
    *  Get the Time value expressed in a particular unit.
    *
    *  \param [in] unit The desired unit
    *  \return The Time expressed in \p unit
-   *  @{
    */
   inline int64_t ToInteger (enum Unit unit) const
   {
@@ -503,20 +526,11 @@
    * \endcode
    * will print ``+3140.0ms``
    *
-   * \param unit [in] The unit to use.
+   * \param [in] unit The unit to use.
    * \return The Time with embedded unit.
    */
   TimeWithUnit As (const enum Unit unit) const;
 
-  /**
-   * TracedValue callback signature for Time
-   *
-   * \param [in] oldValue original value of the traced variable
-   * \param [in] newValue new value of the traced variable
-   */
-  typedef void (* TracedValueCallback)(const Time oldValue,
-                                       const Time newValue);
-  
 private:
   /** How to convert between other units and the current unit. */
   struct Information
@@ -548,7 +562,7 @@
    *  Get the Information record for \p timeUnit for the current Resolution
    *
    *  \param [in] timeUnit The Unit to get Information for
-   *  \return the Information for \p timeUnit
+   *  \return The Information for \p timeUnit
    */
   static inline struct Information *PeekInformation (enum Unit timeUnit)
   {
@@ -610,7 +624,7 @@
   /**
    *  Function to force static initialization of Time.
    *
-   * \return true on the first call
+   * \return \c true on the first call
    */
   static bool StaticInit ();
 private:
@@ -642,11 +656,15 @@
    */
   static void ConvertTimes (const enum Unit unit);
 
+  /*
+   * \name Arithmetic Operators
+   * Arithmetic operators between Times, and scaling by scalars.
+   */
   /**
-   *  @{
+   * @{
    *  Arithmetic operator.
    *  \param [in] lhs Left hand argument
-   *  \param [in] rhs Righ hand argument
+   *  \param [in] rhs Right hand argument
    *  \return The result of the operator.
    */
   friend bool operator == (const Time & lhs, const Time & rhs);
@@ -663,26 +681,26 @@
   friend Time operator / (const Time & lhs, const int64_t & rhs);
   friend Time & operator += (Time & lhs, const Time & rhs);
   friend Time & operator -= (Time & lhs, const Time & rhs);
-  /**@}*/
-  
+  /** @} */
+
   /**
    *  Absolute value function for Time
-   *  \param time the input value
-   *  \returns the absolute value of the input value.
+   *  \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 ta the first value
-   *  \param tb the seconds value
-   *  \returns the max of the two input values.
+   *  \param [in] ta The first value
+   *  \param [in] tb The seconds value
+   *  \returns The max of the two input values.
    */
   friend Time Max (const Time & ta, const Time & tb);
   /**
    *  Min function for Time.
-   *  \param ta the first value
-   *  \param tb the seconds value
-   *  \returns the min of the two input values.
+   *  \param [in] ta The first value
+   *  \param [in] tb The seconds value
+   *  \returns The min of the two input values.
    */
   friend Time Min (const Time & ta, const Time & tb);
 
@@ -690,6 +708,17 @@
 
 };  // class Time
 
+namespace TracedValueCallback {
+  
+  /**
+   * TracedValue callback signature for Time
+   *
+   * \param [in] oldValue Original value of the traced variable
+   * \param [in] newValue New value of the traced variable
+   */
+  typedef void (* Time)(Time oldValue, Time newValue);
+  
+}  // namespace TracedValueCallback
 
 /// Force static initialization of Time
 static bool NS_UNUSED_GLOBAL (g_TimeStaticInit) = Time::StaticInit ();
@@ -769,7 +798,7 @@
   lhs.m_data -= rhs.m_data;
   return lhs;
 }
-
+/**@}*/
   
 inline Time Abs (const Time & time)
 {
@@ -796,7 +825,7 @@
  * The stream `width` and `precision` are ignored; Time output always
  * includes ".0".
  *
- * \param [in] os The output stream.
+ * \param [in,out] os The output stream.
  * \param [in] time The Time to put on the stream.
  * \return The stream.
  */
@@ -807,7 +836,7 @@
  *
  * Uses the Time::Time (const std::string &) constructor
  *
- * \param [in] is The input stream.
+ * \param [in,out] is The input stream.
  * \param [out] time The Time variable to set from the stream data.
  * \return The stream.
  */
@@ -827,7 +856,7 @@
 /**
  * \ingroup timecivil
  * Construct a Time in the indicated unit.
- * \param value The value
+ * \param [in] value The value
  * \return The Time
  * @{
  */
@@ -935,7 +964,7 @@
  *
  *  \param [in] min Minimum allowed value.
  *  \param [in] max Maximum allowed value.
- *  \return the AttributeChecker
+ *  \return The AttributeChecker
  */
 Ptr<const AttributeChecker> MakeTimeChecker (const Time min, const Time max);
 
@@ -943,7 +972,7 @@
  * \ingroup time
  * \brief Helper to make an unbounded Time checker.
  *
- * \return the AttributeChecker
+ * \return The AttributeChecker
  */
 inline
 Ptr<const AttributeChecker> MakeTimeChecker (void)
@@ -956,7 +985,7 @@
  * \brief Helper to make a Time checker with a lower bound.
  *
  *  \param [in] min Minimum allowed value.
- * \return the AttributeChecker
+ * \return The AttributeChecker
  */
 inline
 Ptr<const AttributeChecker> MakeTimeChecker (const Time min)
@@ -988,7 +1017,7 @@
 
   /**
    *  Output streamer
-   *  \param [in] os The stream.
+   *  \param [in,out] os The stream.
    *  \param [in] timeU The Time with desired unit
    *  \returns The stream.
    */
diff -Naur ns-3.23/src/core/model/object-base.cc ns-3.24/src/core/model/object-base.cc
--- ns-3.23/src/core/model/object-base.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/object-base.cc	2015-09-15 11:18:44.000000000 -0700
@@ -53,6 +53,7 @@
   NS_LOG_FUNCTION_NOARGS ();
   TypeId tid = TypeId ("ns3::ObjectBase");
   tid.SetParent (tid);
+  tid.SetGroupName ("Core");
   return tid;
 }
 
diff -Naur ns-3.23/src/core/model/object-base.h ns-3.24/src/core/model/object-base.h
--- ns-3.23/src/core/model/object-base.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/object-base.h	2015-09-15 11:18:44.000000000 -0700
@@ -149,9 +149,9 @@
    *
    * The target trace source should be registered with TypeId::AddTraceSource.
    *
-   * \param name The name of the target trace source.
-   * \param context The trace context associated to the callback.
-   * \param cb The callback to connect to the trace source.
+   * \param [in] name The name of the target trace source.
+   * \param [in] context The trace context associated to the callback.
+   * \param [in] cb The callback to connect to the trace source.
    * \returns \c true.
    */
   bool TraceConnect (std::string name, std::string context, const CallbackBase &cb);
@@ -160,8 +160,8 @@
    *
    * The target trace source should be registered with TypeId::AddTraceSource.
    *
-   * \param name The name of the target trace source.
-   * \param cb The callback to connect to the trace source.
+   * \param [in] name The name of the target trace source.
+   * \param [in] cb The callback to connect to the trace source.
    * \returns \c true.
    */
   bool TraceConnectWithoutContext (std::string name, const CallbackBase &cb);
@@ -171,9 +171,9 @@
    *
    * The target trace source should be registered with TypeId::AddTraceSource.
    *
-   * \param name The name of the target trace source.
-   * \param context The trace context associated to the callback.
-   * \param cb The callback to disconnect from the trace source.
+   * \param [in] name The name of the target trace source.
+   * \param [in] context The trace context associated to the callback.
+   * \param [in] cb The callback to disconnect from the trace source.
    * \returns \c true.
    */
   bool TraceDisconnect (std::string name, std::string context, const CallbackBase &cb);
@@ -183,8 +183,8 @@
    *
    * The target trace source should be registered with TypeId::AddTraceSource.
    *
-   * \param name The name of the target trace source.
-   * \param cb The callback to disconnect from the trace source.
+   * \param [in] name The name of the target trace source.
+   * \param [in] cb The callback to disconnect from the trace source.
    * \returns \c true.
    */
   bool TraceDisconnectWithoutContext (std::string name, const CallbackBase &cb);
@@ -209,7 +209,7 @@
    * you should make sure that you invoke this method from
    * your most-derived constructor.
    *
-   * \param attributes The attribute values used to initialize 
+   * \param [in] attributes The attribute values used to initialize 
    *        the member variables of this object's instance.
    */
   void ConstructSelf (const AttributeConstructionList &attributes);
diff -Naur ns-3.23/src/core/model/object-factory.h ns-3.24/src/core/model/object-factory.h
--- ns-3.23/src/core/model/object-factory.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/object-factory.h	2015-09-15 11:18:44.000000000 -0700
@@ -57,7 +57,7 @@
   /**
    * Construct a factory for a specific TypeId by name.
    *
-   * \param typeId The name of the TypeId this factory should create.
+   * \param [in] typeId The name of the TypeId this factory should create.
    */
   ObjectFactory (std::string typeId);
 
@@ -65,7 +65,7 @@
   /**
    * Set the TypeId of the Objects to be created by this factory.
    *
-   * \param tid The TypeId of the object to instantiate.
+   * \param [in] tid The TypeId of the object to instantiate.
    */
   void SetTypeId (TypeId tid);
   void SetTypeId (const char *tid);
@@ -75,8 +75,8 @@
   /**
    * Set an attribute to be set during construction.
    *
-   * \param name The name of the attribute to set.
-   * \param value The value of the attribute to set.
+   * \param [in] name The name of the attribute to set.
+   * \param [in] value The value of the attribute to set.
    */
   void Set (std::string name, const AttributeValue &value);
 
@@ -99,7 +99,7 @@
    * returning a pointer of the requested type to the user. This method
    * is really syntactical sugar.
    *
-   * \tparam T The requested Object type.
+   * \tparam T \explicit The requested Object type.
    * \returns A new object instance.
    */
   template <typename T>
@@ -112,7 +112,7 @@
    * The configuration will be printed as a string with the form
    * "<TypeId-name>[<attribute-name>=<attribute-value>|...]"
    *
-   * \param [in] os The stream.
+   * \param [in,out] os The stream.
    * \param [in] factory The ObjectFactory.
    * \returns The stream.
    */
@@ -123,7 +123,7 @@
    * The configuration should be in the form
    * "<TypeId-name>[<attribute-name>=<attribute-value>|...]"
    *
-   * \param [in] is The input stream.
+   * \param [in,out] is The input stream.
    * \param [out] factory The factory to configure as described by the stream.
    * \return The stream.
    */
@@ -146,38 +146,40 @@
  * \ingroup object
  * Allocate an Object on the heap and initialize with a set of attributes.
  *
- * \tparam T The requested Object type.
- * \param n1 Name of attribute
- * \param v1 Value of attribute
- * \param n2 Name of attribute
- * \param v2 Value of attribute
- * \param n3 Name of attribute
- * \param v3 Value of attribute
- * \param n4 Name of attribute
- * \param v4 Value of attribute
- * \param n5 Name of attribute
- * \param v5 Value of attribute
- * \param n6 Name of attribute
- * \param v6 Value of attribute
- * \param n7 Name of attribute
- * \param v7 Value of attribute
- * \param n8 Name of attribute
- * \param v8 Value of attribute
- * \param n9 Name of attribute
- * \param v9 Value of attribute
+ * \tparam T \explicit The requested Object type.
+ * \param [in] n1 Name of attribute
+ * \param [in] v1 Value of attribute
+ * \param [in] n2 Name of attribute
+ * \param [in] v2 Value of attribute
+ * \param [in] n3 Name of attribute
+ * \param [in] v3 Value of attribute
+ * \param [in] n4 Name of attribute
+ * \param [in] v4 Value of attribute
+ * \param [in] n5 Name of attribute
+ * \param [in] v5 Value of attribute
+ * \param [in] n6 Name of attribute
+ * \param [in] v6 Value of attribute
+ * \param [in] n7 Name of attribute
+ * \param [in] v7 Value of attribute
+ * \param [in] n8 Name of attribute
+ * \param [in] v8 Value of attribute
+ * \param [in] n9 Name of attribute
+ * \param [in] v9 Value of attribute
  * \returns A pointer to a newly allocated object.
  */
 template <typename T>
 Ptr<T> 
-CreateObjectWithAttributes (std::string n1 = "", const AttributeValue & v1 = EmptyAttributeValue (),
-                            std::string n2 = "", const AttributeValue & v2 = EmptyAttributeValue (),
-                            std::string n3 = "", const AttributeValue & v3 = EmptyAttributeValue (),
-                            std::string n4 = "", const AttributeValue & v4 = EmptyAttributeValue (),
-                            std::string n5 = "", const AttributeValue & v5 = EmptyAttributeValue (),
-                            std::string n6 = "", const AttributeValue & v6 = EmptyAttributeValue (),
-                            std::string n7 = "", const AttributeValue & v7 = EmptyAttributeValue (),
-                            std::string n8 = "", const AttributeValue & v8 = EmptyAttributeValue (),
-                            std::string n9 = "", const AttributeValue & v9 = EmptyAttributeValue ());
+CreateObjectWithAttributes
+  (std::string n1 = "", const AttributeValue & v1 = EmptyAttributeValue (),
+   std::string n2 = "", const AttributeValue & v2 = EmptyAttributeValue (),
+   std::string n3 = "", const AttributeValue & v3 = EmptyAttributeValue (),
+   std::string n4 = "", const AttributeValue & v4 = EmptyAttributeValue (),
+   std::string n5 = "", const AttributeValue & v5 = EmptyAttributeValue (),
+   std::string n6 = "", const AttributeValue & v6 = EmptyAttributeValue (),
+   std::string n7 = "", const AttributeValue & v7 = EmptyAttributeValue (),
+   std::string n8 = "", const AttributeValue & v8 = EmptyAttributeValue (),
+   std::string n9 = "", const AttributeValue & v9 = EmptyAttributeValue ()
+   );
 
 
 ATTRIBUTE_HELPER_HEADER (ObjectFactory);
diff -Naur ns-3.23/src/core/model/object.h ns-3.24/src/core/model/object.h
--- ns-3.23/src/core/model/object.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/object.h	2015-09-15 11:18:44.000000000 -0700
@@ -155,9 +155,9 @@
   template <typename T>
   inline Ptr<T> GetObject (void) const;
   /**
-   * Get a pointer to the requested aggregated Object.
+   * Get a pointer to the requested aggregated Object by TypeId.
    * 
-   * \param tid The TypeId of the requested Object.
+   * \param [in] tid The TypeId of the requested Object.
    * \returns A pointer to the requested Object, or zero
    *          if it could not be found.
    */
@@ -181,7 +181,7 @@
   /**
    * Aggregate two Objects together.
    *
-   * \param other The other Object pointer
+   * \param [in] other The other Object pointer
    *
    * This method aggregates the two Objects together: after this
    * method returns, it becomes possible to call GetObject()
@@ -265,7 +265,7 @@
   /**
    * Copy an Object.
    *
-   * \param o the Object to copy.
+   * \param [in] o the Object to copy.
    *
    * Allow subclasses to implement a copy constructor.
    *
@@ -275,9 +275,9 @@
    * to understand that this copy constructor will _not_
    * copy aggregated Objects, _i.e_, if your Object instance
    * is already aggregated to another Object and if you invoke
-   * this copy constructor, the new )bject instance will be
+   * this copy constructor, the new Object instance will be
    * a pristine standalone Object instance not aggregated to
-   * any other )bject. It is thus _your_ responsability
+   * any other Object. It is thus _your_ responsibility
    * as a caller of this method to do what needs to be done
    * (if it is needed) to ensure that the Object stays in a
    * valid state.
@@ -289,7 +289,7 @@
   /**
    * Copy an Object.
    *
-   * \param object A pointer to the object to copy.
+   * \param [in] object A pointer to the object to copy.
    * \returns A copy of the input object.
    *
    * This method invoke the copy constructor of the input object
@@ -305,7 +305,7 @@
   /**
    * Set the TypeId and construct all Attributes of an Object.
    *
-   * \tparam T The type of the derived object we are constructing.
+   * \tparam T \explicit The type of the derived object we are constructing.
    * \param [in] object The uninitialized object pointer.
    * \return The derived object.
    */
@@ -338,7 +338,7 @@
   /**
    * Find an Object of TypeId tid in the aggregates of this Object.
    *
-   * \param tid The TypeId we're looking for
+   * \param [in] tid The TypeId we're looking for
    * \return The matching Object, if it is found
    */
   Ptr<Object> DoGetObject (TypeId tid) const;
@@ -363,7 +363,7 @@
   /**
    * Set the TypeId of this Object.
    
-   * \param tid The TypeId value to set.
+   * \param [in] tid The TypeId value to set.
    *
    * Invoked from ns3::CreateObject only.
    * Initialize the \c m_tid member variable to
@@ -373,7 +373,7 @@
   /**
    * Initialize all member variables registered as Attributes of this TypeId.
    *
-   * \param attributes The attribute values used to initialize
+   * \param [in] attributes The attribute values used to initialize
    *        the member variables of this Object's instance.
    *
    * Invoked from ns3::ObjectFactory::Create and ns3::CreateObject only.
@@ -385,8 +385,8 @@
   /**
    * Keep the list of aggregates in most-recently-used order
    *
-   * \param aggregates The list of aggregated Objects.
-   * \param i The most recently used entry in the list.
+   * \param [in,out] aggregates The list of aggregated Objects.
+   * \param [in] i The most recently used entry in the list.
    */
   void UpdateSortedArray (struct Aggregates *aggregates, uint32_t i) const;
   /**
@@ -517,7 +517,7 @@
 /**
  * Create an object by type, with varying number of constructor parameters.
  *
- * \tparam T The type of the derived object to construct.
+ * \tparam T \explicit The type of the derived object to construct.
  * \return The derived object.
  */
 template <typename T>
@@ -527,9 +527,9 @@
 }
 /**
  * \copybrief CreateObject()
- * \tparam T The type of the derived object to construct.
- * \tparam T1 The type of the constructor argument.
- * \param a1 The constructor argument
+ * \tparam T \explicit The type of the derived object to construct.
+ * \tparam T1 \deduced The type of the constructor argument.
+ * \param [in] a1 The constructor argument
  * \return The derived object.
  */
 template <typename T, typename T1>
@@ -540,11 +540,11 @@
 
 /**
  * \copybrief CreateObject()
- * \tparam T The type of the derived object to construct.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \param a1 The constructor first argument
- * \param a2 The constructor second argument
+ * \tparam T \explicit The type of the derived object to construct.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \param [in] a1 The constructor first argument
+ * \param [in] a2 The constructor second argument
  * \return The derived object.
  */
 template <typename T, typename T1, typename T2>
@@ -555,13 +555,13 @@
 
 /**
  * \copybrief CreateObject()
- * \tparam T The type of the derived object to construct.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \tparam T3 The type of the third constructor argument.
- * \param a1 The constructor first argument
- * \param a2 The constructor second argument
- * \param a3 The constructor third argument
+ * \tparam T \explicit The type of the derived object to construct.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \tparam T3 \deduced The type of the third constructor argument.
+ * \param [in] a1 The constructor first argument
+ * \param [in] a2 The constructor second argument
+ * \param [in] a3 The constructor third argument
  * \return The derived object.
  */
 template <typename T, typename T1, typename T2, typename T3>
@@ -572,15 +572,15 @@
 
 /**
  * \copybrief CreateObject()
- * \tparam T The type of the derived object to construct.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \tparam T3 The type of the third constructor argument.
- * \tparam T4 The type of the fourth constructor argument.
- * \param a1 The constructor first argument
- * \param a2 The constructor second argument
- * \param a3 The constructor third argument
- * \param a4 The constructor fourth argument
+ * \tparam T \explicit The type of the derived object to construct.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \tparam T3 \deduced The type of the third constructor argument.
+ * \tparam T4 \deduced The type of the fourth constructor argument.
+ * \param [in] a1 The constructor first argument
+ * \param [in] a2 The constructor second argument
+ * \param [in] a3 The constructor third argument
+ * \param [in] a4 The constructor fourth argument
  * \return The derived object.
  */
 template <typename T, typename T1, typename T2, typename T3, typename T4>
@@ -591,17 +591,17 @@
 
 /**
  * \copybrief CreateObject()
- * \tparam T The type of the derived object to construct.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \tparam T3 The type of the third constructor argument.
- * \tparam T4 The type of the fourth constructor argument.
- * \tparam T5 The type of the fifth constructor argument.
- * \param a1 The constructor first argument
- * \param a2 The constructor second argument
- * \param a3 The constructor third argument
- * \param a4 The constructor fourth argument
- * \param a5 The constructor fifth argument
+ * \tparam T \explicit The type of the derived object to construct.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \tparam T3 \deduced The type of the third constructor argument.
+ * \tparam T4 \deduced The type of the fourth constructor argument.
+ * \tparam T5 \deduced The type of the fifth constructor argument.
+ * \param [in] a1 The constructor first argument
+ * \param [in] a2 The constructor second argument
+ * \param [in] a3 The constructor third argument
+ * \param [in] a4 The constructor fourth argument
+ * \param [in] a5 The constructor fifth argument
  * \return The derived object.
  */
 template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5>
@@ -612,19 +612,19 @@
 
 /**
  * \copybrief CreateObject()
- * \tparam T The type of the derived object to construct.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \tparam T3 The type of the third constructor argument.
- * \tparam T4 The type of the fourth constructor argument.
- * \tparam T5 The type of the fifth constructor argument.
- * \tparam T6 The type of the sixth constructor argument.
- * \param a1 The constructor first argument
- * \param a2 The constructor second argument
- * \param a3 The constructor third argument
- * \param a4 The constructor fourth argument
- * \param a5 The constructor fifth argument
- * \param a6 The constructor sixth argument
+ * \tparam T \explicit The type of the derived object to construct.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \tparam T3 \deduced The type of the third constructor argument.
+ * \tparam T4 \deduced The type of the fourth constructor argument.
+ * \tparam T5 \deduced The type of the fifth constructor argument.
+ * \tparam T6 \deduced The type of the sixth constructor argument.
+ * \param [in] a1 The constructor first argument
+ * \param [in] a2 The constructor second argument
+ * \param [in] a3 The constructor third argument
+ * \param [in] a4 The constructor fourth argument
+ * \param [in] a5 The constructor fifth argument
+ * \param [in] a6 The constructor sixth argument
  * \return The derived object.
  */
 template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
@@ -635,21 +635,21 @@
 
 /**
  * \copybrief CreateObject()
- * \tparam T The type of the derived object to construct.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \tparam T3 The type of the third constructor argument.
- * \tparam T4 The type of the fourth constructor argument.
- * \tparam T5 The type of the fifth constructor argument.
- * \tparam T6 The type of the sixth constructor argument.
- * \tparam T7 The type of the seventh constructor argument.
- * \param a1 The constructor first argument
- * \param a2 The constructor second argument
- * \param a3 The constructor third argument
- * \param a4 The constructor fourth argument
- * \param a5 The constructor fifth argument
- * \param a6 The constructor sixth argument
- * \param a7 The constructor seventh argument
+ * \tparam T \explicit The type of the derived object to construct.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \tparam T3 \deduced The type of the third constructor argument.
+ * \tparam T4 \deduced The type of the fourth constructor argument.
+ * \tparam T5 \deduced The type of the fifth constructor argument.
+ * \tparam T6 \deduced The type of the sixth constructor argument.
+ * \tparam T7 \deduced The type of the seventh constructor argument.
+ * \param [in] a1 The constructor first argument
+ * \param [in] a2 The constructor second argument
+ * \param [in] a3 The constructor third argument
+ * \param [in] a4 The constructor fourth argument
+ * \param [in] a5 The constructor fifth argument
+ * \param [in] a6 The constructor sixth argument
+ * \param [in] a7 The constructor seventh argument
  * \return The derived object.
  */
 template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
diff -Naur ns-3.23/src/core/model/object-ptr-container.h ns-3.24/src/core/model/object-ptr-container.h
--- ns-3.23/src/core/model/object-ptr-container.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/object-ptr-container.h	2015-09-15 11:18:44.000000000 -0700
@@ -72,7 +72,7 @@
   /**
    * Get a specific Object.
    *
-   * \param i The index of the requested object.
+   * \param [in] i The index of the requested object.
    * \returns The requested object
    */
   Ptr<Object> Get (uint32_t i) const;
@@ -88,15 +88,15 @@
    *
    * Note this serializes the Ptr values, not the Objects themselves.
    *
-   * \param checker The checker to use (currently not used.)
+   * \param [in] checker The checker to use (currently not used.)
    * \returns The string form of the Objects.
    */
   virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
   /**
    * Deserialize from a string. (Not implemented; raises a fatal error.)
    *
-   * \param value The serialized string form.
-   * \param checker The checker to use.
+   * \param [in] value The serialized string form.
+   * \param [in] checker The checker to use.
    * \returns \c true.
    */
   virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
@@ -113,9 +113,9 @@
  *
  * The two versions of this function differ only in argument order.
  *
- * \tparam T The container class type.
- * \tparam U The type of object the get method returns.
- * \tparam INDEX The type of the index variable.
+ * \tparam T \deduced The container class type.
+ * \tparam U \deduced The type of object the get method returns.
+ * \tparam INDEX \deduced The type of the index variable.
  * \param [in] get The class method to get a specific instance
  *             from the container.
  * \param [in] getN The class method to return the number of objects
@@ -133,9 +133,9 @@
  *
  * The two versions of this function differ only in argument order.
  *
- * \tparam T The container class type.
- * \tparam U The type of object the get method returns.
- * \tparam INDEX The type of the index variable.
+ * \tparam T \deduced The container class type.
+ * \tparam U \deduced The type of object the get method returns.
+ * \tparam INDEX \deduced The type of the index variable.
  * \param [in] get The class method to get a specific instance
  *             from the container.
  * \param [in] getN The class method to return the number of objects
diff -Naur ns-3.23/src/core/model/pointer.h ns-3.24/src/core/model/pointer.h
--- ns-3.23/src/core/model/pointer.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/pointer.h	2015-09-15 11:18:44.000000000 -0700
@@ -61,13 +61,16 @@
   /**
    * Construct this PointerValue by referencing an explicit Object.
    *
-   * \tparam T (implicit) The type of the object.
+   * \tparam T \deduced The type of the object.
    * \param [in] object The object to begin with.
    */
   template <typename T>
   PointerValue (const Ptr<T> & object);
 
-  /** Cast to an Object of type \c T. */ 
+  /**
+   * Cast to an Object of type \c T.
+   * \tparam T \explicit The type to cast to.
+   */ 
   template <typename T>
   operator Ptr<T> () const;
 
@@ -75,6 +78,7 @@
   template <typename T>
   void Set (const Ptr<T> & value);
 
+  /** \tparam T \explicit The type to cast to. */
   template <typename T>
   Ptr<T> Get (void) const;
 
@@ -100,6 +104,12 @@
    */
   virtual TypeId GetPointeeTypeId (void) const = 0;
 };
+  
+/**
+ * Create a PointerChecker for a type.
+ * \tparam T \explicit The underlying type.
+ * \returns The PointerChecker.
+ */
 template <typename T>
 Ptr<AttributeChecker> MakePointerChecker (void);
 
diff -Naur ns-3.23/src/core/model/ptr.h ns-3.24/src/core/model/ptr.h
--- ns-3.23/src/core/model/ptr.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/ptr.h	2015-09-15 11:18:44.000000000 -0700
@@ -67,7 +67,7 @@
  * functions and their goal is just is save you a small
  * bit of typing.
  *
- * \tparam T The underlying type.
+ * \tparam T \explicit The underlying type.
  */
 template <typename T>
 class Ptr 
@@ -94,8 +94,8 @@
    * to returning to the caller so the caller is
    * responsible for calling Unref himself.
    *
-   * \param p smart pointer
-   * \return the pointer managed by this smart pointer.
+   * \param [in] p Smart pointer
+   * \return The pointer managed by this smart pointer.
    */
   template <typename U>
   friend U *GetPointer (const Ptr<U> &p);
@@ -106,8 +106,8 @@
    * to returning to the caller so the caller is not
    * responsible for calling Unref himself.
    *
-   * \param p smart pointer
-   * \return the pointer managed by this smart pointer.
+   * \param [in] p Smart pointer
+   * \return The pointer managed by this smart pointer.
    */
   template <typename U>
   friend U *PeekPointer (const Ptr<U> &p);
@@ -126,15 +126,15 @@
    * same, so that object is deleted if no more references to it
    * remain.
    *
-   * \param ptr raw pointer to manage
+   * \param [in] ptr Raw pointer to manage
    */
   Ptr (T *ptr);
   /**
    * Create a smart pointer which points to the object pointed to by
    * the input raw pointer ptr.
    *
-   * \param ptr raw pointer to manage
-   * \param ref if set to true, this method calls Ref, otherwise,
+   * \param [in] ptr Raw pointer to manage
+   * \param [in] ref if set to true, this method calls Ref, otherwise,
    *        it does not call Ref.
    */
   Ptr (T *ptr, bool ref);
@@ -147,7 +147,7 @@
   /**
    * Copy, removing \c const qualifier.
    *
-   * \tparam U The underlying type of the \c const object.
+   * \tparam U \deduced The underlying type of the \c const object.
    * \param [in] o The Ptr to copy.
    */
   template <typename U>
@@ -189,7 +189,7 @@
    *   Ptr<..> p = ...;
    *   if (!p) ...
    * \endcode
-   * \returns true if the underlying pointer is NULL.
+   * \returns \c true if the underlying pointer is NULL.
    */
   bool operator! ();
   /**
@@ -216,16 +216,16 @@
  */
 /** @{ */
 /**
- * \tparam T  The type of class object to create.
+ * \tparam T \explicit The type of class object to create.
  * \return A Ptr to the newly created \c T.
  */
 template <typename T>
 Ptr<T> Create (void);
 
 /**
- * \tparam T  The type of class object to create.
- * \tparam T1 The type of the first constructor argument.
- * \param  a1 The first constructor argument.
+ * \tparam T  \explicit The type of class object to create.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \param  [in] a1 The first constructor argument.
  * \return A Ptr to the newly created \c T.
  */
 template <typename T,
@@ -233,11 +233,11 @@
 Ptr<T> Create (T1 a1);
 
 /**
- * \tparam T  The type of class object to create.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \param  a1 The first constructor argument.
- * \param  a2 The second constructor argument.
+ * \tparam T  \explicit The type of class object to create.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \param  [in] a1 The first constructor argument.
+ * \param  [in] a2 The second constructor argument.
  * \return A Ptr to the newly created \c T.
  */
 template <typename T,
@@ -245,13 +245,13 @@
 Ptr<T> Create (T1 a1, T2 a2);
 
 /**
- * \tparam T  The type of class object to create.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \tparam T3 The type of the third constructor argument.
- * \param  a1 The first constructor argument.
- * \param  a2 The second constructor argument.
- * \param  a3 The third constructor argument.
+ * \tparam T  \explicit The type of class object to create.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \tparam T3 \deduced The type of the third constructor argument.
+ * \param  [in] a1 The first constructor argument.
+ * \param  [in] a2 The second constructor argument.
+ * \param  [in] a3 The third constructor argument.
  * \return A Ptr to the newly created \c T.
  */
 template <typename T,
@@ -260,15 +260,15 @@
 Ptr<T> Create (T1 a1, T2 a2, T3 a3);
 
 /**
- * \tparam T  The type of class object to create.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \tparam T3 The type of the third constructor argument.
- * \tparam T4 The type of the fourth constructor argument.
- * \param  a1 The first constructor argument.
- * \param  a2 The second constructor argument.
- * \param  a3 The third constructor argument.
- * \param  a4 The fourth constructor argument.
+ * \tparam T  \explicit The type of class object to create.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \tparam T3 \deduced The type of the third constructor argument.
+ * \tparam T4 \deduced The type of the fourth constructor argument.
+ * \param  [in] a1 The first constructor argument.
+ * \param  [in] a2 The second constructor argument.
+ * \param  [in] a3 The third constructor argument.
+ * \param  [in] a4 The fourth constructor argument.
  * \return A Ptr to the newly created \c T.
  */
 template <typename T,
@@ -277,17 +277,17 @@
 Ptr<T> Create (T1 a1, T2 a2, T3 a3, T4 a4);
 
 /**
- * \tparam T  The type of class object to create.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \tparam T3 The type of the third constructor argument.
- * \tparam T4 The type of the fourth constructor argument.
- * \tparam T5 The type of the fifth constructor argument.
- * \param  a1 The first constructor argument.
- * \param  a2 The second constructor argument.
- * \param  a3 The third constructor argument.
- * \param  a4 The fourth constructor argument.
- * \param  a5 The fifth constructor argument.
+ * \tparam T  \explicit The type of class object to create.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \tparam T3 \deduced The type of the third constructor argument.
+ * \tparam T4 \deduced The type of the fourth constructor argument.
+ * \tparam T5 \deduced The type of the fifth constructor argument.
+ * \param  [in] a1 The first constructor argument.
+ * \param  [in] a2 The second constructor argument.
+ * \param  [in] a3 The third constructor argument.
+ * \param  [in] a4 The fourth constructor argument.
+ * \param  [in] a5 The fifth constructor argument.
  * \return A Ptr to the newly created \c T.
  */
 template <typename T,
@@ -297,19 +297,19 @@
 Ptr<T> Create (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
 
 /**
- * \tparam T  The type of class object to create.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \tparam T3 The type of the third constructor argument.
- * \tparam T4 The type of the fourth constructor argument.
- * \tparam T5 The type of the fifth constructor argument.
- * \tparam T6 The type of the sixth constructor argument.
- * \param  a1 The first constructor argument.
- * \param  a2 The second constructor argument.
- * \param  a3 The third constructor argument.
- * \param  a4 The fourth constructor argument.
- * \param  a5 The fifth constructor argument.
- * \param  a6 The sixth constructor argument.
+ * \tparam T  \explicit The type of class object to create.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \tparam T3 \deduced The type of the third constructor argument.
+ * \tparam T4 \deduced The type of the fourth constructor argument.
+ * \tparam T5 \deduced The type of the fifth constructor argument.
+ * \tparam T6 \deduced The type of the sixth constructor argument.
+ * \param  [in] a1 The first constructor argument.
+ * \param  [in] a2 The second constructor argument.
+ * \param  [in] a3 The third constructor argument.
+ * \param  [in] a4 The fourth constructor argument.
+ * \param  [in] a5 The fifth constructor argument.
+ * \param  [in] a6 The sixth constructor argument.
  * \return A Ptr to the newly created \c T.
  */
 template <typename T,
@@ -319,21 +319,21 @@
 Ptr<T> Create (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
 
 /**
- * \tparam T  The type of class object to create.
- * \tparam T1 The type of the first constructor argument.
- * \tparam T2 The type of the second constructor argument.
- * \tparam T3 The type of the third constructor argument.
- * \tparam T4 The type of the fourth constructor argument.
- * \tparam T5 The type of the fifth constructor argument.
- * \tparam T6 The type of the sixth constructor argument.
- * \tparam T7 The type of the seventh constructor argument.
- * \param  a1 The first constructor argument.
- * \param  a2 The second constructor argument.
- * \param  a3 The third constructor argument.
- * \param  a4 The fourth constructor argument.
- * \param  a5 The fifth constructor argument.
- * \param  a6 The sixth constructor argument.
- * \param  a7 The seventh constructor argument.
+ * \tparam T  \explicit The type of class object to create.
+ * \tparam T1 \deduced The type of the first constructor argument.
+ * \tparam T2 \deduced The type of the second constructor argument.
+ * \tparam T3 \deduced The type of the third constructor argument.
+ * \tparam T4 \deduced The type of the fourth constructor argument.
+ * \tparam T5 \deduced The type of the fifth constructor argument.
+ * \tparam T6 \deduced The type of the sixth constructor argument.
+ * \tparam T7 \deduced The type of the seventh constructor argument.
+ * \param  [in] a1 The first constructor argument.
+ * \param  [in] a2 The second constructor argument.
+ * \param  [in] a3 The third constructor argument.
+ * \param  [in] a4 The fourth constructor argument.
+ * \param  [in] a5 The fifth constructor argument.
+ * \param  [in] a6 The sixth constructor argument.
+ * \param  [in] a7 The seventh constructor argument.
  * \return A Ptr to the newly created \c T.
  */
 template <typename T,
@@ -347,7 +347,7 @@
 /**
  * \ingroup ptr
  * Output streamer.
- * \param [in] os The output stream.
+ * \param [in,out] os The output stream.
  * \param [in] p The Ptr.
  * \returns The stream.
  */
@@ -368,11 +368,11 @@
  * Note that either \c p or \c q could also be ordinary pointers
  * to the underlying object.
  *
- * \tparam T1 Type of the object on the lhs.
- * \tparam T2 Type of the object on the rhs.
+ * \tparam T1 \deduced Type of the object on the lhs.
+ * \tparam T2 \deduced Type of the object on the rhs.
  * \param [in] lhs The left operand.
  * \param [in] rhs The right operand.
- * \return true if the operands point to the same underlying object.
+ * \return \c true if the operands point to the same underlying object.
  */
 /** @{ */
 template <typename T1, typename T2>
@@ -399,11 +399,11 @@
  * Note that either \c p or \c q could also be ordinary pointers
  * to the underlying object.
  *
- * \tparam T1 Type of the object on the lhs.
- * \tparam T2 Type of the object on the rhs.
+ * \tparam T1 \deduced Type of the object on the lhs.
+ * \tparam T2 \deduced Type of the object on the rhs.
  * \param [in] lhs The left operand.
  * \param [in] rhs The right operand.
- * \return true if the operands point to the same underlying object.
+ * \return \c true if the operands point to the same underlying object.
  */
 /** @{ */
 template <typename T1, typename T2>
@@ -440,9 +440,9 @@
  * Return a copy of \c p with its stored pointer const casted from
  * \c T2 to \c T1.
  *
- * \tparam T1 The type to return in a Ptr.
- * \tparam T2 The type of the underlying object.
- * \param p The original \c const Ptr.
+ * \tparam T1 \deduced The type to return in a Ptr.
+ * \tparam T2 \deduced The type of the underlying object.
+ * \param [in] p The original \c const Ptr.
  * \return A non-const Ptr.
  */
 template <typename T1, typename T2>
@@ -460,14 +460,14 @@
  *
  * This is the specialization for Ptr types.
  *
- * \tparam T The base object type.
+ * \tparam T \deduced The base object type.
  */
 template <typename T>
 struct CallbackTraits<Ptr<T> >
 {
   /**
-   * \param p object pointer
-   * \return a reference to the object pointed to by p
+   * \param [in] p Object pointer
+   * \return A reference to the object pointed to by p
    */
   static T & GetReference (Ptr<T> const p)
   {
@@ -485,14 +485,14 @@
  *
  * This is the specialization for Ptr types.
  *
- * \tparam T The class type.
+ * \tparam T \explicit The class type.
  */
 template <typename T>
 struct EventMemberImplObjTraits<Ptr<T> >
 {
   /**
-   * \param p object pointer
-   * \return a reference to the object pointed to by p
+   * \param [in] p Object pointer
+   * \return A reference to the object pointed to by p
    */
   static T &GetReference (Ptr<T> p) {
     return *PeekPointer (p);
@@ -647,9 +647,9 @@
 /**
  * Cast a Ptr.
  *
- * \tparam T1 The desired type to cast to.
- * \tparam T2 The type of the original Ptr.
- * \param p The original Ptr.
+ * \tparam T1 \deduced The desired type to cast to.
+ * \tparam T2 \deduced The type of the original Ptr.
+ * \param [in] p The original Ptr.
  * \return The result of the cast.
  */
 /** @{ */
@@ -678,7 +678,7 @@
 /**
  * Return a deep copy of a Ptr.
  *
- * \param object The object Ptr to copy.
+ * \param [in] object The object Ptr to copy.
  * \returns The copy.
  */
 /** @{ */
diff -Naur ns-3.23/src/core/model/random-variable-stream.h ns-3.24/src/core/model/random-variable-stream.h
--- ns-3.23/src/core/model/random-variable-stream.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/random-variable-stream.h	2015-09-15 11:18:44.000000000 -0700
@@ -31,6 +31,12 @@
 #include "attribute-helper.h"
 #include <stdint.h>
 
+/**
+ * \file
+ * \ingroup randomvariable
+ * Declaration of ns3::RandomVariableStream and derivatives.
+ */
+
 namespace ns3 {
 
 /**
@@ -67,13 +73,13 @@
 
 /**
  * \ingroup randomvariable
- * \brief The Random Number Generator (RNG) that allows stream numbers to be set deterministically.
+ * \brief The basic uniform Random Number Generator (RNG).
  *
- * Note: The underlying random number generation method used
- * by NS-3 is the RngStream code by Pierre L'Ecuyer at
+ * \note The underlying random number generation method used
+ * by ns-3 is the RngStream code by Pierre L'Ecuyer at
  * the University of Montreal.
  *
- * NS-3 has a rich set of random number generators that allow stream
+ * ns-3 has a rich set of random number generators that allow stream
  * numbers to be set deterministically if desired.  Class
  * RandomVariableStream defines the base class functionalty required
  * for all such random number generators.
@@ -83,6 +89,10 @@
  * \ref GlobalValueRngSeed "RngSeed" and \ref GlobalValueRngRun
  * "RngRun".  Also by default, the stream number value for this RNG
  * stream is automatically allocated.
+ *
+ * Instances can be configured to return "antithetic" values.
+ * See the documentation for the specific distributions to see
+ * how this modifies the returned values.
  */
 class RandomVariableStream : public Object
 {
@@ -92,80 +102,106 @@
    * \return The object TypeId.
    */
   static TypeId GetTypeId (void);
+  /**
+   * \brief Default constructor.
+   */
   RandomVariableStream ();
+  /**
+   * \brief Destructor.
+   */
   virtual ~RandomVariableStream();
 
   /**
    * \brief Specifies the stream number for this RNG stream.
-   * \param stream The stream number for this RNG stream. -1 means "allocate a stream number automatically".
- */
+   * \param [in] stream The stream number for this RNG stream.
+   * -1 means "allocate a stream number automatically".
+   */
   void SetStream (int64_t stream);
 
   /**
    * \brief Returns the stream number for this RNG stream.
-   * \return The stream number for this RNG stream. -1 means "allocate a stream number automatically".
+   * \return The stream number for this RNG stream.
+   * -1 means this stream was allocated automatically.
    */
   int64_t GetStream(void) const;
 
   /**
-   * \brief Specifies whether antithetic values should be generated.
-   * \param isAntithetic Set equal to true if antithetic values should
-   * be generated by this RNG stream.
+   * \brief Specify whether antithetic values should be generated.
+   * \param [in] isAntithetic If \c true antithetic value will be generated.
    */
   void SetAntithetic(bool isAntithetic);
 
   /**
-   * \brief Returns true if antithetic values should be generated.
-   * \return A bool value that indicates if antithetic values should
-   * be generated by this RNG stream.
+   * \brief Check if antithetic values will be generated.
+   * \return \c true if antithetic values will be generated.
    */
   bool IsAntithetic(void) const;
 
   /**
-   * \brief Returns a random double from the underlying distribution
+   * \brief Get the next random value as a double drawn from the distribution.
    * \return A floating point random value.
    */
   virtual double GetValue (void) = 0;
 
   /**
-   * \brief Returns a random integer integer from the underlying distribution
-   * \return  Integer cast of RandomVariableStream::GetValue
+   * \brief Get the next random value as an integer drawn from the distribution.
+   * \return  An integer random value.
    */
   virtual uint32_t GetInteger (void) = 0;
 
 protected:
   /**
-   * \brief Returns a pointer to the underlying RNG stream.
+   * \brief Get the pointer to the underlying RNG stream.
    */
   RngStream *Peek(void) const;
 
 private:
-  // you can't copy these objects.
-  // Theoretically, it is possible to give them good copy semantics
-  // but not enough time to iron out the details.
+  /**
+   * Copy constructor.  These objects are not copyable.
+   *
+   * \param [in] o The RandomVariableStream to copy in construction.
+   * \internal
+   * Theoretically, it is possible to give them good copy semantics
+   * but not enough time to iron out the details.
+   */
   RandomVariableStream (const RandomVariableStream &o);
+  /**
+   * Assignment operator.  These objects can't be copied by assignement.
+   *
+   * \param [in] o The RandomVariableStream to copy.
+   * \return lvalue RandomVariableStream.
+   *
+   * \internal
+   * Theoretically, it is possible to give them good copy semantics
+   * but not enough time to iron out the details.
+   */
   RandomVariableStream &operator = (const RandomVariableStream &o);
 
-  /// Pointer to the underlying RNG stream.
+  /** Pointer to the underlying RNG stream. */
   RngStream *m_rng;
 
-  /// Indicates if antithetic values should be generated by this RNG stream.
+  /** Indicates if antithetic values should be generated by this RNG stream. */
   bool m_isAntithetic;
 
-  /// The stream number for this RNG stream.
+  /** The stream number for this RNG stream. */
   int64_t m_stream;
-};
 
+};  // class RandomVariableStream
+
+  
 /**
  * \ingroup randomvariable
- * \brief The uniform distribution Random Number Generator (RNG) that allows stream numbers to be set deterministically.
+ * \brief The uniform distribution Random Number Generator (RNG).
  *
  * This class supports the creation of objects that return random numbers
  * from a fixed uniform distribution.  It also supports the generation of
  * single random numbers from various uniform distributions.
  *
- * The low end of the range is always included and the high end
- * of the range is always excluded.
+ * The output range is \f$[min, max)\f$ for floating point values,
+ * (\c max <i>excluded</i>), and \f$[min, max]\f$ (\c max <i>included</i>)
+ * for integral values.
+ *
+ * \par Example
  *
  * Here is an example of how to use this class:
  * \code
@@ -183,10 +219,24 @@
  *   //
  *   double value = x->GetValue ();
  * \endcode
+ *
+ * \par Antithetic Values.
+ *
+ * Normally this RNG returns values \f$x\f$ in the interval \f$[min,max)\f$.
+ * If an instance of this RNG is configured to return antithetic values,
+ * the actual value returned is calculated as follows:
+ *
+ *   - Compute the initial random value \f$x\f$ as normal.
+ *   - Compute the distance from the maximum, \f$y = max - x\f$
+ *   - Return \f$x' = min + y = min + (max - x)\f$:
  */
 class UniformRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -195,118 +245,82 @@
   UniformRandomVariable ();
 
   /**
-   * \brief Returns the lower bound on values that can be returned by this RNG stream.
-   * \return The lower bound on values that can be returned by this RNG stream.
+   * \brief Get the lower bound on randoms returned by GetValue(void).
+   * \return The lower bound on values from GetValue(void).
    */
   double GetMin (void) const;
 
   /**
-   * \brief Returns the upper bound on values that can be returned by this RNG stream.
-   * \return The upper bound on values that can be returned by this RNG stream.
+   * \brief Get the upper bound on values returned by GetValue(void).
+   * \return The upper bound on values from GetValue(void).
    */
   double GetMax (void) const;
 
   /**
-   * \brief Returns a random double from the uniform distribution with the specified range.
-   * \param min Low end of the range.
-   * \param max High end of the range.
-   * \return A floating point random value.
-   *
-   * Note that antithetic values are being generated if
-   * m_isAntithetic is equal to true.  If \f$x\f$ is a value that
-   * would be returned normally, then \f$(max - x\f$) is the distance
-   * that \f$x\f$ would be from \f$max\f$.  The value returned in the
-   * antithetic case, \f$x'\f$, is calculated as
+   * \brief Get the next random value, as a double in the specified range
+   * \f$[min, max)\f$.
    *
-   *    \f[
-   *    x'  =  min + (max - x)  ,
-   *    \f]
+   * \note The upper limit is excluded from the output range.
    *
-   * which is the lower bound plus the distance \f$x\f$ is from the
-   * upper bound.
+   * \param [in] min Low end of the range (included).
+   * \param [in] max High end of the range (excluded).
+   * \return A floating point random value.
    */
   double GetValue (double min, double max);
 
   /**
-   * \brief Returns a random unsigned integer from a uniform distribution over the interval [min,max] including both ends.
-   * \param min Low end of the range.
-   * \param max High end of the range.
-   * \return A random unsigned integer value.
-   *
-   * Note that antithetic values are being generated if
-   * m_isAntithetic is equal to true.  If \f$x\f$ is a value that
-   * would be returned normally, then \f$(max - x\f$) is the distance
-   * that \f$x\f$ would be from \f$max\f$.  The value returned in the
-   * antithetic case, \f$x'\f$, is calculated as
+   * \brief Get the next random value, as an unsigned integer in the
+   * specified range \f$[min, max]/f$.
    *
-   *    \f[
-   *    x'  =  min + (max - x)  ,
-   *    \f]
+   * \note The upper limit is included in the output range.
    *
-   * which is the lower bound plus the distance \f$x\f$ is from the
-   * upper bound.
+   * \param [in] min Low end of the range.
+   * \param [in] max High end of the range.
+   * \return A random unsigned integer value.
    */
   uint32_t GetInteger (uint32_t min, uint32_t max);
 
+  // Inherited from RandomVariableStream
   /**
-   * \brief Returns a random double from the uniform distribution with the range [min,max), where min and max are the current lower and upper bounds.
+   * \brief Get the next random value as a double drawn from the distribution.
    * \return A floating point random value.
-   *
-   * Note that antithetic values are being generated if
-   * m_isAntithetic is equal to true.  If \f$x\f$ is a value that
-   * would be returned normally, then \f$(max - x\f$) is the distance
-   * that \f$x\f$ would be from \f$max\f$.  The value returned in the
-   * antithetic case, \f$x'\f$, is calculated as
-   *
-   *    \f[
-   *        x'  =  min + (max - x)  ,
-   *    \f]
-   *
-   * which is the lower bound plus the distance \f$x\f$ is from the
-   * upper bound.
-   *
-   * Note that we have to re-implement this method here because the method is
-   * overloaded above for the two-argument variant and the c++ name resolution
-   * rules don't work well with overloads split between parent and child
-   * classes.
-   */
+   * \note The upper limit is excluded from the output range.
+  */
   virtual double GetValue (void);
-
   /**
-   * \brief Returns a random unsigned integer from a uniform distribution over the interval [min,max] including both ends, where min and max are the current lower and upper bounds.
-   * \return A random unsigned integer value.
-   *
-   * Note that antithetic values are being generated if
-   * m_isAntithetic is equal to true.  If \f$x\f$ is a value that
-   * would be returned normally, then \f$(max - x\f$) is the distance
-   * that \f$x\f$ would be from \f$max\f$.  The value returned in the
-   * antithetic case, \f$x'\f$, is calculated as
-   *
-   *    \f[
-   *        x'  =  min + (max - x)  ,
-   *    \f]
-   *
-   * which is the lower bound plus the distance \f$x\f$ is from the
-   * upper bound.
+   * \brief Get the next random value as an integer drawn from the distribution.
+   * \return  An integer random value.
+   * \note The upper limit is included in the output range.
    */
   virtual uint32_t GetInteger (void);
+  
 private:
-  /// The lower bound on values that can be returned by this RNG stream.
+  /** The lower bound on values that can be returned by this RNG stream. */
   double m_min;
 
-  /// The upper bound on values that can be returned by this RNG stream.
+  /** The upper bound on values that can be returned by this RNG stream. */
   double m_max;
-};
 
+};  // class UniformRandomVariable
+
+  
 /**
  * \ingroup randomvariable
  * \brief The Random Number Generator (RNG) that returns a constant.
  *
- * Class ConstantRandomVariable returns the same value for every sample.
+ * This RNG returns the same value for every sample.
+ *
+ * \par Antithetic Values.
+ *
+ * This RNG ignores the antithetic setting.
  */
 class ConstantRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -315,147 +329,186 @@
   ConstantRandomVariable ();
 
   /**
-   * \brief Returns the constant value returned by this RNG stream.
-   * \return The constant value returned by this RNG stream.
+   * \brief Get the constant value returned by this RNG stream.
+   * \return The constant value.
    */
   double GetConstant (void) const;
 
   /**
-   * \brief Returns the value passed in.
-   * \return The floating point value passed in.
+   * \brief Get the next random value, as a double equal to the argument.
+   * \param [in] constant The value to return.
+   * \return The floating point argument.
    */
   double GetValue (double constant);
   /**
-   * \brief Returns the value passed in.
-   * \return The integer value passed in.
+   * \brief Get the next random value, as an integer equal to the argument.
+   * \param [in] constant The value to return.
+   * \return The integer argument.
    */
   uint32_t GetInteger (uint32_t constant);
 
-  /**
-   * \brief Returns the constant value returned by this RNG stream.
-   * \return The constant value returned by this RNG stream.
-   */
+  // Inherited from RandomVariableStream
+  /* \note This RNG always returns the same value. */
   virtual double GetValue (void);
-
-  /**
-   * \brief Returns an integer cast of the constant value returned by this RNG stream.
-   * \return Integer cast of the constant value returned by this RNG stream.
-   */
+  /* \note This RNG always returns the same value. */
   virtual uint32_t GetInteger (void);
 
 private:
-  /// The constant value returned by this RNG stream.
+  /** The constant value returned by this RNG stream. */
   double m_constant;
-};
 
+};  // class ConstantRandomVariable
+
+  
 /**
  * \ingroup randomvariable
- * \brief The Random Number Generator (RNG) that returns a sequential
- * list of values
+ * \brief The Random Number Generator (RNG) that returns a pattern of
+ * sequential values.
+ *
+ * This RNG has four configuration attributes:
+ *
+ *  - An increment, \c Increment.
+ *  - A consecutive repeat numer, \c Consecutive.
+ *  - The minimum value, \c Min.
+ *  - The maximum value, \c Max.
  *
- * Class SequentialRandomVariable defines a random number generator
- * that returns a sequence of values.  The sequence monotonically
- * increases for a period, then wraps around to the low value and
- * begins monotonically increasing again.
+ * The RNG starts at the \c Min value.  Each return value is
+ * repeated \c Consecutive times, before advancing by the \c Increment.
+ * When the \c Increment would cause the value to equal or exceed
+ * \c Max it is reset to \c Min first.
+ *
+ * For example, if an instance is configured with:
+ *
+ *   Attribute   | Value
+ *   :---------- | -----:
+ *   Min         |    2
+ *   Max         |   13
+ *   Increment   |    4
+ *   Consecutive |    3
+ *
+ * The sequence will repeat this pattern:  2 2 2 6 6 6 10 10 10.
+ *
+ * Notice that \c Max will be a strict upper bound on the values:
+ * all values in the sequence will be less than \c Max.
+ *
+ * \par Antithetic Values.
+ *
+ * This RNG ignores the antithetic setting.
  */
 class SequentialRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
-   * \brief Creates a sequential RNG with the default values for the sequence parameters.
+   * \brief Creates a sequential RNG with the default values
+   * for the sequence parameters.
    */
   SequentialRandomVariable ();
 
   /**
-   * \brief Returns the first value of the sequence.
+   * \brief Get the first value of the sequence.
    * \return The first value of the sequence.
    */
   double GetMin (void) const;
 
   /**
-   * \brief Returns one more than the last value of the sequence.
-   * \return One more than the last value of the sequence.
+   * \brief Get the limit of the sequence, which is (at least)
+   * one more than the last value of the sequence.
+   * \return The limit of the sequence.
    */
   double GetMax (void) const;
 
   /**
-   * \brief Returns the random variable increment for the sequence.
-   * \return The random variable increment for the sequence.
+   * \brief Get the increment for the sequence.
+   * \return The increment between distinct values for the sequence.
    */
   Ptr<RandomVariableStream> GetIncrement (void) const;
 
   /**
-   * \brief Returns the number of times each member of the sequence is repeated.
-   * \return The number of times each member of the sequence is repeated.
+   * \brief Get the number of times each distinct value of the sequence
+   * is repeated before incrementing to the next value.
+   * \return The number of times each value is repeated.
    */
   uint32_t GetConsecutive (void) const;
 
-  /**
-   * \brief Returns the next value in the sequence returned by this RNG stream.
-   * \return The next value in the sequence returned by this RNG stream.
-   *
-   * The following four parameters define the sequence.  For example,
-   *
-   *   - m_min         = 0   (First value of the sequence)
-   *   - m_max         = 5   (One more than the last value of the sequence)
-   *   - m_increment   = 1   (Random variable increment between sequence values)
-   *   - m_consecutive = 2   (Number of times each member of the sequence is repeated)
-   *
-   * creates a RNG that has the sequence 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 0, 0 ...
-   */
+  // Inherited from RandomVariableStream
   virtual double GetValue (void);
-
-  /**
-   * \brief Returns an integer cast of the next value in the sequence returned by this RNG stream.
-   * \return Integer cast of the next value in the sequence returned by this RNG stream.
-   */
   virtual uint32_t GetInteger (void);
 
 private:
-  /// The first value of the sequence.
+  /** The first value of the sequence. */
   double m_min;
 
-  /// One more than the last value of the sequence.
+  /** Strict upper bound on the sequence. */
   double m_max;
 
-  /// The sequence random variable increment.
+  /** Increment between distinct values. */
   Ptr<RandomVariableStream> m_increment;
 
-  /// The number of times each member of the sequence is repeated.
+  /** The number of times each distinct value is repeated. */
   uint32_t m_consecutive;
 
-  /// The current sequence value.
+  /** The current sequence value. */
   double m_current;
 
-  /// The number of times the sequence has been repeated.
+  /** The number of times the current distinct value has been repeated. */
   uint32_t m_currentConsecutive;
 
-  /// Indicates if the current sequence value has been set.
+  /** Indicates if the current sequence value has been properly initialized. */
   bool m_isCurrentSet;
 
-};
+};  // class SequentialRandomVariable
 
+  
 /**
  * \ingroup randomvariable
- * \brief The exponential distribution Random Number Generator (RNG) that allows stream numbers to be set deterministically.
+ * \brief The exponential distribution Random Number Generator (RNG).
  *
  * This class supports the creation of objects that return random numbers
  * from a fixed exponential distribution.  It also supports the generation of
  * single random numbers from various exponential distributions.
  *
  * The probability density function of an exponential variable
- * is defined over the interval [0, \f$+\infty\f$) as:
- * \f$ \alpha  e^{-\alpha x} \f$
- * where \f$ \alpha = \frac{1}{mean} \f$
+ * is defined as:
+ *   \f[
+ *       P(x) dx = \alpha  e^{-\alpha x} dx, \quad x \in [0, +\infty)
+ *   \f]
+ * over the interval \f$[0, +\infty)\f$, where \f$ \alpha = \frac{1}{Mean} \f$
+ * and \c Mean is a configurable attribute.
+ *
+ * The normal RNG value \f$x\f$ is calculated by
+ *
+ *   \f[
+ *       x = - 1/\alpha \log(u)
+ *   \f]
+ *
+ * where \f$u\f$ is a uniform random variable on \f$[0,1)\f$.
+ *
+ * \par Bounded Distribution
  *
  * Since exponential distributions can theoretically return unbounded
  * values, it is sometimes useful to specify a fixed upper limit.  The
- * bounded version is defined over the interval [0,b] as: \f$ \alpha
- * e^{-\alpha x} \quad x \in [0,b] \f$.  Note that in this case the
- * true mean of the distribution is slightly smaller than the mean
- * value specified: \f$ 1/\alpha - b/(e^{\alpha \, b}-1) \f$.
+ * bounded version is defined over the interval \f$[0,b]\f$ as:
+ *
+ *   \f[
+ *       P(x; b) dx = \alpha e^{-\alpha x} dx \quad x \in [0,b]
+ *   \f]
+ *
+ * where the \c Bound \f$b\f$ is a configurable attribute.
+ *
+ * Note that in this case the true mean of the distribution is smaller
+ * than the nominal mean value:
+ *
+ *   \f[
+ *       <X: P(x; b)> = 1/\alpha - b/(e^{\alpha \, b} -1)
+ *   \f]
+ *
+ * \par Example
  *
  * Here is an example of how to use this class:
  * \code
@@ -470,10 +523,24 @@
  *   // exponentially distributed random variable is equal to mean.
  *   double value = x->GetValue ();
  * \endcode
+ *
+ * \par Antithetic Values.
+ *
+ * The antithetic value is calculated from
+ *
+ *   \f[
+ *       x' = - mean * \log(1 - u), 
+ *   \f]
+ *
+ * where again \f$u\f$ is a uniform random variable on \f$[0,1)\f$.
  */
 class ExponentialRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -483,133 +550,55 @@
   ExponentialRandomVariable ();
 
   /**
-   * \brief Returns the mean value of the random variables returned by this RNG stream.
-   * \return The mean value of the random variables returned by this RNG stream.
+   * \brief Get the configured mean value of this RNG.
+   *
+   * \note This will not be the actual mean if the distribution is
+   * truncated by a bound.
+   * \return The configured mean value.
    */
   double GetMean (void) const;
 
   /**
-   * \brief Returns the upper bound on values that can be returned by this RNG stream.
-   * \return The upper bound on values that can be returned by this RNG stream.
+   * \brief Get the configured upper bound of this RNG.
+   * \return The upper bound.
    */
   double GetBound (void) const;
 
   /**
-   * \brief Returns a random double from an exponential distribution with the specified mean and upper bound.
-   * \param mean Mean value of the random variables.
-   * \param bound Upper bound on values returned.
+   * \brief Get the next random value, as a double from
+   * the exponential distribution with the specified mean and upper bound.
+   * \param [in] mean Mean value of the unbounded exponential distribution.
+   * \param [in] bound Upper bound on values returned.
    * \return A floating point random value.
-   *
-   * Note that antithetic values are being generated if
-   * m_isAntithetic is equal to true.  If \f$u\f$ is a uniform variable
-   * over [0,1] and
-   *
-   *    \f[
-   *         x = - mean * \log(u) 
-   *    \f]
-   *
-   * is a value that would be returned normally, then \f$(1 - u\f$) is
-   * the distance that \f$u\f$ would be from \f$1\f$.  The value
-   * returned in the antithetic case, \f$x'\f$, is calculated as
-   *
-   *    \f[
-   *         x' = - mean * \log(1 - u), 
-   *    \f]
-   *
-   * which now involves the log of the distance \f$u\f$ is from the 1.
    */
   double GetValue (double mean, double bound);
 
   /**
-   * \brief Returns a random unsigned integer from an exponential distribution with the specified mean and upper bound.
-   * \param mean Mean value of the random variables.
-   * \param bound Upper bound on values returned.
+   * \brief Get the next random value, as an unsigned integer from
+   * the exponential distribution with the specified mean and upper bound.
+   * \param [in] mean Mean value of the unbounded exponential distributuion.
+   * \param [in] bound Upper bound on values returned.
    * \return A random unsigned integer value.
-   *
-   * Note that antithetic values are being generated if
-   * m_isAntithetic is equal to true.  If \f$u\f$ is a uniform variable
-   * over [0,1] and
-   *
-   *    \f[
-   *         x = - mean * \log(u) 
-   *    \f]
-   *
-   * is a value that would be returned normally, then \f$(1 - u\f$) is
-   * the distance that \f$u\f$ would be from \f$1\f$.  The value
-   * returned in the antithetic case, \f$x'\f$, is calculated as
-   *
-   *    \f[
-   *         x' = - mean * \log(1 - u), 
-   *    \f]
-   *
-   * which now involves the log of the distance \f$u\f$ is from the 1.
    */
   uint32_t GetInteger (uint32_t mean, uint32_t bound);
 
-  /**
-   * \brief Returns a random double from an exponential distribution with the current mean and upper bound.
-   * \return A floating point random value.
-   *
-   * Note that antithetic values are being generated if
-   * m_isAntithetic is equal to true.  If \f$u\f$ is a uniform variable
-   * over [0,1] and
-   *
-   *    \f[
-   *         x = - mean * \log(u) 
-   *    \f]
-   *
-   * is a value that would be returned normally, then \f$(1 - u\f$) is
-   * the distance that \f$u\f$ would be from \f$1\f$.  The value
-   * returned in the antithetic case, \f$x'\f$, is calculated as
-   *
-   *    \f[
-   *         x' = - mean * \log(1 - u), 
-   *    \f]
-   *
-   * which now involves the log of the distance \f$u\f$ is from the 1.
-   *
-   * Note that we have to re-implement this method here because the method is
-   * overloaded above for the two-argument variant and the c++ name resolution
-   * rules don't work well with overloads split between parent and child
-   * classes.
-   */
+  // Inherited from RandomVariableStream
   virtual double GetValue (void);
-
-  /**
-   * \brief Returns a random unsigned integer from an exponential distribution with the current mean and upper bound.
-   * \return A random unsigned integer value.
-   *
-   * Note that antithetic values are being generated if
-   * m_isAntithetic is equal to true.  If \f$u\f$ is a uniform variable
-   * over [0,1] and
-   *
-   *    \f[
-   *         x = - mean * \log(u) 
-   *    \f]
-   *
-   * is a value that would be returned normally, then \f$(1 - u\f$) is
-   * the distance that \f$u\f$ would be from \f$1\f$.  The value
-   * returned in the antithetic case, \f$x'\f$, is calculated as
-   *
-   *    \f[
-   *         x' = - mean * \log(1 - u), 
-   *    \f]
-   *
-   * which now involves the log of the distance \f$u\f$ is from the 1.
-   */
   virtual uint32_t GetInteger (void);
 
 private:
-  /// The mean value of the random variables returned by this RNG stream.
+  /** The mean value of the unbounded exponential distribution. */
   double m_mean;
 
-  /// The upper bound on values that can be returned by this RNG stream.
+  /** The upper bound on values that can be returned by this RNG stream. */
   double m_bound;
-};
 
+};  // class ExponentialRandomVariable
+
+  
 /**
  * \ingroup randomvariable
- * \brief The Pareto distribution Random Number Generator (RNG) that allows stream numbers to be set deterministically.
+ * \brief The Pareto distribution Random Number Generator (RNG).
  *
  * This class supports the creation of objects that return random numbers
  * from a fixed Pareto distribution.  It also supports the generation of
@@ -654,6 +643,10 @@
 class ParetoRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -682,9 +675,9 @@
 
   /**
    * \brief Returns a random double from a Pareto distribution with the specified mean, shape, and upper bound.
-   * \param mean Mean parameter for the Pareto distribution.
-   * \param shape Shape parameter for the Pareto distribution.
-   * \param bound Upper bound on values returned.
+   * \param [in] mean Mean parameter for the Pareto distribution.
+   * \param [in] shape Shape parameter for the Pareto distribution.
+   * \param [in] bound Upper bound on values returned.
    * \return A floating point random value.
    *
    * Note that antithetic values are being generated if
@@ -715,9 +708,9 @@
 
   /**
    * \brief Returns a random unsigned integer from a Pareto distribution with the specified mean, shape, and upper bound.
-   * \param mean Mean parameter for the Pareto distribution.
-   * \param shape Shape parameter for the Pareto distribution.
-   * \param bound Upper bound on values returned.
+   * \param [in] mean Mean parameter for the Pareto distribution.
+   * \param [in] shape Shape parameter for the Pareto distribution.
+   * \param [in] bound Upper bound on values returned.
    * \return A random unsigned integer value.
    *
    * Note that antithetic values are being generated if
@@ -812,16 +805,18 @@
   virtual uint32_t GetInteger (void);
 
 private:
-  /// The mean parameter for the Pareto distribution returned by this RNG stream.
+  /** The mean parameter for the Pareto distribution returned by this RNG stream. */
   double m_mean;
 
-  /// The shape parameter for the Pareto distribution returned by this RNG stream.
+  /** The shape parameter for the Pareto distribution returned by this RNG stream. */
   double m_shape;
 
-  /// The upper bound on values that can be returned by this RNG stream.
+  /** The upper bound on values that can be returned by this RNG stream. */
   double m_bound;
-};
 
+};  // class ParetoRandomVariable
+
+  
 /**
  * \ingroup randomvariable
  * \brief The Weibull distribution Random Number Generator (RNG) that allows stream numbers to be set deterministically.
@@ -878,6 +873,10 @@
 class WeibullRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -906,9 +905,9 @@
 
   /**
    * \brief Returns a random double from a Weibull distribution with the specified scale, shape, and upper bound.
-   * \param scale Scale parameter for the Weibull distribution.
-   * \param shape Shape parameter for the Weibull distribution.
-   * \param bound Upper bound on values returned.
+   * \param [in] scale Scale parameter for the Weibull distribution.
+   * \param [in] shape Shape parameter for the Weibull distribution.
+   * \param [in] bound Upper bound on values returned.
    * \return A floating point random value.
    *
    * Note that antithetic values are being generated if
@@ -933,9 +932,9 @@
 
   /**
    * \brief Returns a random unsigned integer from a Weibull distribution with the specified scale, shape, and upper bound.
-   * \param scale Scale parameter for the Weibull distribution.
-   * \param shape Shape parameter for the Weibull distribution.
-   * \param bound Upper bound on values returned.
+   * \param [in] scale Scale parameter for the Weibull distribution.
+   * \param [in] shape Shape parameter for the Weibull distribution.
+   * \param [in] bound Upper bound on values returned.
    * \return A random unsigned integer value.
    *
    * Note that antithetic values are being generated if
@@ -1012,16 +1011,18 @@
   virtual uint32_t GetInteger (void);
 
 private:
-  /// The scale parameter for the Weibull distribution returned by this RNG stream.
+  /** The scale parameter for the Weibull distribution returned by this RNG stream. */
   double m_scale;
 
-  /// The shape parameter for the Weibull distribution returned by this RNG stream.
+  /** The shape parameter for the Weibull distribution returned by this RNG stream. */
   double m_shape;
 
-  /// The upper bound on values that can be returned by this RNG stream.
+  /** The upper bound on values that can be returned by this RNG stream. */
   double m_bound;
-};
 
+};  // class WeibullRandomVariable
+
+  
 /**
  * \ingroup randomvariable
  * \brief The normal (Gaussian) distribution Random Number Generator
@@ -1058,8 +1059,13 @@
 class NormalRandomVariable : public RandomVariableStream
 {
 public:
+  /** Large constant to bound the range. */
   static const double INFINITE_VALUE;
 
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -1088,9 +1094,9 @@
 
   /**
    * \brief Returns a random double from a normal distribution with the specified mean, variance, and bound.
-   * \param mean Mean value for the normal distribution.
-   * \param variance Variance value for the normal distribution.
-   * \param bound Bound on values returned.
+   * \param [in] mean Mean value for the normal distribution.
+   * \param [in] variance Variance value for the normal distribution.
+   * \param [in] bound Bound on values returned.
    * \return A floating point random value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -1126,9 +1132,9 @@
 
   /**
    * \brief Returns a random unsigned integer from a normal distribution with the specified mean, variance, and bound.
-   * \param mean Mean value for the normal distribution.
-   * \param variance Variance value for the normal distribution.
-   * \param bound Bound on values returned.
+   * \param [in] mean Mean value for the normal distribution.
+   * \param [in] variance Variance value for the normal distribution.
+   * \param [in] bound Bound on values returned.
    * \return A random unsigned integer value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -1238,22 +1244,24 @@
   virtual uint32_t GetInteger (void);
 
 private:
-  /// The mean value for the normal distribution returned by this RNG stream.
+  /** The mean value for the normal distribution returned by this RNG stream. */
   double m_mean;
 
-  /// The variance value for the normal distribution returned by this RNG stream.
+  /** The variance value for the normal distribution returned by this RNG stream. */
   double m_variance;
 
-  /// The bound on values that can be returned by this RNG stream.
+  /** The bound on values that can be returned by this RNG stream. */
   double m_bound;
 
-  /// True if the next value is valid.
+  /** True if the next value is valid. */
   bool m_nextValid;
 
-  /// The algorithm produces two values at a time.
+  /** The algorithm produces two values at a time. */
   double m_next;
-};
 
+};  // class NormalRandomVariable
+
+  
 /**
  * \ingroup randomvariable
  * \brief The log-normal distribution Random Number Generator
@@ -1300,6 +1308,10 @@
 class LogNormalRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -1322,8 +1334,8 @@
 
   /**
    * \brief Returns a random double from a log-normal distribution with the specified mu and sigma.
-   * \param mu Mu value for the log-normal distribution.
-   * \param sigma Sigma value for the log-normal distribution.
+   * \param [in] mu Mu value for the log-normal distribution.
+   * \param [in] sigma Sigma value for the log-normal distribution.
    * \return A floating point random value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -1357,8 +1369,8 @@
 
   /**
    * \brief Returns a random unsigned integer from a log-normal distribution with the specified mu and sigma.
-   * \param mu Mu value for the log-normal distribution.
-   * \param sigma Sigma value for the log-normal distribution.
+   * \param [in] mu Mu value for the log-normal distribution.
+   * \param [in] sigma Sigma value for the log-normal distribution.
    * \return A random unsigned integer value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -1462,12 +1474,14 @@
   virtual uint32_t GetInteger (void);
 
 private:
-  /// The mu value for the log-normal distribution returned by this RNG stream.
+  /** The mu value for the log-normal distribution returned by this RNG stream. */
   double m_mu;
 
-  /// The sigma value for the log-normal distribution returned by this RNG stream.
+  /** The sigma value for the log-normal distribution returned by this RNG stream. */
   double m_sigma;
-};
+
+};  // class LogNormalRandomVariable
+  
 
 /**
  * \ingroup randomvariable
@@ -1503,6 +1517,10 @@
 class GammaRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -1525,8 +1543,8 @@
 
   /**
    * \brief Returns a random double from a gamma distribution with the specified alpha and beta.
-   * \param alpha Alpha value for the gamma distribution.
-   * \param beta Beta value for the gamma distribution.
+   * \param [in] alpha Alpha value for the gamma distribution.
+   * \param [in] beta Beta value for the gamma distribution.
    * \return A floating point random value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -1540,8 +1558,8 @@
 
   /**
    * \brief Returns a random unsigned integer from a gamma distribution with the specified alpha and beta.
-   * \param alpha Alpha value for the gamma distribution.
-   * \param beta Beta value for the gamma distribution.
+   * \param [in] alpha Alpha value for the gamma distribution.
+   * \param [in] beta Beta value for the gamma distribution.
    * \return A random unsigned integer value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -1587,9 +1605,9 @@
 private:
   /**
    * \brief Returns a random double from a normal distribution with the specified mean, variance, and bound.
-   * \param mean Mean value for the normal distribution.
-   * \param variance Variance value for the normal distribution.
-   * \param bound Bound on values returned.
+   * \param [in] mean Mean value for the normal distribution.
+   * \param [in] variance Variance value for the normal distribution.
+   * \param [in] bound Bound on values returned.
    * \return A floating point random value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -1623,19 +1641,20 @@
    */
   double GetNormalValue (double mean, double variance, double bound);
 
-  /// The alpha value for the gamma distribution returned by this RNG stream.
+  /** The alpha value for the gamma distribution returned by this RNG stream. */
   double m_alpha;
 
-  /// The beta value for the gamma distribution returned by this RNG stream.
+  /** The beta value for the gamma distribution returned by this RNG stream. */
   double m_beta;
 
-  /// True if the next normal value is valid.
+  /** True if the next normal value is valid. */
   bool m_nextValid;
 
-  /// The algorithm produces two normal values at a time.
+  /** The algorithm produces two normal values at a time. */
   double m_next;
 
-};
+};  // class GammaRandomVariable
+  
 
 /**
  * \ingroup randomvariable
@@ -1675,6 +1694,10 @@
 class ErlangRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -1697,8 +1720,8 @@
 
   /**
    * \brief Returns a random double from an Erlang distribution with the specified k and lambda.
-   * \param k K value for the Erlang distribution.
-   * \param lambda Lambda value for the Erlang distribution.
+   * \param [in] k K value for the Erlang distribution.
+   * \param [in] lambda Lambda value for the Erlang distribution.
    * \return A floating point random value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -1712,8 +1735,8 @@
 
   /**
    * \brief Returns a random unsigned integer from an Erlang distribution with the specified k and lambda.
-   * \param k K value for the Erlang distribution.
-   * \param lambda Lambda value for the Erlang distribution.
+   * \param [in] k K value for the Erlang distribution.
+   * \param [in] lambda Lambda value for the Erlang distribution.
    * \return A random unsigned integer value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -1759,8 +1782,8 @@
 private:
   /**
    * \brief Returns a random double from an exponential distribution with the specified mean and upper bound.
-   * \param mean Mean value of the random variables.
-   * \param bound Upper bound on values returned.
+   * \param [in] mean Mean value of the random variables.
+   * \param [in] bound Upper bound on values returned.
    * \return A floating point random value.
    *
    * Note that antithetic values are being generated if
@@ -1783,13 +1806,14 @@
    */
   double GetExponentialValue (double mean, double bound);
 
-  /// The k value for the Erlang distribution returned by this RNG stream.
+  /** The k value for the Erlang distribution returned by this RNG stream. */
   uint32_t m_k;
 
-  /// The lambda value for the Erlang distribution returned by this RNG stream.
+  /** The lambda value for the Erlang distribution returned by this RNG stream. */
   double m_lambda;
 
-};
+};  // class ErlangRandomVariable
+  
 
 /**
  * \ingroup randomvariable
@@ -1822,6 +1846,10 @@
 class TriangularRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -1850,9 +1878,9 @@
 
   /**
    * \brief Returns a random double from a triangular distribution with the specified mean, min, and max.
-   * \param mean Mean value for the triangular distribution.
-   * \param min Low end of the range.
-   * \param max High end of the range.
+   * \param [in] mean Mean value for the triangular distribution.
+   * \param [in] min Low end of the range.
+   * \param [in] max High end of the range.
    * \return A floating point random value.
    *
    * Note that antithetic values are being generated if
@@ -1890,9 +1918,9 @@
 
   /**
    * \brief Returns a random unsigned integer from a triangular distribution with the specified mean, min, and max.
-   * \param mean Mean value for the triangular distribution.
-   * \param min Low end of the range.
-   * \param max High end of the range.
+   * \param [in] mean Mean value for the triangular distribution.
+   * \param [in] min Low end of the range.
+   * \param [in] max High end of the range.
    * \return A random unsigned integer value.
    *
    * Note that antithetic values are being generated if
@@ -2008,15 +2036,17 @@
   virtual uint32_t GetInteger (void);
 
 private:
-  /// The mean value for the triangular distribution returned by this RNG stream.
+  /** The mean value for the triangular distribution returned by this RNG stream. */
   double m_mean;
 
-  /// The lower bound on values that can be returned by this RNG stream.
+  /** The lower bound on values that can be returned by this RNG stream. */
   double m_min;
 
-  /// The upper bound on values that can be returned by this RNG stream.
+  /** The upper bound on values that can be returned by this RNG stream. */
   double m_max;
-};
+
+};  // class TriangularRandomVariable
+  
 
 /**
  * \ingroup randomvariable
@@ -2079,6 +2109,10 @@
 class ZipfRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -2101,8 +2135,8 @@
 
   /**
    * \brief Returns a random double from a Zipf distribution with the specified n and alpha.
-   * \param n N value for the Zipf distribution.
-   * \param alpha Alpha value for the Zipf distribution.
+   * \param [in] n N value for the Zipf distribution.
+   * \param [in] alpha Alpha value for the Zipf distribution.
    * \return A floating point random value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -2116,8 +2150,8 @@
 
   /**
    * \brief Returns a random unsigned integer from a Zipf distribution with the specified n and alpha.
-   * \param n N value for the Zipf distribution.
-   * \param alpha Alpha value for the Zipf distribution.
+   * \param [in] n N value for the Zipf distribution.
+   * \param [in] alpha Alpha value for the Zipf distribution.
    * \return A random unsigned integer value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -2161,15 +2195,17 @@
   virtual uint32_t GetInteger (void);
 
 private:
-  /// The n value for the Zipf distribution returned by this RNG stream.
+  /** The n value for the Zipf distribution returned by this RNG stream. */
   uint32_t m_n;
 
-  /// The alpha value for the Zipf distribution returned by this RNG stream.
+  /** The alpha value for the Zipf distribution returned by this RNG stream. */
   double m_alpha;
 
-  /// The normalization constant.
+  /** The normalization constant. */
   double m_c;
-};
+
+};  // class ZipfRandomVariable
+  
 
 /**
  * \ingroup randomvariable
@@ -2213,6 +2249,10 @@
 class ZetaRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -2229,7 +2269,7 @@
 
   /**
    * \brief Returns a random double from a zeta distribution with the specified alpha.
-   * \param alpha Alpha value for the zeta distribution.
+   * \param [in] alpha Alpha value for the zeta distribution.
    * \return A floating point random value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -2243,7 +2283,7 @@
 
   /**
    * \brief Returns a random unsigned integer from a zeta distribution with the specified alpha.
-   * \param alpha Alpha value for the zeta distribution.
+   * \param [in] alpha Alpha value for the zeta distribution.
    * \return A random unsigned integer value.
    *
    * Note that antithetic values are being generated if m_isAntithetic
@@ -2287,12 +2327,14 @@
   virtual uint32_t GetInteger (void);
 
 private:
-  /// The alpha value for the zeta distribution returned by this RNG stream.
+  /** The alpha value for the zeta distribution returned by this RNG stream. */
   double m_alpha;
 
-  /// Just for calculus simplifications.
+  /** Just for calculus simplifications. */
   double m_b;
-};
+
+};  // class ZetaRandomVariable
+  
 
 /**
  * \ingroup randomvariable
@@ -2300,7 +2342,7 @@
  *
  * Defines a random variable that has a specified, predetermined
  * sequence.  This would be useful when trying to force the RNG to
- * return a known sequence, perhaps to compare NS-3 to some other
+ * return a known sequence, perhaps to compare ns-3 to some other
  * simulator
  *
  * Creates a generator that returns successive elements of the values
@@ -2327,6 +2369,10 @@
 class DeterministicRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -2338,8 +2384,8 @@
 
   /**
    * \brief Sets the array of values that holds the predetermined sequence.
-   * \param values Array of random values to return in sequence.
-   * \param length Number of values in the array.
+   * \param [in] values Array of random values to return in sequence.
+   * \param [in] length Number of values in the array.
    *
    * Note that the values in the array are copied and stored
    * (deep-copy).
@@ -2359,15 +2405,17 @@
   virtual uint32_t GetInteger (void);
 
 private:
-  /// Position in the array of values.
+  /** Position in the array of values. */
   uint64_t   m_count;
 
-  /// Position of the next value in the array of values.
+  /** Position of the next value in the array of values. */
   uint64_t   m_next;
 
-  /// Array of values to return in sequence.
+  /** Array of values to return in sequence. */
   double* m_data;
-};
+
+};  // class DeterministicRandomVariable
+  
 
 /**
  * \ingroup randomvariable
@@ -2403,6 +2451,10 @@
 class EmpiricalRandomVariable : public RandomVariableStream
 {
 public:
+  /**
+   * \brief Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -2413,8 +2465,8 @@
 
   /**
    * \brief Specifies a point in the empirical distribution
-   * \param v The function value for this point
-   * \param c Probability that the function is less than or equal to v
+   * \param [in] v The function value for this point
+   * \param [in] c Probability that the function is less than or equal to v
    */
   void CDF (double v, double c);  // Value, prob <= Value
 
@@ -2445,20 +2497,63 @@
   virtual uint32_t GetInteger (void);
 
 private:
+  /** Helper to hold one point of the CDF. */
   class ValueCDF
   {
 public:
+    /** Constructor. */
     ValueCDF ();
+    /**
+     * Construct from values.
+     *
+     * \param [in] v The argumetn value.
+     * \param [in] c The CDF at the argument value \p v.
+     */
     ValueCDF (double v, double c);
+    /**
+     * Copy constructor.
+     *
+     * \param [in] c The other ValueCDF.
+     */
     ValueCDF (const ValueCDF& c);
+
+    /** The argument value. */
     double value;
+    /** The CDF at \p value. */
     double    cdf;
   };
-  virtual void Validate ();  // Insure non-decreasing emiprical values
-  virtual double Interpolate (double, double, double, double, double);
-  bool validated; // True if non-decreasing validated
-  std::vector<ValueCDF> emp;       // Empicical CDF
-};
+  /**
+   * Check that the CDF is valid.
+   *
+   * A valid CDF has
+   *
+   * - Strictly increasing arguments, and
+   * - Strictly increasing CDF.
+   *
+   * It is a fatal error to fail validation.
+   */
+  virtual void Validate ();
+  /**
+   * Linear nterpolation between two points on the CDF to estimate
+   * the value at \p r.
+   *
+   * \param [in] c1 The first argument value.
+   * \param [in] c2 The secong argument value.
+   * \param [in] v1 The first CDF value.
+   * \param [in] v2 The secong CDF value.
+   * \param [in] r  The argument value to interpolate to.
+   * \returns The interpolated CDF at \p r.
+   */
+  virtual double Interpolate (double c1, double c2,
+                              double v1, double v2, double r);
+  
+  /** \c true once the CDF has been validated. */
+  bool validated;
+  /** The vector of CDF points. */
+  std::vector<ValueCDF> emp; 
+
+};  // class EmpiricalRandomVariable
+  
 
 } // namespace ns3
 
diff -Naur ns-3.23/src/core/model/realtime-simulator-impl.cc ns-3.24/src/core/model/realtime-simulator-impl.cc
--- ns-3.23/src/core/model/realtime-simulator-impl.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/realtime-simulator-impl.cc	2015-09-15 11:18:44.000000000 -0700
@@ -499,19 +499,19 @@
 }
 
 void 
-RealtimeSimulatorImpl::Stop (Time const &time)
+RealtimeSimulatorImpl::Stop (Time const &delay)
 {
-  NS_LOG_FUNCTION (this << time);
-  Simulator::Schedule (time, &Simulator::Stop);
+  NS_LOG_FUNCTION (this << delay);
+  Simulator::Schedule (delay, &Simulator::Stop);
 }
 
 //
 // Schedule an event for a _relative_ time in the future.
 //
 EventId
-RealtimeSimulatorImpl::Schedule (Time const &time, EventImpl *impl)
+RealtimeSimulatorImpl::Schedule (Time const &delay, EventImpl *impl)
 {
-  NS_LOG_FUNCTION (this << time << impl);
+  NS_LOG_FUNCTION (this << delay << impl);
 
   Scheduler::Event ev;
   {
@@ -522,7 +522,7 @@
     // multi-threaded, we need this calculation to be atomic.  You can see it is
     // here since we are running in a CriticalSection.
     //
-    Time tAbsolute = Simulator::Now () + time;
+    Time tAbsolute = Simulator::Now () + delay;
     NS_ASSERT_MSG (tAbsolute.IsPositive (), "RealtimeSimulatorImpl::Schedule(): Negative time");
     NS_ASSERT_MSG (tAbsolute >= TimeStep (m_currentTs), "RealtimeSimulatorImpl::Schedule(): time < m_currentTs");
     ev.impl = impl;
@@ -539,9 +539,9 @@
 }
 
 void
-RealtimeSimulatorImpl::ScheduleWithContext (uint32_t context, Time const &time, EventImpl *impl)
+RealtimeSimulatorImpl::ScheduleWithContext (uint32_t context, Time const &delay, EventImpl *impl)
 {
-  NS_LOG_FUNCTION (this << context << time << impl);
+  NS_LOG_FUNCTION (this << context << delay << impl);
 
   {
     CriticalSection cs (m_mutex);
@@ -549,7 +549,7 @@
 
     if (SystemThread::Equals (m_main))
       {
-        ts = m_currentTs + time.GetTimeStep ();
+        ts = m_currentTs + delay.GetTimeStep ();
       }
     else
       {
@@ -558,7 +558,7 @@
         // realtime clock.  If we're not, then m_currentTs is where we stopped.
         // 
         ts = m_running ? m_synchronizer->GetCurrentRealtime () : m_currentTs;
-        ts += time.GetTimeStep ();
+        ts += delay.GetTimeStep ();
       }
 
     NS_ASSERT_MSG (ts >= m_currentTs, "RealtimeSimulatorImpl::ScheduleRealtime(): schedule for time < m_currentTs");
diff -Naur ns-3.23/src/core/model/realtime-simulator-impl.h ns-3.24/src/core/model/realtime-simulator-impl.h
--- ns-3.23/src/core/model/realtime-simulator-impl.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/realtime-simulator-impl.h	2015-09-15 11:18:44.000000000 -0700
@@ -92,9 +92,9 @@
   virtual void Destroy ();
   virtual bool IsFinished (void) const;
   virtual void Stop (void);
-  virtual void Stop (Time const &time);
-  virtual EventId Schedule (Time const &time, EventImpl *event);
-  virtual void ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event);
+  virtual void Stop (Time const &delay);
+  virtual EventId Schedule (Time const &delay, EventImpl *event);
+  virtual void ScheduleWithContext (uint32_t context, Time const &delay, EventImpl *event);
   virtual EventId ScheduleNow (EventImpl *event);
   virtual EventId ScheduleDestroy (EventImpl *event);
   virtual void Remove (const EventId &ev);
@@ -108,18 +108,18 @@
   virtual uint32_t GetSystemId (void) const; 
   virtual uint32_t GetContext (void) const;
 
-  /** \copydoc ScheduleWithContext */
-  void ScheduleRealtimeWithContext (uint32_t context, Time const &time, EventImpl *event);
-  /** \copydoc Schedule */
-  void ScheduleRealtime (Time const &time, EventImpl *event);
+  /** \copydoc ScheduleWithContext(uint32_t,const Time&,EventImpl*) */
+  void ScheduleRealtimeWithContext (uint32_t context, Time const &delay, EventImpl *event);
+  /** \copydoc Schedule(const Time&,EventImpl*) */
+  void ScheduleRealtime (Time const &delay, EventImpl *event);
   /**
-   * \copybrief ScheduleNow
+   * \copybrief ScheduleNow(EventImpl*)
    *
-   * \param context Event context.
-   * \param event The event to schedule.
+   * \param [in] context Event context.
+   * \param [in] event The event to schedule.
    */
   void ScheduleRealtimeNowWithContext (uint32_t context, EventImpl *event);
-  /** \copydoc ScheduleNow */
+  /** \copydoc ScheduleNow(EventImpl*) */
   void ScheduleRealtimeNow (EventImpl *event);
   /**
    * Get the current real time from the synchronizer.
@@ -130,7 +130,7 @@
   /**
    * Set the SynchronizationMode.
    *
-   * \param mode The new SynchronizationMode.
+   * \param [in] mode The new SynchronizationMode.
    */
   void SetSynchronizationMode (RealtimeSimulatorImpl::SynchronizationMode mode);
   /**
@@ -142,7 +142,7 @@
   /**
    * Set the fatal error threshold for SynchronizationMode SYNC_HARD_LIMIT.
    *
-   * \param limit The maximum amount of real time we are allowed to fall
+   * \param [in] limit The maximum amount of real time we are allowed to fall
    *     behind before we trigger a fatal error.
    */
   void SetHardLimit (Time limit);
diff -Naur ns-3.23/src/core/model/rng-seed-manager.h ns-3.24/src/core/model/rng-seed-manager.h
--- ns-3.23/src/core/model/rng-seed-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/rng-seed-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -22,68 +22,92 @@
 
 #include <stdint.h>
 
+/**
+ * \file
+ * \ingroup randomvariable
+ * ns3::RngSeedManager declaration.
+ */
+
 namespace ns3 {
 
+/**
+ * \ingroup randomvariable 
+ *
+ * Manage the seed number and run number of the underlying
+ * random number generator, and automatic assignment of stream numbers.
+ */
 class RngSeedManager
 {
 public:
   /**
-   * \brief set the seed
-   * it will duplicate the seed value 6 times
+   * \brief Set the seed.
+   *
+   * This sets the global initial seed which will be used all
+   * subsequently instantiated RandomVariableStream objects.
+   *
    * \code
-   * RngSeedManger::SetSeed(15);
-   * UniformVariable x(2,3);     //these will give the same output everytime
-   * ExponentialVariable y(120); //as long as the seed stays the same
+   *   RngSeedManger::SetSeed(15);
+   *   UniformVariable x(2,3);     // These will give the same output everytime
+   *   ExponentialVariable y(120); // as long as the seed stays the same.
    * \endcode
-   * \param seed
+   * \param [in] seed The seed value to use.
    *
-   * Note, while the underlying RNG takes six integer values as a seed;
+   * \note While the underlying RNG takes six integer values as a seed;
    * it is sufficient to set these all to the same integer, so we provide
    * a simpler interface here that just takes one integer.
    */
   static void SetSeed (uint32_t seed);
 
   /**
-   * \brief Get the seed value
-   * \return the seed value
+   * \brief Get the current seed value which will be used by all
+   * subsequently instantiated RandomVariableStream objects.
+   * 
+   * \return The seed value.
    *
-   * Note:  returns the first of the six seed values used in the underlying RNG
+   * This returns the current seed value. 
    */
   static uint32_t GetSeed (void);
 
   /**
-   * \brief Set the run number of simulation
+   * \brief Set the run number of simulation.
    *
    * \code
-   * RngSeedManager::SetSeed(12);
-   * int N = atol(argv[1]); //read in run number from command line
-   * RngSeedManager::SetRun(N);
-   * UniformVariable x(0,10);
-   * ExponentialVariable y(2902);
+   *   RngSeedManager::SetSeed(12);
+   *   int N = atol(argv[1]);      // Read in run number from command line.
+   *   RngSeedManager::SetRun(N);
+   *   UniformVariable x(0,10);
+   *   ExponentialVariable y(2902);
    * \endcode
-   * In this example, N could successivly be equal to 1,2,3, etc. and the user
-   * would continue to get independent runs out of the single simulation.  For
-   * this simple example, the following might work:
+   * In this example, \c N could successivly be equal to 1,2,3, _etc._
+   * and the user would continue to get independent runs out of the
+   * single simulation.  For this simple example, the following might work:
    * \code
-   * ./simulation 0
-   * ...Results for run 0:...
+   *   ./simulation 0
+   *   ...Results for run 0:...
    *
-   * ./simulation 1
-   * ...Results for run 1:...
+   *   ./simulation 1
+   *   ...Results for run 1:...
    * \endcode
+   *
+   * \param [in] run The run number.
    */
   static void SetRun (uint64_t run);
   /**
-   * \returns the current run number
-   * @sa SetRun
+   * \brief Get the current run number.
+   * \returns The current run number
+   * \see SetRun
    */
   static uint64_t GetRun (void);
 
+  /**
+   * Get the next automatically assigned stream index.
+   * \returns The next stream index.
+   */
   static uint64_t GetNextStreamIndex(void);
 
 };
 
-// for compatibility
+/** Alias for compatibility. */
 typedef RngSeedManager SeedManager;
 
 } // namespace ns3
diff -Naur ns-3.23/src/core/model/rng-stream.cc ns-3.24/src/core/model/rng-stream.cc
--- ns-3.23/src/core/model/rng-stream.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/rng-stream.cc	2015-09-15 11:18:44.000000000 -0700
@@ -26,6 +26,10 @@
 #include "fatal-error.h"
 #include "log.h"
 
+/// \file
+/// \ingroup rngimpl
+/// Class RngStream and MRG32k3a implementation.
+
 namespace ns3 {
   
 // Note:  Logging in this file is largely avoided due to the
@@ -36,26 +40,61 @@
 } // namespace ns3
 
 
+/// \ingroup rngimpl
+/// Unnamed namespace for MRG32k3a implementation details.
 namespace
 {
+
+/// \ingroup rngimpl
+/// Type for 3x3 matrix of doubles.
 typedef double Matrix[3][3];
 
+/// \ingroup rngimpl
+/// First component modulus, 2<sup>32</sup> - 209.
 const double m1   =       4294967087.0;
+
+/// \ingroup rngimpl
+/// Second component modulus, 2<sup>32</sup> - 22853.
 const double m2   =       4294944443.0;
+  
+/// \ingroup rngimpl
+/// Normalization to obtain randoms on [0,1).
 const double norm =       1.0 / (m1 + 1.0);
+  
+/// \ingroup rngimpl
+/// First component multiplier of <i>n</i> - 2 value.
 const double a12  =       1403580.0;
+  
+/// \ingroup rngimpl
+/// First component multiplier of <i>n</i> - 3 value.
 const double a13n =       810728.0;
+  
+/// \ingroup rngimpl
+/// Second component multiplier of <i>n</i> - 1 value.
 const double a21  =       527612.0;
+  
+/// \ingroup rngimpl
+/// Second component multiplier of <i>n</i> - 3 value.
 const double a23n =       1370589.0;
+
+/// \ingroup rngimpl
+/// Decomposition factor for computing a*s in less than 53 bits, 2<sup>17</sup>
 const double two17 =      131072.0;
+  
+/// \ingroup rngimpl
+/// IEEE-754 floating point precision, 2<sup>53</sup>
 const double two53 =      9007199254740992.0;
-
+  
+/// \ingroup rngimpl
+/// First component transition matrix.
 const Matrix A1p0 = {
   {       0.0,        1.0,       0.0 },
   {       0.0,        0.0,       1.0 },
   { -810728.0,  1403580.0,       0.0 }
 };
 
+/// \ingroup rngimpl
+/// Second component transition matrix.
 const Matrix A2p0 = {
   {        0.0,        1.0,       0.0 },
   {        0.0,        0.0,       1.0 },
@@ -64,7 +103,17 @@
 
 
 //-------------------------------------------------------------------------
-// Return (a*s + c) MOD m; a, s, c and m must be < 2^35
+/// \ingroup rngimpl
+/// Return (a*s + c) MOD m; a, s, c and m must be < 2^35
+///
+/// This computes the result exactly, without exceeding the 53 bit
+/// precision of doubles.
+///
+/// \param [in] a First multiplicative argument.
+/// \param [in] s Second multiplicative argument.
+/// \param [in] c Additive argument.
+/// \param [in] m Modulus.
+/// \returns <tt>(a*s +c) MOD m</tt>
 //
 double MultModM (double a, double s, double c, double m)
 {
@@ -97,8 +146,14 @@
 
 
 //-------------------------------------------------------------------------
-// Compute the vector v = A*s MOD m. Assume that -m < s[i] < m.
-// Works also when v = s.
+/// \ingroup rngimpl
+/// Compute the vector v = A*s MOD m. Assume that -m < s[i] < m.
+/// Works also when v = s.
+///
+/// \param [in] A Matrix argument, 3x3.
+/// \param [in] s Three component input vector.
+/// \param [out] v Three component output vector.
+/// \param [in] m Modulus.
 //
 void MatVecModM (const Matrix A, const double s[3], double v[3],
                  double m)
@@ -120,8 +175,14 @@
 
 
 //-------------------------------------------------------------------------
-// Compute the matrix C = A*B MOD m. Assume that -m < s[i] < m.
-// Note: works also if A = C or B = C or A = B = C.
+/// \ingroup rngimpl
+/// Compute the matrix C = A*B MOD m. Assume that -m < s[i] < m.
+/// Note: works also if A = C or B = C or A = B = C.
+///
+/// \param [in] A First matrix argument.
+/// \param [in] B Second matrix argument.
+/// \param [out] C Result matrix.
+/// \param [in] m Modulus.
 //
 void MatMatModM (const Matrix A, const Matrix B,
                  Matrix C, double m)
@@ -153,7 +214,13 @@
 
 
 //-------------------------------------------------------------------------
-// Compute the matrix B = (A^(2^e) Mod m);  works also if A = B. 
+/// \ingroup rngimpl
+/// Compute the matrix B = (A^(2^e) Mod m);  works also if A = B. 
+///
+/// \param [in] src Matrix input argument \c A.
+/// \param [out] dst Matrix output \c B.
+/// \param [in] m Modulus.
+/// \param [in] e The exponent.
 //
 void MatTwoPowModM (const Matrix src, Matrix dst, double m, int32_t e)
 {
@@ -176,9 +243,15 @@
 
 
 //-------------------------------------------------------------------------
-// Compute the matrix B = (A^n Mod m);  works even if A = B.
-//
 /*
+/// \ingroup rngimpl
+/// Compute the matrix B = (A^n Mod m);  works even if A = B.
+///
+/// \param [in] A Matrix input argument.
+/// \param [out] B Matrix output.
+/// \param [in] m Modulus.
+/// \param [in] n Exponent.
+//
 void MatPowModM (const double A[3][3], double B[3][3], double m, int32_t n)
 {
   NS_LOG_FUNCTION (A << B << m << n);
@@ -212,13 +285,19 @@
 }
 */
 
-// The following are the transition matrices of the two MRG components
-// (in matrix form), raised to all powers of 2 from 1 to 191
+/// The transition matrices of the two MRG components
+/// (in matrix form), raised to all powers of 2 from 1 to 191
+//
 struct Precalculated
 {
-  Matrix a1[190];
-  Matrix a2[190];
+  Matrix a1[190];  //!< First component transition matrix powers.
+  Matrix a2[190];  //!< Second component transition matrix powers.
 };
+/// Compute the transition matrices of the two MRG components
+//  raised to all powers of 2 from 1 to 191.
+///
+/// \returns The precalculated powers of the transition matrices.
+//
 struct Precalculated PowerOfTwoConstants (void)
 {
   struct Precalculated precalculated;
@@ -230,6 +309,12 @@
     }
   return precalculated;
 }
+/// Get the transition matrices raised to a power of 2.
+///
+/// \param [in] n The power of 2.
+/// \param [out] a1p The first transition matrix power.
+/// \param [out] a2p The second transition matrix power.
+//
 void PowerOfTwoMatrix (int n, Matrix a1p, Matrix a2p)
 {
   static struct Precalculated constants = PowerOfTwoConstants ();
diff -Naur ns-3.23/src/core/model/rng-stream.h ns-3.24/src/core/model/rng-stream.h
--- ns-3.23/src/core/model/rng-stream.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/rng-stream.h	2015-09-15 11:18:44.000000000 -0700
@@ -22,10 +22,21 @@
 #include <string>
 #include <stdint.h>
 
+/**
+ * \file
+ * \ingroup rngimpl
+ * Declaration of class RngStream.
+ */
+
 namespace ns3 {
 
 /**
- * \ingroup randomvariable 
+ * \ingroup randomvariable
+ * \defgroup rngimpl RNG Implementation.
+ */
+  
+/**
+ * \ingroup rngimpl
  *
  * \brief Combined Multiple-Recursive Generator MRG32k3a
  *
@@ -38,17 +49,39 @@
 class RngStream
 {
 public:
+  /**
+   * Construct from explicit seed, stream and substream values.
+   *
+   * \param [in] seed The starting seed.
+   * \param [in] stream The stream number.
+   * \param [in] substream The sub-stream number.
+   */
   RngStream (uint32_t seed, uint64_t stream, uint64_t substream);
-  RngStream (const RngStream&);
+  /**
+   * Copy constructor.
+   *
+   * \param [in] r The RngStream to copy.
+   */
+  RngStream (const RngStream & r);
   /**
    * Generate the next random number for this stream.
    * Uniformly distributed between 0 and 1.
+   *
+   * \returns The next random.
    */
   double RandU01 (void);
 
 private:
+  /**
+   * Advance \p state of the RNG by leaps and bounds.
+   *
+   * \param [in] nth The stream or substream index.
+   * \param [in] by The log2 base of \p nth.
+   * \param [in] state The state vector to advance.
+   */
   void AdvanceNthBy (uint64_t nth, int by, double state[6]);
 
+  /** The RNG state vector. */
   double m_currentState[6];
 };
 
diff -Naur ns-3.23/src/core/model/scheduler.h ns-3.24/src/core/model/scheduler.h
--- ns-3.23/src/core/model/scheduler.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/scheduler.h	2015-09-15 11:18:44.000000000 -0700
@@ -66,6 +66,10 @@
 class Scheduler : public Object
 {
 public:
+  /**
+   *  Register this type.
+   *  \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -91,42 +95,63 @@
     EventKey key;          /**< Key for sorting and ordering Events. */
   };
 
+  /** Destructor. */
   virtual ~Scheduler () = 0;
 
   /**
-   * \param ev event to store in the event list
+   * Insert a new Event in the schedule.
+   *
+   * \param [in] ev Event to store in the event list
    */
   virtual void Insert (const Event &ev) = 0;
   /**
-   * \returns true if the event list is empty and false otherwise.
+   * Test if the schedule is empty.
+   *
+   * \returns \c true if the event list is empty and \c false otherwise.
    */
   virtual bool IsEmpty (void) const = 0;
   /**
-   * \returns a pointer to the next earliest event. The caller
-   *      takes ownership of the returned pointer.
+   * Get a pointer to the next event.
    *
    * This method cannot be invoked if the list is empty.
+   *
+   * \returns A pointer to the next earliest event. The caller
+   *      takes ownership of the returned pointer.
    */
   virtual Event PeekNext (void) const = 0;
   /**
+   * Remove the earliest event from the event list.
+   *
    * This method cannot be invoked if the list is empty.
-   * Remove the next earliest event from the event list.
+   *
+   * \return The Event.
    */
   virtual Event RemoveNext (void) = 0;
   /**
-   * \param ev the event to remove
+   * Remove a specific event from the event list.
    *
-   * This methods cannot be invoked if the list is empty.
+   * This method cannot be invoked if the list is empty.
+   *
+   * \param [in] ev The event to remove
    */
   virtual void Remove (const Event &ev) = 0;
 };
 
-/* Note the invariants which this function must provide:
- * - irreflexibility: f (x,x) is false)
+/**
+ * \ingroup Events
+ * Compare (less than) two events by EventKey.
+ *
+ * Note the invariants which this function must provide:
+ * - irreflexibility: f (x,x) is false
  * - antisymmetry: f(x,y) = !f(y,x)
  * - transitivity: f(x,y) and f(y,z) => f(x,z)
+ *
+ * \param [in] a The first event.
+ * \param [in] b The second event.
+ * \returns \c true if \c a < \c b
  */
-inline bool operator < (const Scheduler::EventKey &a, const Scheduler::EventKey &b)
+inline bool operator < (const Scheduler::EventKey &a,
+                        const Scheduler::EventKey &b)
 {
   if (a.m_ts < b.m_ts)
     {
@@ -142,11 +167,30 @@
       return false;
     }
 }
-inline bool operator != (const Scheduler::EventKey &a, const Scheduler::EventKey &b)
+
+/**
+ * \ingroup Events
+ * Compare (not equal) two events by EventKey.
+ *
+ * \param [in] a The first event.
+ * \param [in] b The second event.
+ * \returns \c true if \c a != \c b
+ */
+inline bool operator != (const Scheduler::EventKey &a,
+                         const Scheduler::EventKey &b)
 {
   return a.m_uid != b.m_uid;
 }
-inline bool operator > (const Scheduler::EventKey &a, const Scheduler::EventKey &b)
+
+/**
+ * Compare (greater than) two events by EventKey.
+ *
+ * \param [in] a The first event.
+ * \param [in] b The second event.
+ * \returns \c true if \c a > \c b
+ */
+inline bool operator > (const Scheduler::EventKey &a,
+                        const Scheduler::EventKey &b)
 {
   if (a.m_ts > b.m_ts)
     {
@@ -163,9 +207,15 @@
     }
 }
 
-
-
-inline bool operator < (const Scheduler::Event &a, const Scheduler::Event &b)
+/**
+ * Compare (less than) two events by Event.
+ *
+ * \param [in] a The first event.
+ * \param [in] b The second event.
+ * \returns \c true if \c a < \c b
+ */
+inline bool operator < (const Scheduler::Event &a,
+                        const Scheduler::Event &b)
 {
   return a.key < b.key;
 }
diff -Naur ns-3.23/src/core/model/simple-ref-count.h ns-3.24/src/core/model/simple-ref-count.h
--- ns-3.23/src/core/model/simple-ref-count.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/simple-ref-count.h	2015-09-15 11:18:44.000000000 -0700
@@ -53,17 +53,18 @@
  * This template takes 3 arguments but only the first argument is
  * mandatory:
  *
- * \tparam T The typename of the subclass which derives from this template
- *      class. Yes, this is weird but it's a common C++ template pattern
- *      whose name is CRTP (Curiously Recursive Template Pattern)
- * \tparam PARENT: the typename of the parent of this template. By default,
- *      this typename is "'ns3::empty'" which is an empty class: compilers
- *      which implement the RBCO optimization (empty base class optimization)
- *      will make this a no-op
- * \tparam DELETER: the typename of a class which implements a public static 
- *      method named 'Delete'. This method will be called whenever the
- *      SimpleRefCount template detects that no references to the object
- *      it manages exist anymore.
+ * \tparam T \explicit The typename of the subclass which derives
+ *      from this template class. Yes, this is weird but it's a
+ *      common C++ template pattern whose name is CRTP (Curiously
+ *      Recursive Template Pattern)
+ * \tparam PARENT \explicit The typename of the parent of this template.
+ *      By default, this typename is "'ns3::empty'" which is an empty
+ *      class: compilers which implement the RBCO optimization (empty
+ *      base class optimization) will make this a no-op
+ * \tparam DELETER \explicit The typename of a class which implements
+ *      a public static method named 'Delete'. This method will be called
+ *      whenever the SimpleRefCount template detects that no references
+ *      to the object it manages exist anymore.
  *
  * Interesting users of this class include ns3::Object as well as ns3::Packet.
  */
diff -Naur ns-3.23/src/core/model/simulator.cc ns-3.24/src/core/model/simulator.cc
--- ns-3.23/src/core/model/simulator.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/simulator.cc	2015-09-15 11:18:44.000000000 -0700
@@ -79,7 +79,7 @@
  * \ingroup logging
  * Default TimePrinter implementation.
  *
- * \param [in] os The output stream to print the time on.
+ * \param [in,out] os The output stream to print the time on.
  */
 static void
 TimePrinter (std::ostream &os)
@@ -91,7 +91,7 @@
  * \ingroup logging
  * Default node id printer implementation.
  * 
- * \param [in] os The output stream to print the node id on.
+ * \param [in,out] os The output stream to print the node id on.
  */
 static void
 NodePrinter (std::ostream &os)
@@ -213,10 +213,10 @@
 }
 
 void 
-Simulator::Stop (Time const &time)
+Simulator::Stop (Time const &delay)
 {
-  NS_LOG_FUNCTION (time);
-  GetImpl ()->Stop (time);
+  NS_LOG_FUNCTION (delay);
+  GetImpl ()->Stop (delay);
 }
 
 Time
@@ -236,9 +236,9 @@
 }
 
 EventId
-Simulator::Schedule (Time const &time, const Ptr<EventImpl> &ev)
+Simulator::Schedule (Time const &delay, const Ptr<EventImpl> &event)
 {
-  return DoSchedule (time, GetPointer (ev));
+  return DoSchedule (delay, GetPointer (event));
 }
 
 EventId
@@ -247,9 +247,9 @@
   return DoScheduleNow (GetPointer (ev));
 }
 void
-Simulator::ScheduleWithContext (uint32_t context, const Time &time, EventImpl *impl)
+Simulator::ScheduleWithContext (uint32_t context, const Time &delay, EventImpl *impl)
 {
-  return GetImpl ()->ScheduleWithContext (context, time, impl);
+  return GetImpl ()->ScheduleWithContext (context, delay, impl);
 }
 EventId
 Simulator::ScheduleDestroy (const Ptr<EventImpl> &ev)
@@ -274,15 +274,15 @@
 
 
 EventId
-Simulator::Schedule (Time const &time, void (*f)(void))
+Simulator::Schedule (Time const &delay, void (*f)(void))
 {
-  return DoSchedule (time, MakeEvent (f));
+  return DoSchedule (delay, MakeEvent (f));
 }
 
 void
-Simulator::ScheduleWithContext (uint32_t context, Time const &time, void (*f)(void))
+Simulator::ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(void))
 {
-  return ScheduleWithContext (context, time, MakeEvent (f));
+  return ScheduleWithContext (context, delay, MakeEvent (f));
 }
 
 EventId
diff -Naur ns-3.23/src/core/model/simulator.h ns-3.24/src/core/model/simulator.h
--- ns-3.23/src/core/model/simulator.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/simulator.h	2015-09-15 11:18:44.000000000 -0700
@@ -32,8 +32,8 @@
 #include <string>
 
 /**
- * \file
- * \ingroup simulator
+ * @file
+ * @ingroup simulator
  * ns3::Simulator declaration.
  */
 
@@ -43,14 +43,14 @@
 class Scheduler;
 
 /**
- * \ingroup core
- * \defgroup simulator Simulator
- * \brief Control the virtual time and the execution of simulation events. 
+ * @ingroup core
+ * @defgroup simulator Simulator
+ * @brief Control the virtual time and the execution of simulation events. 
  */
 /**
- * \ingroup simulator
+ * @ingroup simulator
  *
- * \brief Control the scheduling of simulation events. 
+ * @brief Control the scheduling of simulation events. 
  *
  * The internal simulation clock is maintained
  * as a 64-bit integer in a unit specified by the user
@@ -62,16 +62,16 @@
  * expire first.
  * 
  * A simple example of how to use the Simulator class to schedule events
- * is shown in sample-simulator.cc ::
- * \include src/core/examples/sample-simulator.cc
+ * is shown in sample-simulator.cc:
+ * @include src/core/examples/sample-simulator.cc
  *
- * \todo Define what the simulation or event context means.
+ * @todo Define what the simulation or event context means.
  */
 class Simulator 
 {
 public:
   /**
-   * \param impl A new simulator implementation.
+   * @param [in] impl A new simulator implementation.
    *
    * The simulator provides a mechanism to swap out different implementations.
    * For example, the default implementation is a single-threaded simulator
@@ -85,9 +85,9 @@
   static void SetImplementation (Ptr<SimulatorImpl> impl);
 
   /**
-   * \brief Get the SimulatorImpl singleton.
+   * @brief Get the SimulatorImpl singleton.
    *
-   * \internal
+   * @internal
    * If the SimulatorImpl singleton hasn't been created yet,
    * this function does so.  At the same time it also creates
    * the Scheduler.  Both of these respect the global values
@@ -99,12 +99,13 @@
    * since we can't really do any logging until we have
    * a SimulatorImpl and Scheduler.
    
-   * \return The SimulatorImpl singleton.
+   * @return The SimulatorImpl singleton.
    */
   static Ptr<SimulatorImpl> GetImplementation (void);
 
   /**
-   * \param schedulerFactory a new event scheduler factory
+   * @brief Set the scheduler type with an ObjectFactory.
+   * @param [in] schedulerFactory The configured ObjectFactory.
    *
    * The event scheduler can be set at any time: the events scheduled
    * in the previous scheduler will be transfered to the new scheduler
@@ -112,175 +113,288 @@
    */
   static void SetScheduler (ObjectFactory schedulerFactory);
 
-  /**  \copydoc SimulatorImpl::Destroy   */
+  /**
+   * Execute the events scheduled with ScheduleDestroy().
+   *
+   * This method is typically invoked at the end of a simulation
+   * to avoid false-positive reports by a leak checker.
+   * After this method has been invoked, it is actually possible
+   * to restart a new simulation with a set of calls to Simulator::Run,
+   * Simulator::Schedule and Simulator::ScheduleWithContext.
+   */
   static void Destroy (void);
 
-  /** \copydoc SimulatorImpl::IsFinished */
+  /**
+   * Check if the simulation should finish.
+   *
+   * Reasons to finish are because there are
+   * no more events lefts to be scheduled, or if simulation
+   * time has already reached the "stop time" (see Simulator::Stop()).
+   *
+   * @return @c true if no more events or stop time reached.
+   */
   static bool IsFinished (void);
 
-  /** \copydoc SimulatorImpl::Run */
+  /**
+   * Run the simulation.
+   *
+   * The simulation will run until one of:
+   *   - No events are present anymore
+   *   - The user called Simulator::Stop
+   *   - The user called Simulator::Stop with a stop time and the
+   *     expiration time of the next event to be processed
+   *     is greater than or equal to the stop time.
+   */
   static void Run (void);
 
-  /** \copydoc SimulatorImpl::Stop(void) */
+  /**
+   * Tell the Simulator the calling event should be the last one
+   * executed.
+   *
+   * If a running event invokes this method, it will be the last
+   * event executed by the Simulator::Run method before
+   * returning to the caller.
+   */
   static void Stop (void);
 
-  /** \copydoc SimulatorImpl::Stop(Time const &) */
-  static void Stop (Time const &time);
+  /**
+   * Schedule the time delay until the Simulator should stop.
+   *
+   * Force the Simulator::Run method to return to the caller when the
+   * expiration time of the next event to be processed is greater than
+   * or equal to the stop time.  The stop time is relative to the
+   * current simulation time.
+   * @param [in] delay The stop time, relative to the current time.
+   */
+  static void Stop (Time const &delay);
 
   /**
-   * \name Schedule events (in the same context) to run at a future time.
+   * @name Schedule events (in the same context) to run at a future time.
    */
   /** @{ */
   /**
-   * Schedule an event to expire at the relative time "time"
-   * is reached.  This can be thought of as scheduling an event
-   * for the current simulation time plus the Time passed as a
-   * parameter
+   * Schedule an event to expire after @p delay.
+   * This can be thought of as scheduling an event
+   * for the current simulation time plus the @p delay  passed as a
+   * parameter.
    *
    * When the event expires (when it becomes due to be run), the 
    * input method will be invoked on the input object.
    *
-   * @param time the relative expiration time of the event.
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @returns an id for the scheduled event.
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @returns The id for the scheduled event.
    */
   template <typename MEM, typename OBJ>
-  static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj);
+  static EventId Schedule (Time const &delay, MEM mem_ptr, OBJ obj);
 
   /**
-   * @param time the relative expiration time of the event.
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @returns an id for the scheduled event.
+   * @see Schedule(const Time&,MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @returns The id for the scheduled event.
    */
   template <typename MEM, typename OBJ, typename T1>
-  static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1);
+  static EventId Schedule (Time const &delay, MEM mem_ptr, OBJ obj, T1 a1);
 
   /**
-   * @param time the relative expiration time of the event.
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @returns an id for the scheduled event.
+   * @see Schedule(const Time&,MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @returns The id for the scheduled event.
    */
   template <typename MEM, typename OBJ, typename T1, typename T2>
-  static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2);
+  static EventId Schedule (Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2);
 
   /**
-   * @param time the relative expiration time of the event.
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
-   * @returns an id for the scheduled event.
+   * @see Schedule(const Time&,MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
+   * @returns The id for the scheduled event.
    */
   template <typename MEM, typename OBJ, 
             typename T1, typename T2, typename T3>
-  static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3);
+  static EventId Schedule (Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3);
 
   /**
-   * @param time the relative expiration time of the event.
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
-   * @param a4 the fourth argument to pass to the invoked method
-   * @returns an id for the scheduled event.
+   * @see Schedule(const Time&,MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @tparam T4 @inferred Type of fourth argument.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
+   * @param [in] a4 The fourth argument to pass to the invoked method
+   * @returns The id for the scheduled event.
    */
   template <typename MEM, typename OBJ, 
             typename T1, typename T2, typename T3, typename T4>
-  static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
+  static EventId Schedule (Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
 
   /**
-   * @param time the relative expiration time of the event.
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
-   * @param a4 the fourth argument to pass to the invoked method
-   * @param a5 the fifth argument to pass to the invoked method
-   * @returns an id for the scheduled event.
+   * @see Schedule(const Time&,MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @tparam T4 @inferred Type of fourth argument.
+   * @tparam T5 @inferred Type of fifth argument.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
+   * @param [in] a4 The fourth argument to pass to the invoked method
+   * @param [in] a5 The fifth argument to pass to the invoked method
+   * @returns The id for the scheduled event.
    */
   template <typename MEM, typename OBJ, 
             typename T1, typename T2, typename T3, typename T4, typename T5>
-  static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, 
+  static EventId Schedule (Time const &delay, MEM mem_ptr, OBJ obj, 
                            T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
   /**
-   * @param time the relative expiration time of the event.
-   * @param f the function to invoke
-   * @returns an id for the scheduled event.
-   */
-  static EventId Schedule (Time const &time, void (*f)(void));
-
-  /**
-   * @param time the relative expiration time of the event.
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @returns an id for the scheduled event.
+   * @copybrief Schedule(const Time&,MEM,OBJ)
+   *
+   * When the event expires (when it becomes due to be run), the
+   * function will be invoked with any supplied arguments.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   * @returns The id for the scheduled event.
+   */
+  static EventId Schedule (Time const &delay, void (*f)(void));
+
+  /**
+   * @see Schedule(const Time&,(*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke.
+   * @returns The id for the scheduled event.
    */
   template <typename U1, typename T1>
-  static EventId Schedule (Time const &time, void (*f)(U1), T1 a1);
+  static EventId Schedule (Time const &delay, void (*f)(U1), T1 a1);
 
   /**
-   * @param time the relative expiration time of the event.
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @returns an id for the scheduled event.
+   * @see Schedule(const Time&,(*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @returns The id for the scheduled event.
    */
-  template <typename U1, typename U2, typename T1, typename T2>
-  static EventId Schedule (Time const &time, void (*f)(U1,U2), T1 a1, T2 a2);
+  template <typename U1, typename U2,
+            typename T1, typename T2>
+  static EventId Schedule (Time const &delay, void (*f)(U1,U2), T1 a1, T2 a2);
 
   /**
-   * @param time the relative expiration time of the event.
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
-   * @returns an id for the scheduled event.
+   * @see Schedule(const Time&,void(*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
+   * @returns The id for the scheduled event.
    */
-  template <typename U1, typename U2, typename U3, typename T1, typename T2, typename T3>
-  static EventId Schedule (Time const &time, void (*f)(U1,U2,U3), T1 a1, T2 a2, T3 a3);
+  template <typename U1, typename U2, typename U3,
+            typename T1, typename T2, typename T3>
+  static EventId Schedule (Time const &delay, void (*f)(U1,U2,U3), T1 a1, T2 a2, T3 a3);
 
   /**
-   * @param time the relative expiration time of the event.
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
-   * @param a4 the fourth argument to pass to the function to invoke
-   * @returns an id for the scheduled event.
+   * @see Schedule(const Time&,(*)(void))
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam U4 @inferred Formal type of the fourth argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @tparam T4 @inferred Actual type of the fourth argument.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
+   * @param [in] a4 The fourth argument to pass to the function to invoke
+   * @returns The id for the scheduled event.
    */
   template <typename U1, typename U2, typename U3, typename U4, 
             typename T1, typename T2, typename T3, typename T4>
-  static EventId Schedule (Time const &time, void (*f)(U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
+  static EventId Schedule (Time const &delay, void (*f)(U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
 
   /**
-   * @param time the relative expiration time of the event.
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
-   * @param a4 the fourth argument to pass to the function to invoke
-   * @param a5 the fifth argument to pass to the function to invoke
-   * @returns an id for the scheduled event.
+   * @see Schedule(const Time&,void(*)(void))
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam U4 @inferred Formal type of the fourth argument to the function.
+   * @tparam U5 @inferred Formal type of the fifth argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @tparam T4 @inferred Actual type of the fourth argument.
+   * @tparam T5 @inferred Actual type of the fifth argument.
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
+   * @param [in] a4 The fourth argument to pass to the function to invoke
+   * @param [in] a5 The fifth argument to pass to the function to invoke
+   * @returns The id for the scheduled event.
    */
   template <typename U1, typename U2, typename U3, typename U4, typename U5,
             typename T1, typename T2, typename T3, typename T4, typename T5>
-  static EventId Schedule (Time const &time, void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
+  static EventId Schedule (Time const &delay, void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
 
   /** @} */
 
   /**
-   * \name Schedule events (in a different context) to run at a particular time.
+   * @name Schedule events (in a different context) to run now or at a future time.
    *
-   * See \ref main-test-sync.cc for example usage.
+   * See @ref main-test-sync.cc for example usage.
    */
   /** @{ */
   /**
@@ -288,167 +402,222 @@
    * A context of 0xffffffff means no context is specified.
    * This method is thread-safe: it can be called from any thread.
    *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
+   * @see Schedule(const Time&,MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
    */
   template <typename MEM, typename OBJ>
-  static void ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj);
+  static void ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj);
 
   /**
-   * This method is thread-safe: it can be called from any thread.
-   *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
+   * @see ScheduleWithContext(uint32_t,const Time&,MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
    */
   template <typename MEM, typename OBJ, typename T1>
-  static void ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj, T1 a1);
+  static void ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj, T1 a1);
 
   /**
-   * This method is thread-safe: it can be called from any thread.
-   *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
+   * @see ScheduleWithContext(uint32_t,const Time&,MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
    */
   template <typename MEM, typename OBJ, typename T1, typename T2>
-  static void ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2);
+  static void ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2);
 
   /**
-   * This method is thread-safe: it can be called from any thread.
-   *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
+   * @see ScheduleWithContext(uint32_t,const Time&,MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
    */
   template <typename MEM, typename OBJ, 
             typename T1, typename T2, typename T3>
-  static void ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3);
+  static void ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3);
 
   /**
-   * This method is thread-safe: it can be called from any thread.
-   *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
-   * @param a4 the fourth argument to pass to the invoked method
+   * @see ScheduleWithContext(uint32_t,const Time&,MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @tparam T4 @inferred Type of fourth argument.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
+   * @param [in] a4 The fourth argument to pass to the invoked method
    */
   template <typename MEM, typename OBJ, 
             typename T1, typename T2, typename T3, typename T4>
-  static void ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
+  static void ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4);
 
   /**
-   * This method is thread-safe: it can be called from any thread.
-   *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
-   * @param a4 the fourth argument to pass to the invoked method
-   * @param a5 the fifth argument to pass to the invoked method
+   * @see ScheduleWithContext(uint32_t,const Time&,MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @tparam T4 @inferred Type of fourth argument.
+   * @tparam T5 @inferred Type of fifth argument.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
+   * @param [in] a4 The fourth argument to pass to the invoked method
+   * @param [in] a5 The fifth argument to pass to the invoked method
    */
   template <typename MEM, typename OBJ, 
             typename T1, typename T2, typename T3, typename T4, typename T5>
-  static void ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj, 
+  static void ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj, 
                                    T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
   /**
-   * This method is thread-safe: it can be called from any thread.
+   * @copybrief ScheduleWithContext(uint32_t,const Time&,MEM,OBJ)
    *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param f the function to invoke
-   */
-  static void ScheduleWithContext (uint32_t context, Time const &time, void (*f)(void));
+   * When the event expires (when it becomes due to be run), the
+   * function will be invoked with any supplied arguments.
+   *
+   * This method is thread-safe: it can be called from any thread.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   */
+  static void ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(void));
 
   /**
-   * This method is thread-safe: it can be called from any thread.
-   *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
+   * @see ScheduleWithContext(uint32_t,const Time&,(*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
    */
-  template <typename U1, typename T1>
-  static void ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1), T1 a1);
+  template <typename U1,
+            typename T1>
+  static void ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(U1), T1 a1);
 
   /**
-   * This method is thread-safe: it can be called from any thread.
-   *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
+   * @see ScheduleWithContext(uint32_t,const Time&,(*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
    */
-  template <typename U1, typename U2, typename T1, typename T2>
-  static void ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1,U2), T1 a1, T2 a2);
+  template <typename U1, typename U2,
+            typename T1, typename T2>
+  static void ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(U1,U2), T1 a1, T2 a2);
 
   /**
-   * This method is thread-safe: it can be called from any thread.
-   *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
+   * @see ScheduleWithContext(uint32_t,const Time&,(*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
    */
-  template <typename U1, typename U2, typename U3, typename T1, typename T2, typename T3>
-  static void ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1,U2,U3), T1 a1, T2 a2, T3 a3);
+  template <typename U1, typename U2, typename U3,
+            typename T1, typename T2, typename T3>
+  static void ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(U1,U2,U3), T1 a1, T2 a2, T3 a3);
 
   /**
-   * This method is thread-safe: it can be called from any thread.
-   *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
-   * @param a4 the fourth argument to pass to the function to invoke
+   * @see ScheduleWithContext(uint32_t,const Time&,(*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam U4 @inferred Formal type of the fourth argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @tparam T4 @inferred Actual type of the fourth argument.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
+   * @param [in] a4 The fourth argument to pass to the function to invoke
    */
   template <typename U1, typename U2, typename U3, typename U4, 
             typename T1, typename T2, typename T3, typename T4>
-  static void ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
+  static void ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
 
   /**
-   * This method is thread-safe: it can be called from any thread.
-   *
-   * @param time the relative expiration time of the event.
-   * @param context user-specified context parameter
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
-   * @param a4 the fourth argument to pass to the function to invoke
-   * @param a5 the fifth argument to pass to the function to invoke
+   * @see ScheduleWithContext(uint32_t,const Time&,(*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam U4 @inferred Formal type of the fourth argument to the function.
+   * @tparam U5 @inferred Formal type of the fifth argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @tparam T4 @inferred Actual type of the fourth argument.
+   * @tparam T5 @inferred Actual type of the fifth argument.
+   * @param [in] context User-specified context parameter
+   * @param [in] delay The relative expiration time of the event.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
+   * @param [in] a4 The fourth argument to pass to the function to invoke
+   * @param [in] a5 The fifth argument to pass to the function to invoke
    */
   template <typename U1, typename U2, typename U3, typename U4, typename U5,
             typename T1, typename T2, typename T3, typename T4, typename T5>
-  static void ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
+  static void ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
 
   /** @} */
   
   /**
-   * \name Schedule events (in the same context) to run now.
+   * @name Schedule events (in the same context) to run now.
    */
   /** @{ */
   /**
@@ -456,17 +625,23 @@
    * to expire "Now" are scheduled FIFO, after all normal events
    * have expired. 
    *
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ>
   static EventId ScheduleNow (MEM mem_ptr, OBJ obj);
 
   /**
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
+   * @see ScheduleNow(MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ, 
@@ -474,10 +649,15 @@
   static EventId ScheduleNow (MEM mem_ptr, OBJ obj, T1 a1);
 
   /**
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
+   * @see ScheduleNow(MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ, 
@@ -485,11 +665,17 @@
   static EventId ScheduleNow (MEM mem_ptr, OBJ obj, T1 a1, T2 a2);
 
   /**
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
+   * @see ScheduleNow(MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ, 
@@ -497,12 +683,19 @@
   static EventId ScheduleNow (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3);
 
   /**
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
-   * @param a4 the fourth argument to pass to the invoked method
+   * @see ScheduleNow(MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @tparam T4 @inferred Type of fourth argument.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
+   * @param [in] a4 The fourth argument to pass to the invoked method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ, 
@@ -510,13 +703,21 @@
   static EventId ScheduleNow (MEM mem_ptr, OBJ obj, 
                               T1 a1, T2 a2, T3 a3, T4 a4);
   /**
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
-   * @param a4 the fourth argument to pass to the invoked method
-   * @param a5 the fifth argument to pass to the invoked method
+   * @see ScheduleNow(MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @tparam T4 @inferred Type of fourth argument.
+   * @tparam T5 @inferred Type of fifth argument.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
+   * @param [in] a4 The fourth argument to pass to the invoked method
+   * @param [in] a5 The fifth argument to pass to the invoked method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ, 
@@ -524,14 +725,21 @@
   static EventId ScheduleNow (MEM mem_ptr, OBJ obj, 
                               T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
   /**
-   * @param f the function to invoke
+   * @copybrief ScheduleNow(MEM,OBJ)
+   *
+   * When the event expires (when it becomes due to be run), the
+   * function will be invoked with any supplied arguments.
+   * @param [in] f The function to invoke
    * @return The EventId of the scheduled event.
    */
   static EventId ScheduleNow (void (*f)(void));
 
   /**
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
+   * @see ScheduleNow(*)
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
    * @return The EventId of the scheduled event.
    */
   template <typename U1,
@@ -539,9 +747,14 @@
   static EventId ScheduleNow (void (*f)(U1), T1 a1);
 
   /**
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
+   * @see ScheduleNow(*)
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
    * @return The EventId of the scheduled event.
    */
   template <typename U1, typename U2,
@@ -549,10 +762,17 @@
   static EventId ScheduleNow (void (*f)(U1,U2), T1 a1, T2 a2);
 
   /**
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
+   * @see ScheduleNow(*)
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
    * @return The EventId of the scheduled event.
    */
   template <typename U1, typename U2, typename U3,
@@ -560,11 +780,20 @@
   static EventId ScheduleNow (void (*f)(U1,U2,U3), T1 a1, T2 a2, T3 a3);
 
   /**
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
-   * @param a4 the fourth argument to pass to the function to invoke
+   * @see ScheduleNow(*)
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam U4 @inferred Formal type of the fourth argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @tparam T4 @inferred Actual type of the fourth argument.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
+   * @param [in] a4 The fourth argument to pass to the function to invoke
    * @return The EventId of the scheduled event.
    */
   template <typename U1, typename U2, typename U3, typename U4,
@@ -572,12 +801,23 @@
   static EventId ScheduleNow (void (*f)(U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
 
   /**
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
-   * @param a4 the fourth argument to pass to the function to invoke
-   * @param a5 the fifth argument to pass to the function to invoke
+   * @see ScheduleNow(*)
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam U4 @inferred Formal type of the fourth argument to the function.
+   * @tparam U5 @inferred Formal type of the fifth argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @tparam T4 @inferred Actual type of the fourth argument.
+   * @tparam T5 @inferred Actual type of the fifth argument.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
+   * @param [in] a4 The fourth argument to pass to the function to invoke
+   * @param [in] a5 The fifth argument to pass to the function to invoke
    * @return The EventId of the scheduled event.
    */
   template <typename U1, typename U2, typename U3, typename U4, typename U5,
@@ -587,26 +827,32 @@
   /** @} */
 
   /**
-   * \name Schedule events to run at the end of the simulation.
+   * @name Schedule events to run at the end of the simulation, when Simulator:Destroy() is called.
    */
   /** @{ */
   /**
-   * Schedule an event to expire at Destroy time. All events 
-   * scheduled to expire at "Destroy" time are scheduled FIFO, 
+   * Schedule an event to expire when Simulator::Destroy is called.
+   * All events scheduled to expire at "Destroy" time are scheduled FIFO, 
    * after all normal events have expired and only when 
    * Simulator::Destroy is invoked.
    *
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ>
   static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj);
 
   /**
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
+   * @see ScheduleDestroy(MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ, 
@@ -614,10 +860,15 @@
   static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj, T1 a1);
 
   /**
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
+   * @see ScheduleDestroy(MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ,
@@ -625,11 +876,17 @@
   static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj, T1 a1, T2 a2);
 
   /**
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
+   * @see ScheduleDestroy(MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ, 
@@ -637,12 +894,19 @@
   static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3);
 
   /**
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
-   * @param a4 the fourth argument to pass to the invoked method
+   * @see ScheduleDestroy(MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @tparam T4 @inferred Type of fourth argument.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
+   * @param [in] a4 The fourth argument to pass to the invoked method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ, 
@@ -650,13 +914,21 @@
   static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj, 
                                   T1 a1, T2 a2, T3 a3, T4 a4);
   /**
-   * @param mem_ptr member method pointer to invoke
-   * @param obj the object on which to invoke the member method
-   * @param a1 the first argument to pass to the invoked method
-   * @param a2 the second argument to pass to the invoked method
-   * @param a3 the third argument to pass to the invoked method
-   * @param a4 the fourth argument to pass to the invoked method
-   * @param a5 the fifth argument to pass to the invoked method
+   * @see ScheduleDestroy(MEM,OBJ)
+   * @tparam MEM @inferred Class method function signature type.
+   * @tparam OBJ @inferred Class type of the object.
+   * @tparam T1 @inferred Type of first argument.
+   * @tparam T2 @inferred Type of second argument.
+   * @tparam T3 @inferred Type of third argument.
+   * @tparam T4 @inferred Type of fourth argument.
+   * @tparam T5 @inferred Type of fifth argument.
+   * @param [in] mem_ptr Member method pointer to invoke
+   * @param [in] obj The object on which to invoke the member method
+   * @param [in] a1 The first argument to pass to the invoked method
+   * @param [in] a2 The second argument to pass to the invoked method
+   * @param [in] a3 The third argument to pass to the invoked method
+   * @param [in] a4 The fourth argument to pass to the invoked method
+   * @param [in] a5 The fifth argument to pass to the invoked method
    * @return The EventId of the scheduled event.
    */
   template <typename MEM, typename OBJ, 
@@ -664,14 +936,20 @@
   static EventId ScheduleDestroy (MEM mem_ptr, OBJ obj, 
                                   T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
   /**
-   * @param f the function to invoke
+   * @copybrief ScheduleDestroy(MEM,OBJ)
+   * When Simulator::Destroy() is called, the
+   * function will be invoked with any supplied arguments.
+   * @param [in] f The function to invoke
    * @return The EventId of the scheduled event.
    */
   static EventId ScheduleDestroy (void (*f)(void));
 
   /**
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
+   * @see ScheduleDestory((*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
    * @return The EventId of the scheduled event.
    */
   template <typename U1,
@@ -679,9 +957,14 @@
   static EventId ScheduleDestroy (void (*f)(U1), T1 a1);
 
   /**
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
+   * @see ScheduleDestory((*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
    * @return The EventId of the scheduled event.
    */
   template <typename U1, typename U2,
@@ -689,10 +972,17 @@
   static EventId ScheduleDestroy (void (*f)(U1,U2), T1 a1, T2 a2);
 
   /**
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
+   * @see ScheduleDestory((*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
    * @return The EventId of the scheduled event.
    */
   template <typename U1, typename U2, typename U3,
@@ -700,11 +990,20 @@
   static EventId ScheduleDestroy (void (*f)(U1,U2,U3), T1 a1, T2 a2, T3 a3);
 
   /**
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
-   * @param a4 the fourth argument to pass to the function to invoke
+   * @see ScheduleDestory((*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam U4 @inferred Formal type of the fourth argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @tparam T4 @inferred Actual type of the fourth argument.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
+   * @param [in] a4 The fourth argument to pass to the function to invoke
    * @return The EventId of the scheduled event.
    */
   template <typename U1, typename U2, typename U3, typename U4,
@@ -712,12 +1011,23 @@
   static EventId ScheduleDestroy (void (*f)(U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4);
 
   /**
-   * @param f the function to invoke
-   * @param a1 the first argument to pass to the function to invoke
-   * @param a2 the second argument to pass to the function to invoke
-   * @param a3 the third argument to pass to the function to invoke
-   * @param a4 the fourth argument to pass to the function to invoke
-   * @param a5 the fifth argument to pass to the function to invoke
+   * @see ScheduleDestory((*)())
+   * @tparam U1 @inferred Formal type of the first argument to the function.
+   * @tparam U2 @inferred Formal type of the second argument to the function.
+   * @tparam U3 @inferred Formal type of the third argument to the function.
+   * @tparam U4 @inferred Formal type of the fourth argument to the function.
+   * @tparam U5 @inferred Formal type of the fifth argument to the function.
+   * @tparam T1 @inferred Actual type of the first argument.
+   * @tparam T2 @inferred Actual type of the second argument.
+   * @tparam T3 @inferred Actual type of the third argument.
+   * @tparam T4 @inferred Actual type of the fourth argument.
+   * @tparam T5 @inferred Actual type of the fifth argument.
+   * @param [in] f The function to invoke
+   * @param [in] a1 The first argument to pass to the function to invoke
+   * @param [in] a2 The second argument to pass to the function to invoke
+   * @param [in] a3 The third argument to pass to the function to invoke
+   * @param [in] a4 The fourth argument to pass to the function to invoke
+   * @param [in] a5 The fifth argument to pass to the function to invoke
    * @return The EventId of the scheduled event.
    */
   template <typename U1, typename U2, typename U3, typename U4, typename U5,
@@ -726,42 +1036,129 @@
 
   /** @} */
 
-  /** \copydoc SimulatorImpl::Remove */
+  /**
+   * Remove an event from the event list. 
+   * 
+   * This method has the same visible effect as the 
+   * ns3::EventId::Cancel method
+   * but its algorithmic complexity is much higher: it has often 
+   * O(log(n)) complexity, sometimes O(n), sometimes worse.
+   * Note that it is not possible to remove events which were scheduled
+   * for the "destroy" time. Doing so will result in a program error (crash).
+   *
+   * @param [in] id The event to remove from the list of scheduled events.
+   */
   static void Remove (const EventId &id);
 
-  /** \copydoc SimulatorImpl::Cancel */
+  /**
+   * Set the cancel bit on this event: the event's associated function
+   * will not be invoked when it expires.
+   *
+   * This method has the same visible effect as the 
+   * ns3::Simulator::Remove method but its algorithmic complexity is 
+   * much lower: it has O(1) complexity.
+   * This method has the exact same semantics as ns3::EventId::Cancel.
+   * Note that it is not possible to cancel events which were scheduled
+   * for the "destroy" time. Doing so will result in a program error (crash).
+   * 
+   * @param [in] id the event to cancel
+   */
   static void Cancel (const EventId &id);
 
-  /** \copydoc SimulatorImpl::IsExpired */
+  /**
+   * Check if an event has already run or been cancelled.
+   *
+   * This method has O(1) complexity.
+   * Note that it is not possible to test for the expiration of
+   * events which were scheduled for the "destroy" time. Doing so
+   * will result in a program error (crash).
+   * An event is said to "expire" when it starts being scheduled
+   * which means that if the code executed by the event calls
+   * this function, it will get true.
+   *
+   * @param [in] id The event to test for expiration.
+   * @returns @c true if the event has expired, false otherwise.
+   */
   static bool IsExpired (const EventId &id);
 
-  /** \copydoc SimulatorImpl::Now */
+  /**
+   * Return the current simulation virtual time.
+   *
+   * @returns The current virtual time.
+   */
   static Time Now (void);
 
-  /** \copydoc SimulatorImpl::GetDelayLeft */
+  /**
+   * Get the remaining time until this event will execute.
+   *
+   * @param [in] id The event id to analyse.
+   * @return The delay left until the input event id expires.
+   *          if the event is not running, this method returns
+   *          zero.
+   */
   static Time GetDelayLeft (const EventId &id);
 
-  /** \copydoc SimulatorImpl::GetMaximumSimulationTime */
+  /**
+   * Get the maximum representable simulation time.
+   *
+   * @return The maximum simulation time at which an event 
+   *          can be scheduled.
+   *
+   * The returned value will always be bigger than or equal to Simulator::Now.
+   */
   static Time GetMaximumSimulationTime (void);
 
-  /** \copydoc SimulatorImpl::GetContext */
+  /**
+   * Get the current simulation context.
+   *
+   * @return The current simulation context
+   */
   static uint32_t GetContext (void);
 
-  /** \copydoc SimulatorImpl::Schedule */
-  static EventId Schedule (Time const &time, const Ptr<EventImpl> &event);
+  /**
+   * Schedule a future event execution (in the same context).
+   *
+   * @param [in] delay Delay until the event expires.
+   * @param [in] event The event to schedule.
+   * @returns A unique identifier for the newly-scheduled event.
+   */
+  static EventId Schedule (Time const &delay, const Ptr<EventImpl> &event);
 
-  /** \copydoc SimulatorImpl::ScheduleWithContext
+  /**
+   * Schedule a future event execution (in a different context).
    * This method is thread-safe: it can be called from any thread.
+   *
+   * @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 &time, EventImpl *event);
+  static void ScheduleWithContext (uint32_t context, const Time &delay, EventImpl *event);
 
-  /** \copydoc SimulatorImpl::ScheduleDestroy */
+  /**
+   * Schedule an event to run at the end of the simulation, after
+   * the Stop() time or condition has been reached.
+   *
+   * @param [in] event The event to schedule.
+   * @returns A unique identifier for the newly-scheduled event.
+   */
   static EventId ScheduleDestroy (const Ptr<EventImpl> &event);
 
-  /** \copydoc SimulatorImpl::ScheduleNow */
+  /**
+   * Schedule an event to run at the current virtual time.
+   *
+   * @param [in] event The event to schedule.
+   * @returns A unique identifier for the newly-scheduled event.
+   */
   static EventId ScheduleNow (const Ptr<EventImpl> &event);
 
-  /** \copydoc SimulatorImpl::GetSystemId */
+  /**
+   * Get the system id of this simulator.
+   *
+   * The system id is the identifier for this simulator instance
+   * in a distributed simulation.  For MPI this is the MPI rank.
+   * @return The system id for this simulator.
+   */
   static uint32_t GetSystemId (void);
   
 private:
@@ -772,37 +1169,37 @@
 
   /**
    * Implementation of the various Schedule methods.
-   * \param [in] time Delay until the event should execute.
-   * \param [in] event The event to execute.
-   * \return The EventId.
+   * @param [in] delay Delay until the event should execute.
+   * @param [in] event The event to execute.
+   * @return The EventId.
    */
-  static EventId DoSchedule (Time const &time, EventImpl *event);
+  static EventId DoSchedule (Time const &delay, EventImpl *event);
   /**
    * Implementation of the various ScheduleNow methods.
-   * \param [in] event The event to execute.
-   * \return The EventId.
+   * @param [in] event The event to execute.
+   * @return The EventId.
    */
   static EventId DoScheduleNow (EventImpl *event);
   /**
    * Implementation of the various ScheduleDestroy methods.
-   * \param [in] event The event to execute.
-   * \return The EventId.
+   * @param [in] event The event to execute.
+   * @return The EventId.
    */
   static EventId DoScheduleDestroy (EventImpl *event);
 };
 
 /**
- * \ingroup simulator
- * \brief create an ns3::Time instance which contains the
+ * @ingroup simulator
+ * @brief create an ns3::Time instance which contains the
  *        current simulation time.
  *
  * This is really a shortcut for the ns3::Simulator::Now method.
  * It is typically used as shown below to schedule an event
  * which expires at the absolute time "2 seconds":
- * \code
+ * @code
  *   Simulator::Schedule (Seconds (2.0) - Now (), &my_function);
- * \endcode
- * \return The current simulation time.
+ * @endcode
+ * @return The current simulation time.
  */
 Time Now (void);
 
@@ -816,160 +1213,162 @@
 namespace ns3 {
 
 template <typename MEM, typename OBJ>
-EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj) 
+EventId Simulator::Schedule (Time const &delay, MEM mem_ptr, OBJ obj) 
 {
-  return DoSchedule (time, MakeEvent (mem_ptr, obj));
+  return DoSchedule (delay, MakeEvent (mem_ptr, obj));
 }
 
 
 template <typename MEM, typename OBJ,
           typename T1>
-EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1) 
+EventId Simulator::Schedule (Time const &delay, MEM mem_ptr, OBJ obj, T1 a1) 
 {
-  return DoSchedule (time, MakeEvent (mem_ptr, obj, a1));
+  return DoSchedule (delay, MakeEvent (mem_ptr, obj, a1));
 }
 
 template <typename MEM, typename OBJ, 
           typename T1, typename T2>
-EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2)
+EventId Simulator::Schedule (Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2)
 {
-  return DoSchedule (time, MakeEvent (mem_ptr, obj, a1, a2));
+  return DoSchedule (delay, MakeEvent (mem_ptr, obj, a1, a2));
 }
 
 template <typename MEM, typename OBJ,
           typename T1, typename T2, typename T3>
-EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3) 
+EventId Simulator::Schedule (Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3) 
 {
-  return DoSchedule (time, MakeEvent (mem_ptr, obj, a1, a2, a3));
+  return DoSchedule (delay, MakeEvent (mem_ptr, obj, a1, a2, a3));
 }
 
 template <typename MEM, typename OBJ, 
           typename T1, typename T2, typename T3, typename T4>
-EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4) 
+EventId Simulator::Schedule (Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4) 
 {
-  return DoSchedule (time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4));
+  return DoSchedule (delay, MakeEvent (mem_ptr, obj, a1, a2, a3, a4));
 }
 
 template <typename MEM, typename OBJ, 
           typename T1, typename T2, typename T3, typename T4, typename T5>
-EventId Simulator::Schedule (Time const &time, MEM mem_ptr, OBJ obj, 
+EventId Simulator::Schedule (Time const &delay, MEM mem_ptr, OBJ obj, 
                              T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) 
 {
-  return DoSchedule (time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
+  return DoSchedule (delay, MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
 }
 
-template <typename U1, typename T1>
-EventId Simulator::Schedule (Time const &time, void (*f)(U1), T1 a1)
+template <typename U1,
+          typename T1>
+EventId Simulator::Schedule (Time const &delay, void (*f)(U1), T1 a1)
 {
-  return DoSchedule (time, MakeEvent (f, a1));
+  return DoSchedule (delay, MakeEvent (f, a1));
 }
 
 template <typename U1, typename U2, 
           typename T1, typename T2>
-EventId Simulator::Schedule (Time const &time, void (*f)(U1,U2), T1 a1, T2 a2)
+EventId Simulator::Schedule (Time const &delay, void (*f)(U1,U2), T1 a1, T2 a2)
 {
-  return DoSchedule (time, MakeEvent (f, a1, a2));
+  return DoSchedule (delay, MakeEvent (f, a1, a2));
 }
 
 template <typename U1, typename U2, typename U3,
           typename T1, typename T2, typename T3>
-EventId Simulator::Schedule (Time const &time, void (*f)(U1,U2,U3), T1 a1, T2 a2, T3 a3)
+EventId Simulator::Schedule (Time const &delay, void (*f)(U1,U2,U3), T1 a1, T2 a2, T3 a3)
 {
-  return DoSchedule (time, MakeEvent (f, a1, a2, a3));
+  return DoSchedule (delay, MakeEvent (f, a1, a2, a3));
 }
 
 template <typename U1, typename U2, typename U3, typename U4,
           typename T1, typename T2, typename T3, typename T4>
-EventId Simulator::Schedule (Time const &time, void (*f)(U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4)
+EventId Simulator::Schedule (Time const &delay, void (*f)(U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4)
 {
-  return DoSchedule (time, MakeEvent (f, a1, a2, a3, a4));
+  return DoSchedule (delay, MakeEvent (f, a1, a2, a3, a4));
 }
 
 template <typename U1, typename U2, typename U3, typename U4, typename U5,
           typename T1, typename T2, typename T3, typename T4, typename T5>
-EventId Simulator::Schedule (Time const &time, void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
+EventId Simulator::Schedule (Time const &delay, void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
 {
-  return DoSchedule (time, MakeEvent (f, a1, a2, a3, a4, a5));
+  return DoSchedule (delay, MakeEvent (f, a1, a2, a3, a4, a5));
 }
 
 
 
 
 template <typename MEM, typename OBJ>
-void Simulator::ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj)
+void Simulator::ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj)
 {
-  ScheduleWithContext (context, time, MakeEvent (mem_ptr, obj));
+  ScheduleWithContext (context, delay, MakeEvent (mem_ptr, obj));
 }
 
 
 template <typename MEM, typename OBJ,
           typename T1>
-void Simulator::ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj, T1 a1)
+void Simulator::ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj, T1 a1)
 {
-  return ScheduleWithContext (context, time, MakeEvent (mem_ptr, obj, a1));
+  return ScheduleWithContext (context, delay, MakeEvent (mem_ptr, obj, a1));
 }
 
 template <typename MEM, typename OBJ,
           typename T1, typename T2>
-void Simulator::ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2)
+void Simulator::ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2)
 {
-  return ScheduleWithContext (context, time, MakeEvent (mem_ptr, obj, a1, a2));
+  return ScheduleWithContext (context, delay, MakeEvent (mem_ptr, obj, a1, a2));
 }
 
 template <typename MEM, typename OBJ,
           typename T1, typename T2, typename T3>
-void Simulator::ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3)
+void Simulator::ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3)
 {
-  return ScheduleWithContext (context, time, MakeEvent (mem_ptr, obj, a1, a2, a3));
+  return ScheduleWithContext (context, delay, MakeEvent (mem_ptr, obj, a1, a2, a3));
 }
 
 template <typename MEM, typename OBJ,
           typename T1, typename T2, typename T3, typename T4>
-void Simulator::ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
+void Simulator::ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3, T4 a4)
 {
-  return ScheduleWithContext (context, time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4));
+  return ScheduleWithContext (context, delay, MakeEvent (mem_ptr, obj, a1, a2, a3, a4));
 }
 
 template <typename MEM, typename OBJ,
           typename T1, typename T2, typename T3, typename T4, typename T5>
-void Simulator::ScheduleWithContext (uint32_t context, Time const &time, MEM mem_ptr, OBJ obj,
+void Simulator::ScheduleWithContext (uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj,
                                      T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
 {
-  return ScheduleWithContext (context, time, MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
+  return ScheduleWithContext (context, delay, MakeEvent (mem_ptr, obj, a1, a2, a3, a4, a5));
 }
 
-template <typename U1, typename T1>
-void Simulator::ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1), T1 a1)
+template <typename U1,
+          typename T1>
+void Simulator::ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(U1), T1 a1)
 {
-  return ScheduleWithContext (context, time, MakeEvent (f, a1));
+  return ScheduleWithContext (context, delay, MakeEvent (f, a1));
 }
 
 template <typename U1, typename U2,
           typename T1, typename T2>
-void Simulator::ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1,U2), T1 a1, T2 a2)
+void Simulator::ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(U1,U2), T1 a1, T2 a2)
 {
-  return ScheduleWithContext (context, time, MakeEvent (f, a1, a2));
+  return ScheduleWithContext (context, delay, MakeEvent (f, a1, a2));
 }
 
 template <typename U1, typename U2, typename U3,
           typename T1, typename T2, typename T3>
-void Simulator::ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1,U2,U3), T1 a1, T2 a2, T3 a3)
+void Simulator::ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(U1,U2,U3), T1 a1, T2 a2, T3 a3)
 {
-  return ScheduleWithContext (context, time, MakeEvent (f, a1, a2, a3));
+  return ScheduleWithContext (context, delay, MakeEvent (f, a1, a2, a3));
 }
 
 template <typename U1, typename U2, typename U3, typename U4,
           typename T1, typename T2, typename T3, typename T4>
-void Simulator::ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4)
+void Simulator::ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(U1,U2,U3,U4), T1 a1, T2 a2, T3 a3, T4 a4)
 {
-  return ScheduleWithContext (context, time, MakeEvent (f, a1, a2, a3, a4));
+  return ScheduleWithContext (context, delay, MakeEvent (f, a1, a2, a3, a4));
 }
 
 template <typename U1, typename U2, typename U3, typename U4, typename U5,
           typename T1, typename T2, typename T3, typename T4, typename T5>
-void Simulator::ScheduleWithContext (uint32_t context, Time const &time, void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
+void Simulator::ScheduleWithContext (uint32_t context, Time const &delay, void (*f)(U1,U2,U3,U4,U5), T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
 {
-  return ScheduleWithContext (context, time, MakeEvent (f, a1, a2, a3, a4, a5));
+  return ScheduleWithContext (context, delay, MakeEvent (f, a1, a2, a3, a4, a5));
 }
 
 
diff -Naur ns-3.23/src/core/model/simulator-impl.h ns-3.24/src/core/model/simulator-impl.h
--- ns-3.23/src/core/model/simulator-impl.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/simulator-impl.h	2015-09-15 11:18:44.000000000 -0700
@@ -55,177 +55,49 @@
    */
   static TypeId GetTypeId (void);
 
-  /**
-   * Execute the events scheduled with ScheduleDestroy().
-   *
-   * This method is typically invoked at the end of a simulation
-   * to avoid false-positive reports by a leak checker.
-   * After this method has been invoked, it is actually possible
-   * to restart a new simulation with a set of calls to Simulator::Run,
-   * Simulator::Schedule and Simulator::ScheduleWithContext.
-   */
+  /**  \copydoc Simulator::Destroy   */
   virtual void Destroy () = 0;
-  /**
-   * Check if the simulation should finish.
-   *
-   * Reasons to finish are because there are
-   * no more events lefts to be scheduled, or if simulation
-   * time has already reached the "stop time" (see Simulator::Stop()).
-   *
-   * \return \c true if no more events or stop time reached.
-   */
+  /** \copydoc Simulator::IsFinished */
   virtual bool IsFinished (void) const = 0;
-  /**
-   * Tell the Simulator the calling event should be the last one
-   * executed.
-   *
-   * If a running event invokes this method, it will be the last
-   * event executed by the Simulator::Run method before
-   * returning to the caller.
-   */
+  /** \copydoc Simulator::Stop(void) */
   virtual void Stop (void) = 0;
-  /**
-   * Schedule the time delay until the Simulator should stop.
-   *
-   * Force the Simulator::Run method to return to the caller when the
-   * expiration time of the next event to be processed is greater than
-   * or equal to the stop time.  The stop time is relative to the
-   * current simulation time.
-   * \param time The stop time, relative to the current time.
-   */
-  virtual void Stop (Time const &time) = 0;
-  /**
-   * Schedule a future event execution (in the same context).
-   *
-   * \param time Delay until the event expires.
-   * \param event The event to schedule.
-   * \returns A unique identifier for the newly-scheduled event.
-   */
-  virtual EventId Schedule (Time const &time, EventImpl *event) = 0;
-  /**
-   * Schedule a future event execution (in a different context).
-   *
-   * \param time Delay until the event expires.
-   * \param context Event context.
-   * \param event The event to schedule.
-   * \returns A unique identifier for the newly-scheduled event.
-   */
-  virtual void ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event) = 0;
-  /**
-   * Schedule an event to run at the current virtual time.
-   *
-   * \param event The event to schedule.
-   * \returns A unique identifier for the newly-scheduled event.
-   */
+  /** \copydoc Simulator::Stop(const Time&) */
+  virtual void Stop (Time const &delay) = 0;
+  /** \copydoc Simulator::Schedule(const Time&,const Ptr<EventImpl>&) */
+  virtual EventId Schedule (Time const &delay, EventImpl *event) = 0;
+  /** \copydoc Simulator::ScheduleWithContext(uint32_t,const Time&,EventImpl*) */
+  virtual void ScheduleWithContext (uint32_t context, Time const &delay, EventImpl *event) = 0;
+  /** \copydoc Simulator::ScheduleNow(const Ptr<EventImpl>&) */
   virtual EventId ScheduleNow (EventImpl *event) = 0;
-  /**
-   * Schedule an event to run at the end of the simulation, after
-   * the Stop() time or condition has been reached.
-   *
-   * \param event The event to schedule.
-   * \returns A unique identifier for the newly-scheduled event.
-   */
+  /** \copydoc Simulator::ScheduleDestroy(const Ptr<EventImpl>&) */
   virtual EventId ScheduleDestroy (EventImpl *event) = 0;
-  /**
-   * Remove an event from the event list. 
-   * 
-   * This method has the same visible effect as the 
-   * ns3::EventId::Cancel method
-   * but its algorithmic complexity is much higher: it has often 
-   * O(log(n)) complexity, sometimes O(n), sometimes worse.
-   * Note that it is not possible to remove events which were scheduled
-   * for the "destroy" time. Doing so will result in a program error (crash).
-   *
-   * \param id The event to remove from the list of scheduled events.
-   */
+  /** \copydoc Simulator::Remove */
   virtual void Remove (const EventId &id) = 0;
-  /**
-   * Set the cancel bit on this event: the event's associated function
-   * will not be invoked when it expires.
-   *
-   * This method has the same visible effect as the 
-   * ns3::Simulator::Remove method but its algorithmic complexity is 
-   * much lower: it has O(1) complexity.
-   * This method has the exact same semantics as ns3::EventId::Cancel.
-   * Note that it is not possible to cancel events which were scheduled
-   * for the "destroy" time. Doing so will result in a program error (crash).
-   * 
-   * \param id the event to cancel
-   */
+  /** \copydoc Simulator::Cancel */
   virtual void Cancel (const EventId &id) = 0;
-  /**
-   * Check if an event has already run or been cancelled.
-   *
-   * This method has O(1) complexity.
-   * Note that it is not possible to test for the expiration of
-   * events which were scheduled for the "destroy" time. Doing so
-   * will result in a program error (crash).
-   * An event is said to "expire" when it starts being scheduled
-   * which means that if the code executed by the event calls
-   * this function, it will get true.
-   *
-   * \param id The event to test for expiration.
-   * \returns \c true if the event has expired, false otherwise.
-   */
+  /** \copydoc Simulator::IsExpired */
   virtual bool IsExpired (const EventId &id) const = 0;
-  /**
-   * Run the simulation.
-   *
-   * The simulation will run until one of:
-   *   - No events are present anymore
-   *   - The user called Simulator::Stop
-   *   - The user called Simulator::Stop with a stop time and the
-   *     expiration time of the next event to be processed
-   *     is greater than or equal to the stop time.
-   */
+  /** \copydoc Simulator::Run */
   virtual void Run (void) = 0;
-  /**
-   * Return the current simulation virtual time.
-   *
-   * \returns The current virtual time.
-   */
+  /** \copydoc Simulator::Now */
   virtual Time Now (void) const = 0;
-  /**
-   * Get the remaining time until this event will execute.
-   *
-   * \param id The event id to analyse.
-   * \return The delay left until the input event id expires.
-   *          if the event is not running, this method returns
-   *          zero.
-   */
+  /** \copydoc Simulator::GetDelayLeft */
   virtual Time GetDelayLeft (const EventId &id) const = 0;
-  /**
-   * Get the maximum representable simulation time.
-   *
-   * \return The maximum simulation time at which an event 
-   *          can be scheduled.
-   *
-   * The returned value will always be bigger than or equal to Simulator::Now.
-   */
+  /** \copydoc Simulator::GetMaximumSimulationTime */
   virtual Time GetMaximumSimulationTime (void) const = 0;
   /**
    * Set the Scheduler to be used to manage the event list.
    *
-   * \param schedulerFactory A new event scheduler factory.
+   * \param [in] schedulerFactory A new event scheduler factory.
    *
    * The event scheduler can be set at any time: the events scheduled
    * in the previous scheduler will be transfered to the new scheduler
    * before we start to use it.
    */
   virtual void SetScheduler (ObjectFactory schedulerFactory) = 0;
-  /**
-   * Get the system id of this simulator.
-   *
-   * The system id is the identifier for this simulator instance
-   * in a distributed simulation.  For MPI this is the MPI rank.
-   * \return The system id for this simulator.
-   */
+  /** \copydoc Simulator::GetSystemId */
   virtual uint32_t GetSystemId () const = 0; 
-  /**
-   * Get the current simulation context.
-   *
-   * \return The current simulation context
-   */
+  /** \copydoc Simulator::GetContext */
   virtual uint32_t GetContext (void) const = 0;
 };
 
diff -Naur ns-3.23/src/core/model/singleton.h ns-3.24/src/core/model/singleton.h
--- ns-3.23/src/core/model/singleton.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/singleton.h	2015-09-15 11:18:44.000000000 -0700
@@ -20,16 +20,19 @@
 #ifndef SINGLETON_H
 #define SINGLETON_H
 
+#include "non-copyable.h"
+
+
 /**
  * \file
- * \ingroup core
+ * \ingroup access
  * ns3::Singleton declaration and template implementation.
  */
 
 namespace ns3 {
 
 /**
- * \ingroup core
+ * \ingroup access
  * \brief A template singleton
  *
  * This template class can be used to implement the singleton pattern.
@@ -39,14 +42,25 @@
  * For a singleton whose lifetime is bounded by the simulation run,
  * not the process, see SimulationSingleton.
  *
- * \note If you call Get() again after the object has
+ * To force your `class ExampleS` to be a singleton, inherit from Singleton:
+ * \code
+ *   class ExampleS : public Singleton<ExampleS> { ... };
+ * \endcode
+ *
+ * Then, to reach the singleton instance, just do
+ * \code
+ *   ExampleS::Get ()->...;
+ * \endcode
+ *
+ * \note
+ * If you call Get() again after the object has
  * been destroyed, the object will be re-created which will result in a
  * memory leak as reported by most memory leak checkers. It is up to the
  * user to ensure that Get() is never called from a static variable
  * finalizer.
  */
 template <typename T>
-class Singleton
+class Singleton : private NonCopyable
 {
 public:
   /**
@@ -59,28 +73,6 @@
    */
   static T *Get (void);
 
-private:
-
-  /**
-   * \name %Singleton pattern
-   * Private constructor, copy and assignment operator.
-   *
-   *  Note these do not have to be implemented, since they are
-   *  never called.
-   */
-  /**@{*/
-  /** Default constructor */
-  Singleton<T> (void);
-  
-  /** Copy constructor. */
-  Singleton<T> (const Singleton<T> &);
-  /**
-   * Assignment.
-   * \returns The Singleton.
-   */
-  Singleton<T> operator = (const Singleton<T> &);
-  /**@}*/
-
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/core/model/synchronizer.h ns-3.24/src/core/model/synchronizer.h
--- ns-3.23/src/core/model/synchronizer.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/synchronizer.h	2015-09-15 11:18:44.000000000 -0700
@@ -24,8 +24,8 @@
 #include "object.h"
 
 /**
- * \file
- * \ingroup realtime
+ * @file
+ * @ingroup realtime
  * ns3::Synchronizer declaration.
  */
 
@@ -53,7 +53,7 @@
 public:
   /**
    * Get the registered TypeId for this class.
-   * \returns The TypeId.
+   * @returns The TypeId.
    */
   static TypeId GetTypeId (void);
 
@@ -68,7 +68,7 @@
    *
    * The simulator sometimes needs to know this.
    *
-   * @returns \c true if locked with realtime, \c false if not.
+   * @returns @c true if locked with realtime, @c false if not.
    */
   bool Realtime (void);
 
@@ -95,7 +95,7 @@
    * virtual method to do the actual real-time-clock-specific work
    * of making the correspondence mentioned above.
    *
-   * @param ts The simulation time we should use as the origin (in
+   * @param [in] ts The simulation time we should use as the origin (in
    *     Time resolution units).
    * @see DoSetOrigin
    */
@@ -115,7 +115,7 @@
    * synchronize the simulation and the simulation time (in
    * Time resolution units).
    *
-   * @param ts Simulation time in Time resolution units.
+   * @param [in] ts Simulation time in Time resolution units.
    * @returns Simulation Time (in Time resolution units)
    *     minus the origin time (stored internally in nanosecond units).
    * @see SetOrigin
@@ -127,7 +127,7 @@
    * @brief Wait until the real time is in sync with the specified simulation
    * time or until the synchronizer is Sigalled.
    *
-   * This is where the real work of synchronization is done.  The \c tsCurrent
+   * This is where the real work of synchronization is done.  The @c tsCurrent
    * argument is the simulation time.  The job of Synchronize is to
    * translate from simulation time to synchronizer time (in a perfect world
    * this is the same time) and then figure out how long in real-time it needs
@@ -138,11 +138,11 @@
    * (either busy-waiting or sleeping, or some combination thereof) until the
    * requested simulation time.
    *
-   * @param tsCurrent The current simulation time (in Time resolution units).
-   * @param tsDelay The simulation time we need to wait for (in Time
+   * @param [in] tsCurrent The current simulation time (in Time resolution units).
+   * @param [in] tsDelay The simulation time we need to wait for (in Time
    *     resolution units).
-   * @returns \c true if the function ran to completion,
-   *          \c false if it was interrupted by a Signal.
+   * @returns @c true if the function ran to completion,
+   *          @c false if it was interrupted by a Signal.
    * @see DoSynchronize
    * @see Signal
    */
@@ -212,14 +212,14 @@
    * for example, this is where the differences between Time parameters and
    * parameters to clock_nanosleep would be dealt with. 
    *
-   * @param ns The simulation time we need to use as the origin (normalized to
+   * @param [in] ns The simulation time we need to use as the origin (normalized to
    *    nanosecond units).
    * @see SetOrigin
    */
   virtual void DoSetOrigin (uint64_t ns) = 0;
 
   /**
-   * @brief Return \c true if this synchronizer is actually synchronizing to a
+   * @brief Return @c true if this synchronizer is actually synchronizing to a
    * realtime clock.
    *
    * The simulator sometimes needs to know this.
@@ -227,7 +227,7 @@
    * Subclasses are expected to implement this method to tell the outside world
    * whether or not they are synchronizing to a realtime clock.
    *
-   * @returns \c true if locked with realtime, \c false if not.
+   * @returns @c true if locked with realtime, @c false if not.
    */
   virtual bool DoRealtime (void) = 0;
 
@@ -248,7 +248,7 @@
    * time.
    *
    * This is where the real work of synchronization is done.  The
-   * \c nsCurrent argument is the simulation time (in ns).  The job of
+   * @c nsCurrent argument is the simulation time (in ns).  The job of
    * DoSynchronize is to translate from simulation time to synchronizer time
    * (in a perfect world these are the same time) and then figure out
    * how long in real-time it needs to wait until that
@@ -258,11 +258,11 @@
    * real-time-clock-specific work of waiting (either busy-waiting or sleeping,
    * or some combination) until the requested simulation time.
    *
-   * @param nsCurrent The current simulation time (in nanosecond units).
-   * @param nsDelay The simulation time we need to wait for (normalized to 
+   * @param [in] nsCurrent The current simulation time (in nanosecond units).
+   * @param [in] nsDelay The simulation time we need to wait for (normalized to 
    * nanosecond units).
-   * @returns \c true if the function ran to completion,
-   *          \c false if it was interrupted by a Signal.
+   * @returns @c true if the function ran to completion,
+   *          @c false if it was interrupted by a Signal.
    * @see Synchronize
    * @see Signal
    */
@@ -290,7 +290,7 @@
    * @brief Get the drift between the real time clock used to synchronize
    * the simulation and the current simulation time.
    *
-   * @param ns Simulation time in ns.
+   * @param [in] ns Simulation time in ns.
    * @returns Drift in ns units.
    * @see SetOrigin
    * @see GetDrift
@@ -320,7 +320,7 @@
    * @brief Convert a simulator time step (in Time resolution units)
    * to a normalized time step in nanosecond units.
    *
-   * @param ts The simulation time step to be normalized.
+   * @param [in] ts The simulation time step to be normalized.
    * @returns The simulation time step normalized to nanosecond units.
    */
   uint64_t TimeStepToNanosecond (uint64_t ts);
@@ -329,7 +329,7 @@
    * @brief Convert a normalized nanosecond time step into a
    * simulator time step (in Time resolution units).
    *
-   * @param ns The nanosecond count step to be converted
+   * @param [in] ns The nanosecond count step to be converted
    * @returns The simulation time step to be interpreted in appropriate units.
    */
   uint64_t NanosecondToTimeStep (uint64_t ns);
diff -Naur ns-3.23/src/core/model/system-condition.h ns-3.24/src/core/model/system-condition.h
--- ns-3.23/src/core/model/system-condition.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/system-condition.h	2015-09-15 11:18:44.000000000 -0700
@@ -75,7 +75,7 @@
 
   /**
    * Set the value of the underlying condition.
-   * @param condition value
+   * @param [in] condition value
    */
   void SetCondition (bool condition);
 
@@ -106,8 +106,8 @@
   /**
    * Wait a maximum of ns nanoseconds for the condition to be true.  If the
    * wait times out, return true else return false.
-   * @param ns maximum of nanoseconds to wait
-   * @returns true if the timer expired, otherwise return false.
+   * @param [in] ns maximum of nanoseconds to wait
+   * @returns \c true if the timer expired, otherwise return \c false.
    */
   bool TimedWait (uint64_t ns);
 	
diff -Naur ns-3.23/src/core/model/system-path.cc ns-3.24/src/core/model/system-path.cc
--- ns-3.23/src/core/model/system-path.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/system-path.cc	2015-09-15 11:18:44.000000000 -0700
@@ -82,7 +82,7 @@
  * This is an internal function (by virtue of not being
  * declared in a \c .h file); the public API is FindSelfDirectory().
  * 
- * \param path The full path to a file.
+ * \param [in] path The full path to a file.
  * \returns The full path to the containing directory.
  */
 std::string Dirname (std::string path)
diff -Naur ns-3.23/src/core/model/system-path.h ns-3.24/src/core/model/system-path.h
--- ns-3.23/src/core/model/system-path.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/system-path.h	2015-09-15 11:18:44.000000000 -0700
@@ -51,7 +51,7 @@
    * \ingroup systempath
    * Get the file system path to the current executable.
    *
-   * \return the directory in which the currently-executing binary is located
+   * \return The directory in which the currently-executing binary is located
    */
   std::string FindSelfDirectory (void);
   
@@ -59,9 +59,9 @@
    * \ingroup systempath
    * Join two file system path elements.
    *
-   * \param left a path element
-   * \param right a path element
-   * \return a concatenation of the two input paths
+   * \param [in] left A path element
+   * \param [in] right A path element
+   * \return A concatenation of the two input paths
    */
   std::string Append (std::string left, std::string right);
 
@@ -72,8 +72,8 @@
    *
    * This is the inverse of Join.
    *
-   * \param path a path
-   * \return a list of path elements that can be joined together again with
+   * \param [in] path A path
+   * \return A list of path elements that can be joined together again with
    *         the Join function.
    * \sa ns3::SystemPath::Join
    */
@@ -86,9 +86,9 @@
    * This is the inverse of Split.
    *
    * \ingroup systempath
-   * \param begin iterator to first element to join
-   * \param end iterator to last element to join
-   * \return a path that is a concatenation of all the input elements.
+   * \param [in] begin Iterator to first element to join
+   * \param [in] end Iterator to last element to join
+   * \return A path that is a concatenation of all the input elements.
    */
   std::string Join (std::list<std::string>::const_iterator begin,
 		    std::list<std::string>::const_iterator end);
@@ -97,8 +97,8 @@
    * \ingroup systempath
    * Get the list of files located in a file system directory.
    *
-   * \param path a path which identifies a directory
-   * \return a list of the filenames which are located in the input directory
+   * \param [in] path A path which identifies a directory
+   * \return A list of the filenames which are located in the input directory
    */
   std::list<std::string> ReadFiles (std::string path);
 
@@ -110,7 +110,7 @@
    * Call ns3::SystemPath::MakeDirectories to create it. Yes, there is a
    * well-known security race in this API but we don't care in ns-3.
    *
-   * \return a path which identifies a temporary directory.
+   * \return A path which identifies a temporary directory.
    */
   std::string MakeTemporaryDirectoryName (void);
 
@@ -118,7 +118,7 @@
    * \ingroup systempath
    * Create all the directories leading to path.
    *
-   * \param path a path to a directory
+   * \param [in] path A path to a directory
    */
   void MakeDirectories (std::string path);
 
diff -Naur ns-3.23/src/core/model/system-thread.h ns-3.24/src/core/model/system-thread.h
--- ns-3.23/src/core/model/system-thread.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/system-thread.h	2015-09-15 11:18:44.000000000 -0700
@@ -112,7 +112,7 @@
    * method provided to do this is Join(). If you call Join() you will block
    * until the SystemThread run method returns.
    *
-   * @param callback entry point of the thread
+   * @param [in] callback entry point of the thread
    * 
    * @warning I've made the system thread class look like a normal ns3 object
    * with smart pointers, and living in the heap.  This makes it very easy to
@@ -144,7 +144,7 @@
   /**
    * @brief Returns the current thread Id.
    *
-   * @returns current thread Id. 
+   * @returns Current thread Id. 
    */
   static ThreadId Self(void);
 
@@ -152,7 +152,7 @@
    * @brief Compares an ThreadId with the current ThreadId .
    *
    * @param [in] id The ThreadId to compare to.
-   * @returns true if @c id matches the current ThreadId.
+   * @returns @c true if @c id matches the current ThreadId.
    */
   static bool Equals(ThreadId id);
 
diff -Naur ns-3.23/src/core/model/system-wall-clock-ms.h ns-3.24/src/core/model/system-wall-clock-ms.h
--- ns-3.23/src/core/model/system-wall-clock-ms.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/system-wall-clock-ms.h	2015-09-15 11:18:44.000000000 -0700
@@ -32,8 +32,8 @@
 namespace ns3 {
 
 /**
- * @ingroup core
- * @defgroup system System Services
+ * \ingroup core
+ * \defgroup system System Services
  *
  * System-independent interfaces to operating system services:
  * files system, threading, wall clock time.
diff -Naur ns-3.23/src/core/model/test.cc ns-3.24/src/core/model/test.cc
--- ns-3.23/src/core/model/test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -19,6 +19,7 @@
 #include "test.h"
 #include "assert.h"
 #include "abort.h"
+#include "singleton.h"
 #include "system-path.h"
 #include "log.h"
 #include <cmath>
@@ -66,18 +67,39 @@
   return true;
 } 
 
+/**
+ * \ingroup testingimpl
+ * Container for details of a test failure.
+ */
 struct TestCaseFailure
 {
+  /**
+   * Constructor.
+   *
+   * \param [in] _cond    The name of the condition being tested.
+   * \param [in] _actual  The actual value returned by the test.
+   * \param [in] _limit   The expected value.
+   * \param [in] _message The associated message.
+   * \param [in] _file    The soure file.
+   * \param [in] _line    The source line.
+   */
   TestCaseFailure (std::string _cond, std::string _actual, 
                    std::string _limit, std::string _message, 
                    std::string _file, int32_t _line);
-  std::string cond;
-  std::string actual;
-  std::string limit;
-  std::string message; 
-  std::string file;
-  int32_t line;
+  std::string cond;    /**< The name of the condition being tested. */
+  std::string actual;  /**< The actual value returned by the test. */
+  std::string limit;   /**< The expected value. */
+  std::string message; /**< The associated message. */
+  std::string file;    /**< The soure file. */
+  int32_t line;        /**< The source line. */
 };
+/**
+ * Output streamer for TestCaseFailure.
+ *
+ * \param [in,out] os The output stream.
+ * \param [in] failure The TestCaseFailure to print.
+ * \returns The stream.
+ */
 std::ostream & operator << (std::ostream & os, const TestCaseFailure & failure)
 {
   os << "    test=\""  << failure.cond
@@ -90,58 +112,143 @@
   return os;
 }
 
+/**
+ * \ingroup testingimpl
+ * Container for results from a TestCase.
+ */
 struct TestCase::Result
 {
+  /** Constructor. */
   Result ();
+
+  /** Test running time. */
   SystemWallClockMs clock;
+  /** TestCaseFailure records for each child. */
   std::vector<TestCaseFailure> failure;
+  /** \c true if any child TestCases failed. */
   bool childrenFailed;
 };
 
-class TestRunnerImpl
+/**
+ * \ingroup testingimpl
+ * Container for all tests.
+ */
+class TestRunnerImpl : public Singleton<TestRunnerImpl>
 {
 public:
+  /** Constructor. */
+  TestRunnerImpl ();
+  
+  /**
+   * Add a new top-level TestSuite.
+   * \param [in] testSuite The new TestSuite.
+   */
   void AddTestSuite (TestSuite *testSuite);
-  void StartTestCase (std::string name);
-  void EndTestCase (void);
-  void ReportTestFailure (std::string cond, std::string actual, 
-                      std::string limit, std::string message, 
-                      std::string file, int32_t line);
+  /** \copydoc TestCase::MustAssertOnFailure() */
   bool MustAssertOnFailure (void) const;
+  /** \copydoc TestCase::MustContinueOnFailure() */
   bool MustContinueOnFailure (void) const;
+  /**
+   * Check if this run should update the reference data.
+   * \return \c true if we should update the reference data.
+   */
   bool MustUpdateData (void) const;
+  /**
+   * Get the path to the root of the source tree.
+   *
+   * The root directory is defined by the presence of two files:
+   * "VERSION" and "LICENSE".
+   *
+   * \returns The path to the root.
+   */
   std::string GetTopLevelSourceDir (void) const;
+  /**
+   * Get the path to temporary directory.
+   * \return The temporary directory path.
+   */
   std::string GetTempDir (void) const;
-
+  /** \copydoc TestRunner::Run() */
   int Run (int argc, char *argv[]);
 
-  static TestRunnerImpl *Instance (void);
-
 private:
-  TestRunnerImpl ();
-  ~TestRunnerImpl ();
 
+  /**
+   * Check if this is the root of the source tree.
+   * \param [in] path The path to test.
+   * \returns \c true if \p path is the root.
+   */
   bool IsTopLevelSourceDir (std::string path) const;
+  /**
+   * Clean up characters not allowed in XML.
+   *
+   * XML files have restrictions on certain characters that may be present in
+   * data.  We need to replace these characters with their alternate 
+   * representation on the way into the XML file.
+   *
+   * Specifically, we make these replacements:
+   *    Raw Source | Replacement
+   *    :--------: | :---------:
+   *    '<'        | "&lt;"
+   *    '>'        | "&gt;"
+   *    '&'        | "&amp;"
+   *    '"'        | "&39;"
+   *    '\'        | "&quot;"
+   *
+   * \param [in] xml The raw string.
+   * \returns The sanitized string.
+   */
   std::string ReplaceXmlSpecialCharacters (std::string xml) const;
+  /**
+   * Print the test report.
+   *
+   * \param [in] test The TestCase to print.
+   * \param [in,out] os The output stream.
+   * \param [in] xml Generate XML output if \c true.
+   * \param [in] level Indentation level.
+   */
   void PrintReport (TestCase *test, std::ostream *os, bool xml, int level);
+  /**
+   * Print the list of all requested test suites.
+   *
+   * \param [in] begin Iterator to the first TestCase to print.
+   * \param [in] end Iterator to the end of the list.
+   * \param [in] printTestType Preprend the test type label if \c true.
+   */
   void PrintTestNameList (std::list<TestCase *>::const_iterator begin, 
                           std::list<TestCase *>::const_iterator end,
                           bool printTestType) const;
+  /** Print the list of test types. */
   void PrintTestTypeList (void) const;
+  /**
+   * Print the help text.
+   * \param [in] programName The name of the invoking program.
+   */
   void PrintHelp (const char *programName) const;
+  /**
+   * Generate the list of tests matching the constraints.
+   *
+   * Test name and type contraints are or'ed.  The duration constraint
+   * is and'ed.
+   *
+   * \param [in] testName Include a specific test by name.
+   * \param [in] testType Include all tests of give type.
+   * \param [in] maximumTestDuration Restrict to tests shorter than this.
+   * \returns The list of tests matching the filter constraints.
+   */
   std::list<TestCase *> FilterTests (std::string testName,
                                      enum TestSuite::Type testType,
                                      enum TestCase::TestDuration maximumTestDuration);
 
 
+  /** Container type for the test. */
   typedef std::vector<TestSuite *> TestSuiteVector;
 
-  TestSuiteVector m_suites;
-  std::string m_tempDir;
-  bool m_verbose;
-  bool m_assertOnFailure;
-  bool m_continueOnFailure;
-  bool m_updateData;
+  TestSuiteVector m_suites;  //!< The list of tests.
+  std::string m_tempDir;     //!< The temporary directory.
+  bool m_verbose;            //!< Produce verbose output.
+  bool m_assertOnFailure;    //!< \c true if we should assert on failure.
+  bool m_continueOnFailure;  //!< \c true if we should continue on failure.
+  bool m_updateData;         //!< \c true if we should update reference data.
 };
 
 
@@ -189,34 +296,42 @@
 void
 TestCase::AddTestCase (TestCase *testCase, enum TestCase::TestDuration duration)
 {
-  // Record this for use later when all test cases are run.
-  testCase->m_duration = duration;
+  NS_LOG_FUNCTION (&testCase << duration);
 
-  NS_LOG_FUNCTION (&testCase);
-  m_children.push_back (testCase);
-  testCase->m_parent = this;
-
-  std::string::size_type slash, antislash;
-  slash = testCase->m_name.find ("/");
-  antislash = testCase->m_name.find ("\\");
-  if (slash != std::string::npos || antislash != std::string::npos)
-    {
-      std::string fullname = testCase->m_name;
-      TestCase *current = testCase->m_parent;
-      while (current != 0)
-        {
-          fullname = current->m_name + "/" + fullname;
-          current = current->m_parent;
-        }
-      if (slash != std::string::npos)
-        {
-          NS_FATAL_ERROR ("Invalid test name: cannot contain slashes: \"" << fullname << "\"");
-        }
-      if (antislash != std::string::npos)
-        {
-          NS_FATAL_ERROR ("Invalid test name: cannot contain antislashes: \"" << fullname << "\"");
-        }
+  // Test names are used to create temporary directories,
+  // so we test for illegal characters.
+  //
+  // Windows: <>:"/\|?*
+  //   http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx
+  // Mac:     : (deprecated, was path separator in Mac OS Classic, pre X)
+  // Unix:    / (and .. may give trouble?)
+  //
+  // The Windows list is too restrictive:  we like to label
+  // tests with "val = v1 * v2" or "v1 < 3" or "case: foo --> bar"
+  // So we allow ':<>*" 
+
+  std::string badchars = "\"/\\|?";
+  // Badchar Class  Regex          Count of failing test names
+  // All            ":<>\"/\\|?*"  611
+  // Allow ':'      "<>\"/\\|?*"   128
+  // Allow ':<>'    "\"/\\|?*"      12
+  // Allow ':<>*'    "\"/\\|?"       0
+
+  std::string::size_type badch = testCase->m_name.find_first_of (badchars);
+  if (badch != std::string::npos)
+    {
+      /*
+        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
+      */
+      NS_LOG_UNCOND ("Invalid test name: cannot contain any of '"
+                      << badchars << "': " << testCase->m_name);
     }
+
+  testCase->m_duration = duration;
+  testCase->m_parent = this;
+  m_children.push_back (testCase);
 }
 
 bool
@@ -368,7 +483,7 @@
     m_type (type)
 {
   NS_LOG_FUNCTION (this << name << type);
-  TestRunnerImpl::Instance ()->AddTestSuite (this);
+  TestRunnerImpl::Get ()->AddTestSuite (this);
 }
 
 TestSuite::Type 
@@ -393,21 +508,6 @@
   NS_LOG_FUNCTION (this);
 }
 
-TestRunnerImpl::~TestRunnerImpl ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-
-
-TestRunnerImpl *
-TestRunnerImpl::Instance (void)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  static TestRunnerImpl runner;
-  return &runner;
-}
-
 void
 TestRunnerImpl::AddTestSuite (TestSuite *testSuite)
 {
@@ -525,9 +625,15 @@
   return result;
 }
 
+/** Helper to indent output a specified number of steps. */
 struct Indent
 {
+  /**
+   * Constructor.
+   * \param [in] level The number of steps.  A step is "  ".
+   */
   Indent (int level);
+  /** The number of steps. */
   int level;
 };
 Indent::Indent (int _level)
@@ -535,6 +641,12 @@
 {
   NS_LOG_FUNCTION (this << _level);
 }
+/**
+ * Output streamer for Indent.
+ * \param [in,out] os The output stream.
+ * \param [in] val The Indent object.
+ * \returns The stream.
+ */
 std::ostream &operator << (std::ostream &os, const Indent &val)
 {
   for (int i = 0; i < val.level; i++)
@@ -976,7 +1088,7 @@
 TestRunner::Run (int argc, char *argv[])
 {
   NS_LOG_FUNCTION (argc << argv);
-  return TestRunnerImpl::Instance ()->Run (argc, argv);
+  return TestRunnerImpl::Get ()->Run (argc, argv);
 }
 
 } // namespace ns3
diff -Naur ns-3.23/src/core/model/test.h ns-3.24/src/core/model/test.h
--- ns-3.23/src/core/model/test.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/test.h	2015-09-15 11:18:44.000000000 -0700
@@ -28,12 +28,14 @@
 #include <limits>
 #include <stdint.h>
 
+#include "non-copyable.h"
 #include "system-wall-clock-ms.h"
 
 /**
  * \file
  * \ingroup testing
- * Definition of the testing macros and declaration of the testing classes.
+ * \brief Definition of the testing macros and declaration of
+ * the testing classes.
  */
 
 /**
@@ -54,11 +56,11 @@
 // 
 // Note on below macros:
 //
-// When multiple statements are used in a macro, they should be bound together 
-// in a loop syntactically, so the macro can appear safely inside if clauses 
-// or other places that expect a single statement or a statement block.  The
-// "strange" do while construct is a generally expected best practice for
-// defining a robust macro.
+// When multiple statements are used in a macro, they should be bound
+// together in a loop syntactically, so the macro can appear safely
+// inside if clauses or other places that expect a single statement or
+// a statement block.  The "strange" do while construct is a generally
+// expected best practice for defining a robust macro.
 //
 
 /**
@@ -130,13 +132,14 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are equal and report
- * and abort if not.
+ * \brief Test that an actual and expected (limit) value are equal and
+ * report and abort if not.
  *
- * Check to see if the expected (limit) value is equal to the actual value found
- * in a test case.  If the two values are equal nothing happens, but if the 
- * comparison fails, an error is reported in a consistent way and the execution
- * of the current test case is aborted.
+ * Check to see if the expected (limit) value is equal to the actual
+ * value found in a test case.  If the two values are equal nothing
+ * happens, but if the comparison 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, for example:
  *
@@ -147,13 +150,13 @@
  *
  * is legal.
  * 
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the expected value of the test.
- * \param 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) as it is unlikely to do what you expect.  Use 
- * NS_TEST_ASSERT_MSG_EQ_TOL instead.
+ * \param [in] actual Expression for the actual value found during the test.
+ * \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) 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__)
@@ -174,7 +177,7 @@
         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);                   \
@@ -185,13 +188,14 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are equal and report
- * and abort if not.
+ * \brief Test that an actual and expected (limit) value are equal and
+ * report and abort if not.
  *
- * Check to see if the expected (limit) value is equal to the actual value found
- * in a test case.  If the two values are equal nothing happens, but if the 
- * comparison fails, an error is reported in a consistent way and the execution
- * of the current test case is aborted.
+ * Check to see if the expected (limit) value is equal to the actual
+ * value found in a test case.  If the two values are equal nothing
+ * happens, but if the comparison 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, for example:
  *
@@ -202,13 +206,13 @@
  *
  * is legal.
  * 
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the expected value of the test.
- * \param 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) as it is unlikely to do what you expect.  Use 
- * NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL_TOL instead.
+ * \param [in] actual Expression for the actual value found during the test.
+ * \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) as it is unlikely to do what you expect.
+ * Use NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL_TOL instead.
  *
  * This function returns a boolean value.
  *
@@ -218,11 +222,11 @@
 
 /**
  * \ingroup testingimpl
- * \brief Test that an actual and expected (limit) value are equal and report
- * if not.
+ * \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.
+ * 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)  \
   do {                                                                  \
@@ -235,7 +239,7 @@
         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);                   \
@@ -245,13 +249,14 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are equal and report
- * if not.
+ * \brief Test that an actual and expected (limit) value are equal and
+ * report if not.
  *
- * Check to see if the expected (lmit) value is equal to the actual value found
- * in a test case.  If the two values are equal nothing happens, but if the 
- * comparison fails, an error is reported in a consistent way.  EXPECT* macros
- * do not return if an error is detected.
+ * Check to see if the expected (lmit) value is equal to the actual
+ * value found in a test case.  If the two values are equal nothing
+ * happens, but if the comparison fails, an error is reported in a
+ * consistent way.  EXPECT* macros do not return if an error is
+ * detected.
  *
  * The message is interpreted as a stream, for example:
  *
@@ -262,13 +267,13 @@
  *
  * is legal.
  * 
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the expected value of the test.
- * \param 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) as it is unlikely to do what you expect.  Use 
- * NS_TEST_EXPECT_MSG_EQ_TOL instead.
+ * \param [in] actual Expression for the actual value found during the test.
+ * \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) 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__)
@@ -280,8 +285,8 @@
 
 /**
  * \ingroup testingimpl
- * \brief Test that actual and expected (limit) values are equal to plus
- * or minus some tolerance and report and abort if not.
+ * \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) \
   do {                                                                  \
@@ -299,7 +304,7 @@
                    << " (limit) + " << #tol << " (tol) && "             \
                    << #actual << " (actual) > " << #limit               \
                    << " (limit) - " << #tol << " (tol)";                \
-        ReportTestFailure (condStream.str (), actualStream.str (),          \
+        ReportTestFailure (condStream.str (), actualStream.str (),      \
                        limitStream.str (), msgStream.str (),            \
                        file, line);                                     \
         CONTINUE_ON_FAILURE;                                            \
@@ -309,63 +314,69 @@
 /**
  * \ingroup testing
  *
- * \brief Test that actual and expected (limit) values are equal to plus
- * or minus some tolerance and report and abort if not.
+ * \brief Test that actual and expected (limit) values are equal to
+ * plus or minus some tolerance and report and abort if not.
  *
- * Check to see if the expected (limit) value is equal to the actual value found
- * in a test case to some tolerance.  This is not the same thing as asking if
- * two floating point are equal to within some epsilon, but is useful for that
- * case.  This assertion is geared toward more of a measurement problem.
- * Consider measuring a physical rod of some kind that you have ordered.
- * You need to determine if it is "good."  You want to measure the rod
- * to an arbitrary precision of sixteen significant figures, you will
+ * Check to see if the expected (limit) value is equal to the actual
+ * value found in a test case to some tolerance.  This is not the same
+ * thing as asking if two floating point are equal to within some
+ * epsilon, but is useful for that case.  This assertion is geared
+ * toward more of a measurement problem.  Consider measuring a
+ * physical rod of some kind that you have ordered.  You need to
+ * determine if it is "good."  You want to measure the rod to an
+ * arbitrary precision of sixteen significant figures, you will
  * measure the rod to determine if its length is within the tolerances
  * you provided.  For example, 12.00 inches plus or minus .005 inch
  * may be just fine.
  * 
- * In ns-3, you might want to measure a signal to noise ratio and check to see
- * if the answer is what you expect.  If you naively measure (double)1128.93 and
- * compare this number with a constant 1128.93 you are almost certainly going to
- * have your test fail because of floating point rounding errors.  We provide a
- * floating point comparison function ns3::TestDoubleIsEqual() but you will 
- * probably quickly find that is not what you want either.  It may turn out to
- * be the case that when you measured an snr that printed as 1128.93, what was 
- * actually measured was something more like 1128.9287653857625442 for example.
- * Given that the double epsilon is on the order of 0.0000000000000009,
- * you would need to provide sixteen significant figures of expected value
- * for this kind of test to pass even with a typical test for floating point
- * "approximate equality."  That is clearly not required or desired.
- * You really want to be able to provide 1128.93 along with a tolerance
- * just like you provided 12 inches +- 0.005 inch above.
- *
- * This assertion is designed for real measurements by taking into account
- * measurement tolerances.  By doing so it also automatically compensates for 
- * floating point rounding errors.    If you really want to check floating point
- * equality down to the numeric_limits<double>::epsilon () range, consider
- * using ns3::TestDoubleIsEqual().
+ * In ns-3, you might want to measure a signal to noise ratio and
+ * check to see if the answer is what you expect.  If you naively
+ * measure (double)1128.93 and compare this number with a constant
+ * 1128.93 you are almost certainly going to have your test fail
+ * because of floating point rounding errors.  We provide a floating
+ * point comparison function ns3::TestDoubleIsEqual() but you will
+ * probably quickly find that is not what you want either.  It may
+ * turn out to be the case that when you measured an snr that printed
+ * as 1128.93, what was actually measured was something more like
+ * 1128.9287653857625442 for example.  Given that the double epsilon
+ * is on the order of 0.0000000000000009, you would need to provide
+ * sixteen significant figures of expected value for this kind of test
+ * to pass even with a typical test for floating point "approximate
+ * equality."  That is clearly not required or desired.  You really
+ * want to be able to provide 1128.93 along with a tolerance just like
+ * you provided 12 inches +- 0.005 inch above.
+ *
+ * This assertion is designed for real measurements by taking into
+ * account measurement tolerances.  By doing so it also automatically
+ * compensates for floating point rounding errors.  If you really want
+ * to check floating point equality down to the
+ * numeric_limits<double>::epsilon () range, consider using
+ * ns3::TestDoubleIsEqual().
  *
- * \note Mixing signed and unsigned types can lead to misleading results.
+ * \note Mixing signed and unsigned types can lead to misleading
+ * results.
  *
  * The message is interpreted as a stream, for example:
  *
  * \code
- * NS_TEST_ASSERT_MSG_EQ_TOL (snr, 1128.93, 0.005, "wrong snr (" << snr << ") in test");
+ *   NS_TEST_ASSERT_MSG_EQ_TOL (snr, 1128.93, 0.005,
+ *                              "wrong snr (" << snr << ") in test");
  * \endcode
  *
  * is legal.
  * 
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the expected value of the test.
- * \param tol Tolerance of the test.
- * \param msg Message that is output if the test does not pass.
+ * \param [in] actual Expression for the actual value found during the test.
+ * \param [in] limit Expression for the expected value of the test.
+ * \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.
+ * \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) \
   do {                                                                  \
@@ -383,7 +394,7 @@
                    << " (limit) + " << #tol << " (tol) && "             \
                    << #actual << " (actual) > " << #limit               \
                    << " (limit) - " << #tol << " (tol)";                \
-        ReportTestFailure (condStream.str (), actualStream.str (),          \
+        ReportTestFailure (condStream.str (), actualStream.str (),      \
                        limitStream.str (), msgStream.str (),            \
                        file, line);                                     \
         CONTINUE_ON_FAILURE_RETURNS_BOOL;                               \
@@ -393,69 +404,75 @@
 /**
  * \ingroup testing
  *
- * \brief Test that actual and expected (limit) values are equal to plus
- * or minus some tolerance and report and abort if not.
+ * \brief Test that actual and expected (limit) values are equal to
+ * plus or minus some tolerance and report and abort if not.
  *
- * Check to see if the expected (limit) value is equal to the actual value found
- * in a test case to some tolerance.  This is not the same thing as asking if
- * two floating point are equal to within some epsilon, but is useful for that
- * case.  This assertion is geared toward more of a measurement problem.
- * Consider measuring a physical rod of some kind that you have ordered.
- * You need to determine if it is "good."  You want to measure the rod
- * to an arbitrary precision of sixteen significant figures, you will
+ * Check to see if the expected (limit) value is equal to the actual
+ * value found in a test case to some tolerance.  This is not the same
+ * thing as asking if two floating point are equal to within some
+ * epsilon, but is useful for that case.  This assertion is geared
+ * toward more of a measurement problem.  Consider measuring a
+ * physical rod of some kind that you have ordered.  You need to
+ * determine if it is "good."  You want to measure the rod to an
+ * arbitrary precision of sixteen significant figures, you will
  * measure the rod to determine if its length is within the tolerances
  * you provided.  For example, 12.00 inches plus or minus .005 inch
  * may be just fine.
  * 
- * In ns-3, you might want to measure a signal to noise ratio and check to see
- * if the answer is what you expect.  If you naively measure (double)1128.93 and
- * compare this number with a constant 1128.93 you are almost certainly going to
- * have your test fail because of floating point rounding errors.  We provide a
- * floating point comparison function ns3::TestDoubleIsEqual() but you will 
- * probably quickly find that is not what you want either.  It may turn out to
- * be the case that when you measured an snr that printed as 1128.93, what was 
- * actually measured was something more like 1128.9287653857625442 for example.
- * Given that the double epsilon is on the order of 0.0000000000000009,
- * you would need to provide sixteen significant figures of expected value
- * for this kind of test to pass even with a typical test for floating point
- * "approximate equality."  That is clearly not required or desired.
- * You really want to be able to provide  1128.93 along with a tolerance
- * just like you provided 12 inches +- 0.005 inch above.
- *
- * This assertion is designed for real measurements by taking into account
- * measurement tolerances.  By doing so it also automatically compensates for 
- * floating point rounding errors.    If you really want to check floating point
- * equality down to the numeric_limits<double>::epsilon () range,
- * consider using ns3::TestDoubleIsEqual().
+ * In ns-3, you might want to measure a signal to noise ratio and
+ * check to see if the answer is what you expect.  If you naively
+ * measure (double)1128.93 and compare this number with a constant
+ * 1128.93 you are almost certainly going to have your test fail
+ * because of floating point rounding errors.  We provide a floating
+ * point comparison function ns3::TestDoubleIsEqual() but you will
+ * probably quickly find that is not what you want either.  It may
+ * turn out to be the case that when you measured an snr that printed
+ * as 1128.93, what was actually measured was something more like
+ * 1128.9287653857625442 for example.  Given that the double epsilon
+ * is on the order of 0.0000000000000009, you would need to provide
+ * sixteen significant figures of expected value for this kind of test
+ * to pass even with a typical test for floating point "approximate
+ * equality."  That is clearly not required or desired.  You really
+ * want to be able to provide 1128.93 along with a tolerance just like
+ * you provided 12 inches +- 0.005 inch above.
+ *
+ * This assertion is designed for real measurements by taking into
+ * account measurement tolerances.  By doing so it also automatically
+ * compensates for floating point rounding errors.  If you really want
+ * to check floating point equality down to the
+ * numeric_limits<double>::epsilon () range, consider using
+ * ns3::TestDoubleIsEqual().
  *
- * \note Mixing signed and unsigned types can lead to misleading results.
+ * \note Mixing signed and unsigned types can lead to misleading
+ * results.
  *
  * The message is interpreted as a stream, for example:
  *
  * \code
- * NS_TEST_ASSERT_MSG_EQ_TOL_RETURNS_BOOL (snr, 1128.93, 0.005, "wrong snr (" << snr << ") in test");
+ *   NS_TEST_ASSERT_MSG_EQ_TOL_RETURNS_BOOL (snr, 1128.93, 0.005,
+ *                                           "wrong snr (" << snr << ") in test");
  * \endcode
  *
  * is legal.
  * 
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the expected value of the test.
- * \param tol Tolerance of the test.
- * \param msg Message that is output if the test does not pass.
+ * \param [in] actual Expression for the actual value found during the test.
+ * \param [in] limit Expression for the expected value of the test.
+ * \param [in] tol Tolerance of the test.
+ * \param [in] msg Message that is output if the test does not pass.
  *
  * This function returns a boolean value.
  *
  */
-#define NS_TEST_ASSERT_MSG_EQ_TOL_RETURNS_BOOL(actual, limit, tol, msg)                 \
+#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.
+ * \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.
+ * 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) \
   do {                                                                  \
@@ -473,7 +490,7 @@
                    << " (limit) + " << #tol << " (tol) && "             \
                    << #actual << " (actual) > " << #limit               \
                    << " (limit) - " << #tol << " (tol)";                \
-        ReportTestFailure (condStream.str (), actualStream.str (),          \
+        ReportTestFailure (condStream.str (), actualStream.str (),      \
                        limitStream.str (), msgStream.str (),            \
                        file, line);                                     \
       }                                                                 \
@@ -482,55 +499,61 @@
 /**
  * \ingroup testing
  *
- * \brief Test that actual and expected (limit) values are equal to plus
- * or minus some tolerance and report if not.
+ * \brief Test that actual and expected (limit) values are equal to
+ * plus or minus some tolerance and report if not.
  *
- * Check to see if the expected (limit) value is equal to the actual value found
- * in a test case to some tolerance.  This is not the same thing as asking if
- * two floating point are equal to within some epsilon, but is useful for that
- * case.  This assertion is geared toward more of a measurement problem.
- * Consider measuring a physical rod of some kind that you have ordered.
- * You need to  determine if it is "good."  You want to measure the rod
- * to an arbitrary precision  of sixteen significant figures,
- * you will measure the rod to determine if its length is within
- * the tolerances you provided.  For example, 12.00 inches plus 
- * or minus .005 inch may be just fine.
+ * Check to see if the expected (limit) value is equal to the actual
+ * value found in a test case to some tolerance.  This is not the same
+ * thing as asking if two floating point are equal to within some
+ * epsilon, but is useful for that case.  This assertion is geared
+ * toward more of a measurement problem.  Consider measuring a
+ * physical rod of some kind that you have ordered.  You need to
+ * determine if it is "good."  You want to measure the rod to an
+ * arbitrary precision of sixteen significant figures, you will
+ * measure the rod to determine if its length is within the tolerances
+ * you provided.  For example, 12.00 inches plus or minus .005 inch
+ * may be just fine.
  * 
- * In ns-3, you might want to measure a signal to noise ratio and check to see
- * if the answer is what you expect.  If you naively measure (double)1128.93 and
- * compare this number with a constant 1128.93 you are almost certainly going to
- * have your test fail because of floating point rounding errors.  We provide a
- * floating point comparison function ns3::TestDoubleIsEqual() but you will 
- * probably quickly find that is not what you want either.  It may turn out to
- * be the case that when you measured an snr that printed as 1128.93, what was 
- * actually measured was something more like 1128.9287653857625442 for example.
- * Given that the double epsilon is on the order of 0.0000000000000009,
- * you would  need to provide sixteen significant figures of expected value
- * for this kind of test to pass even with a typical test for floating point
- * "approximate equality."  That is clearly not required or desired.
- * You really want to be able to provide 1128.93 along with a tolerance
- * just like you provided 12 inches +- 0.005 inch above.
- *
- * This assertion is designed for real measurements by taking into account
- * measurement tolerances.  By doing so it also automatically compensates for 
- * floating point rounding errors.    If you really want to check floating point
- * equality down to the numeric_limits<double>::epsilon () range,
- * consider using ns3::TestDoubleIsEqual().
+ * In ns-3, you might want to measure a signal to noise ratio and
+ * check to see if the answer is what you expect.  If you naively
+ * measure (double)1128.93 and compare this number with a constant
+ * 1128.93 you are almost certainly going to have your test fail
+ * because of floating point rounding errors.  We provide a floating
+ * point comparison function ns3::TestDoubleIsEqual() but you will
+ * probably quickly find that is not what you want either.  It may
+ * turn out to be the case that when you measured an snr that printed
+ * as 1128.93, what was actually measured was something more like
+ * 1128.9287653857625442 for example.  Given that the double epsilon
+ * is on the order of 0.0000000000000009, you would need to provide
+ * sixteen significant figures of expected value for this kind of test
+ * to pass even with a typical test for floating point "approximate
+ * equality."  That is clearly not required or desired.  You really
+ * want to be able to provide 1128.93 along with a tolerance just like
+ * you provided 12 inches +- 0.005 inch above.
+ *
+ * This assertion is designed for real measurements by taking into
+ * account measurement tolerances.  By doing so it also automatically
+ * compensates for floating point rounding errors.  If you really want
+ * to check floating point equality down to the
+ * numeric_limits<double>::epsilon () range, consider using
+ * ns3::TestDoubleIsEqual().
  *
- * \note Mixing signed and unsigned types can lead to misleading results.
+ * \note Mixing signed and unsigned types can lead to misleading
+ * results.
  *
  * The message is interpreted as a stream, for example:
  *
  * \code
- * NS_TEST_EXPECT_MSG_EQ_TOL (snr, 1128.93, 0.005, "wrong snr (" << snr << ") in test");
+ *   NS_TEST_EXPECT_MSG_EQ_TOL (snr, 1128.93, 0.005,
+ *                              "wrong snr (" << snr << ") in test");
  * \endcode
  *
  * is legal.
  * 
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the expected value of the test.
- * \param tol Tolerance of the test.
- * \param msg Message that is output if the test does not pass.
+ * \param [in] actual Expression for the actual value found during the test.
+ * \param [in] limit Expression for the expected value of the test.
+ * \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__)
@@ -555,7 +578,7 @@
         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);                   \
@@ -566,13 +589,14 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are not equal and 
- * report and abort if not.
+ * \brief Test that an actual and expected (limit) value are not equal
+ * and report and abort if not.
  *
- * Check to see if the expected (limit) value is not equal to the actual value
- * found in a test case.  If the two values are not equal nothing happens, but 
- * if the comparison fails, an error is reported in a consistent way and the 
- * execution of the current test case is aborted.
+ * Check to see if the expected (limit) value is not equal to the
+ * actual value found in a test case.  If the two values are not equal
+ * nothing happens, but if the comparison 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, for example:
  *
@@ -583,12 +607,12 @@
  *
  * is legal.
  * 
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the value that actual is tested against.
- * \param msg Message that is output if the test does not pass.
+ * \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.
+ * \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__)
@@ -609,7 +633,7 @@
         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);                   \
@@ -620,13 +644,14 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are not equal and 
- * report and abort if not.
+ * \brief Test that an actual and expected (limit) value are not equal
+ * and report and abort if not.
  *
- * Check to see if the expected (limit) value is not equal to the actual value
- * found in a test case.  If the two values are equal nothing happens, but if 
- * the comparison fails, an error is reported in a consistent way and the 
- * execution of the current test case is aborted.
+ * Check to see if the expected (limit) value is not equal to the
+ * actual value found in a test case.  If the two values are equal
+ * nothing happens, but if the comparison 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, for example:
  *
@@ -637,12 +662,12 @@
  *
  * is legal.
  * 
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the expected value of the test.
- * \param msg Message that is output if the test does not pass.
+ * \param [in] actual Expression for the actual value found during the test.
+ * \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.
+ * \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.
  *
@@ -669,7 +694,7 @@
         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);                   \
@@ -679,13 +704,14 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual and expected (limit) value are not equal and 
- * report if not.
+ * \brief Test that an actual and expected (limit) value are not equal
+ * and report if not.
  *
- * Check to see if the expected (limit) value is not equal to the actual value 
- * found in a test case.  If the two values are not equal nothing happens, but 
- * if the comparison fails, an error is reported in a consistent way.  EXPECT* 
- * macros do not return if an error is detected.
+ * Check to see if the expected (limit) value is not equal to the
+ * actual value found in a test case.  If the two values are not equal
+ * nothing happens, but if the comparison fails, an error is reported
+ * in a consistent way.  EXPECT* macros do not return if an error is
+ * detected.
  *
  * The message is interpreted as a stream, for example:
  *
@@ -696,12 +722,12 @@
  *
  * is legal.
  * 
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the value that actual is tested against.
- * \param msg Message that is output if the test does not pass.
+ * \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_EXPECT_MSG_FLNE instead.
+ * \warning Do not use this macro if you are comparing floating point
+ * 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__)
@@ -726,7 +752,7 @@
         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);                   \
@@ -741,7 +767,7 @@
  */
 #define NS_TEST_ASSERT_MSG_LT_OR_EQ_INTERNAL(actual, limit, msg, file, line)  \
   do {                                                                  \
-    if (!((actual) <= (limit)))                                          \
+    if (!((actual) <= (limit)))                                         \
       {                                                                 \
         ASSERT_ON_FAILURE;                                              \
         std::ostringstream msgStream;                                   \
@@ -750,7 +776,7 @@
         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);                   \
@@ -761,19 +787,19 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual value is less than a limit and report and abort
- * if not.
+ * \brief Test that an actual value is less than a limit and report
+ * and abort if not.
  *
- * Check to see if the actual value found in a test case is less than the 
- * limit value.  If the actual value is lesser 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.
+ * Check to see if the actual value found in a test case is less than
+ * the limit value.  If the actual value is lesser 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 actual Expression for the actual value found during the test.
- * \param limit Expression for the limit value of the test.
- * \param msg Message that is output if the test does not pass.
+ * \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(actual, limit, msg) \
   NS_TEST_ASSERT_MSG_LT_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
@@ -781,19 +807,20 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual value is less than or equal to a limit and
- * report and abort if not.
+ * \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.
+ * 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 actual Expression for the actual value found during the test.
- * \param limit Expression for the limit value of the test.
- * \param msg Message that is output if the test does not pass.
+ * \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__)
@@ -816,7 +843,7 @@
         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);                   \
@@ -825,15 +852,15 @@
 
 /**
  * \ingroup testingimpl
- * \brief Test that an actual value is less than or equal to a limit and report
- * if not.
+ * \brief Test that an actual value is less than or equal to a limit
+ * and report if not.
  *
- * Required to avoid use of return statement which allows use in methods
- * (callbacks) returning void.
+ * Required to avoid use of return statement which allows use in
+ * methods (callbacks) returning void.
  */
 #define NS_TEST_EXPECT_MSG_LT_OR_EQ_INTERNAL(actual, limit, msg, file, line)  \
   do {                                                                  \
-    if (!((actual) <= (limit)))                                          \
+    if (!((actual) <= (limit)))                                         \
       {                                                                 \
         ASSERT_ON_FAILURE;                                              \
         std::ostringstream msgStream;                                   \
@@ -842,7 +869,7 @@
         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);                   \
@@ -852,18 +879,19 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual value is less than a limit and report if not.
+ * \brief Test that an actual value is less than a limit and report if
+ * not.
  *
- * Check to see if the actual value found in a test case is less than the 
- * limit value.  If the actual value is lesser nothing happens, but if the 
- * check fails, an error is reported in a consistent way.  EXPECT* macros do 
- * not return if an error is detected.
+ * Check to see if the actual value found in a test case is less than
+ * the limit value.  If the actual value is lesser nothing happens,
+ * but if the check fails, an error is reported in a consistent way.
+ * EXPECT* macros do not return if an error is detected.
  *
  * The message is interpreted as a stream.
  *
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the limit value of the test.
- * \param msg Message that is output if the test does not pass.
+ * \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(actual, limit, msg) \
   NS_TEST_EXPECT_MSG_LT_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
@@ -871,19 +899,20 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual value is less than or equal to a limit and report
- *        if not.
+ * \brief Test that an actual value is less than or equal to a limit
+ * and report 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.  EXPECT* macros
- * do not return if an error is detected.
+ * 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.  EXPECT* macros do not return if an error is
+ * detected.
  *
  * The message is interpreted as a stream.
  *
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the limit value of the test.
- * \param msg Message that is output if the test does not pass.
+ * \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(actual, limit, msg) \
   NS_TEST_EXPECT_MSG_LT_OR_EQ_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
@@ -908,7 +937,7 @@
         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);                   \
@@ -918,12 +947,12 @@
 
 /**
  * \ingroup testingimpl
- * \brief Test that an actual value is greater than or equal to a limit and
- * report and abort if not.
+ * \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)))                                          \
+    if (!((actual) >= (limit)))                                         \
       {                                                                 \
         ASSERT_ON_FAILURE;                                              \
         std::ostringstream msgStream;                                   \
@@ -932,7 +961,7 @@
         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);                   \
@@ -943,19 +972,20 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual value is greater than a limit and report and abort
- * if not.
+ * \brief Test that an actual value is greater than a limit and report
+ * and abort if not.
  *
- * Check to see if the actual value found in a test case is greater than 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.
+ * Check to see if the actual value found in a test case is greater
+ * than 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 actual Expression for the actual value found during the test.
- * \param limit Expression for the limit value of the test.
- * \param msg Message that is output if the test does not pass.
+ * \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(actual, limit, msg) \
   NS_TEST_ASSERT_MSG_GT_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
@@ -963,19 +993,20 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual value is greater than or equal to a limit and
- * report and abort if not.
+ * \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.
+ * 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 actual Expression for the actual value found during the test.
- * \param limit Expression for the limit value of the test.
- * \param msg Message that is output if the test does not pass.
+ * \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__)
@@ -991,14 +1022,14 @@
   do {                                                                  \
     if (!((actual) > (limit)))                                          \
       {                                                                 \
-        ASSERT_ON_FAILURE;                                               \
+        ASSERT_ON_FAILURE;                                              \
         std::ostringstream msgStream;                                   \
         msgStream << msg;                                               \
         std::ostringstream actualStream;                                \
         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);                   \
@@ -1007,24 +1038,24 @@
 
 /**
  * \ingroup testingimpl
- * \brief Test that an actual value is greater than or equal to limit and
- * report if not.
+ * \brief Test that an actual value is greater than or equal to limit
+ * and report if not.
  *
- * Required to avoid use of return statement which allows use in methods
- * (callbacks) returning void.
+ * Required to avoid use of return statement which allows use in
+ * methods (callbacks) returning void.
  */
 #define NS_TEST_EXPECT_MSG_GT_OR_EQ_INTERNAL(actual, limit, msg, file, line)  \
   do {                                                                  \
-    if (!((actual) >= (limit)))                                          \
+    if (!((actual) >= (limit)))                                         \
       {                                                                 \
-        ASSERT_ON_FAILURE;                                               \
+        ASSERT_ON_FAILURE;                                              \
         std::ostringstream msgStream;                                   \
         msgStream << msg;                                               \
         std::ostringstream actualStream;                                \
         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);                   \
@@ -1034,18 +1065,20 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual value is greater than a limit and report if not.
+ * \brief Test that an actual value is greater than a limit and report
+ * if not.
  *
- * Check to see if the actual value found in a test case is greater than the 
- * limit value.  If the actual value is greater nothing happens, but if the 
- * check fails, an error is reported in a consistent way.  EXPECT* macros do 
- * not return if an error is detected.
+ * Check to see if the actual value found in a test case is greater
+ * than the limit value.  If the actual value is greater nothing
+ * happens, but if the check fails, an error is reported in a
+ * consistent way.  EXPECT* macros do not return if an error is
+ * detected.
  *
  * The message is interpreted as a stream.
  *
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the limit value of the test.
- * \param msg Message that is output if the test does not pass.
+ * \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(actual, limit, msg) \
   NS_TEST_EXPECT_MSG_GT_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
@@ -1053,19 +1086,20 @@
 /**
  * \ingroup testing
  *
- * \brief Test that an actual value is greater than or equal to limit and report
- * if not.
+ * \brief Test that an actual value is greater than or equal to limit
+ * and report 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.  EXPECT* macros do
- * not return if an error is detected.
+ * 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.  EXPECT* macros do not return if an error is
+ * detected.
  *
  * The message is interpreted as a stream.
  *
- * \param actual Expression for the actual value found during the test.
- * \param limit Expression for the limit value of the test.
- * \param msg Message that is output if the test does not pass.
+ * \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(actual, limit, msg) \
   NS_TEST_EXPECT_MSG_GT_OR_EQ_INTERNAL (actual, limit, msg, __FILE__, __LINE__)
@@ -1074,22 +1108,27 @@
 
 /**
  * \ingroup testing
- * \brief Compare two double precision floating point numbers and declare them
- * equal if they are within some epsilon of each other.
+ * \brief Compare two double precision floating point numbers and
+ * declare them equal if they are within some epsilon of each other.
  *
- * Approximate comparison of floating point numbers near equality is trickier
- * than one may expect and is well-discussed in the literature.  Basic 
- * strategies revolve around a suggestion by Knuth to compare the floating 
- * point numbers as binary integers, supplying a maximum difference between
- * them .  This max difference is specified in Units in the Last Place (ulps)
- * or a floating point epsilon.
+ * Approximate comparison of floating point numbers near equality is
+ * trickier than one may expect and is well-discussed in the
+ * literature.  Basic strategies revolve around a suggestion by Knuth
+ * to compare the floating point numbers as binary integers, supplying
+ * a maximum difference between them .  This max difference is
+ * specified in Units in the Last Place (ulps) or a floating point
+ * epsilon.
  *
- * This routine is based on the GNU Scientific Library function gsl_fcmp.
+ * This routine is based on the GNU Scientific Library function
+ * gsl_fcmp.
  * 
- * \param a The first of double precision floating point numbers to compare
- * \param b The second of double precision floating point numbers to compare
- * \param epsilon The second of double precision floating point numberss to compare
- * \returns Returns true if the doubles are equal to a precision defined by epsilon
+ * \param [in] a The first of double precision floating point
+ *               numbers to compare
+ * \param [in] b The second of double precision floating point
+ *               numbers to compare
+ * \param [in] epsilon The tolerance to use in the comparison.
+ * \returns Returns \c true if the doubles are equal to a precision
+ *          defined by epsilon
  */
 bool TestDoubleIsEqual (const double a, const double b, 
                         const double epsilon = std::numeric_limits<double>::epsilon ());
@@ -1102,16 +1141,13 @@
  * \brief encapsulates test code
  *
  * To allow a new test to be run within the ns-3 test framework, users
- * need to create subclasses of this base class, override the DoRun method,
- * and use the NS_TEST_* macros within DoRun.
+ * need to create subclasses of this base class, override the DoRun
+ * method, and use the NS_TEST_* macros within DoRun.
  */
-class TestCase
+class TestCase : private NonCopyable
 {
 public:
-  /**
-   * \enum TestDuration
-   * \brief How long the test takes to execute.
-   */
+  /** \brief How long the test takes to execute. */
   enum TestDuration {
     QUICK         = 1,  //!< Fast test.
     EXTENSIVE     = 2,  //!< Medium length test.
@@ -1124,100 +1160,125 @@
   virtual ~TestCase ();
 
   /**
-   * \return name of this test
+   * \return The name of this test
    */
   std::string GetName (void) const;  
 
 protected:
   /**
-   * \param name the name of the new TestCase created
+   * \brief Constructor.
+   *
+   * \param [in] name The name of the new TestCase created
    */
   TestCase (std::string name);
 
   /**
    * \brief Add an individual child TestCase to this test suite.
    *
-   * \param testCase Pointer to the TestCase object to be added.
-   * \param duration Amount of time this test takes to execute.
+   * \param [in] testCase Pointer to the TestCase object to be added.
+   * \param [in] duration Amount of time this test takes to execute.
    */
   void AddTestCase (TestCase *testCase, enum TestDuration duration);
 
   /**
-   * \param directory the directory where the test data is located
+   * \brief Set the data directory where reference trace files can be
+   * found.
+   *
+   * \param [in] directory The directory where the test data is
+   * located
    *
-   * In general, this method is invoked as SetDataDir (NS_TEST_SOURCEDIR);
-   * However, if a module contains a test directory with subdirectories
-   * (e.g. src/mesh/test), and the test data (e.g. pcap traces) is located
-   * in one of these subdirectories, then the variable NS_TEST_SOURCEDIR 
-   * may not work and the user may want to explicitly pass in a 
-   * directory string.
+   * In general, this method is invoked as SetDataDir
+   * (NS_TEST_SOURCEDIR); However, if a module contains a test
+   * directory with subdirectories (e.g. src/mesh/test), and the test
+   * data (e.g. pcap traces) is located in one of these
+   * 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
    */
   void SetDataDir (std::string directory);
 
   /**
-   * \return true if the tests have failed, false otherwise.
+   * \brief Check if any tests failed.
+   *
+   * \return \c true if any of the tests have failed, \c false otherwise.
    */
   bool IsStatusFailure (void) const;
   /**
-   * \return true if the tests have succeeded, false otherwise.
+   * \brief Check if all tests passed.
+   *
+   * \return \c true if the tests have succeeded, \c false otherwise.
    */
   bool IsStatusSuccess (void) const;
 
   /**
-   * \return a pointer to the parent of this test
+   * \brief Get the parent of this TestCsse.
+   *
+   * \return A pointer to the parent of this test.
    */
   TestCase * GetParent () const;
 
   /**
+   * \name Internal Interface
+   * These methods are the interface used by test macros and should not
+   * be used directly by normal test code.
    * @{
-   * \internal
-   * The methods below are used only by test macros and should not
-   * be used by normal users.
    */
   /**
-   * Log the failure of this TestCase.
-   *
-   * \param cond The test condition.
-   * \param actual Actual value of the test.
-   * \param limit Expected value of the test.
-   * \param message Message indicating the type of failure.
-   * \param file The file where the test failed.
-   * \param line The line number in \p file where the test failed.
+   * \brief Log the failure of this TestCase.
+   *
+   * \param [in] cond The test condition.
+   * \param [in] actual Actual value of the test.
+   * \param [in] limit Expected value of the test.
+   * \param [in] message Message indicating the type of failure.
+   * \param [in] file The file where the test failed.
+   * \param [in] line The line number in \p file where the test failed.
    */
   void ReportTestFailure (std::string cond, std::string actual, 
                       std::string limit, std::string message, 
                       std::string file, int32_t line);
   /**
-   * \return should we assert on failure, per the TestSuite configuration
+   * \brief Check if this run should assert on failure.
+   *
+   * \return \c true if we should assert on failure.
    */
   bool MustAssertOnFailure (void) const;
   /**
-   * \return should we continue on failure, per the TestSuite configuration
+   * \brief Check if this run should continue on failure.
+   *
+   * \return \c true if we should continue on failure.
    */
   bool MustContinueOnFailure (void) const;
   /**
-   * \param filename the bare (no path) file name
-   * \return the full path to filename in the data directory
+   * \brief Construct the full path to a file in the data directory.
+   *
+   * The data directory is configured by SetDataDirectory().
+   *
+   * \param [in] filename The bare (no path) file name
+   * \return The full path to \p filename in the data directory
    */
   std::string CreateDataDirFilename (std::string filename);
   /**
-   * \param filename the bare (no path) file name
-   * \return the full path to filename in the temporary directory.
+   * \brief Construct the full path to a file in a temporary directory.
+   *
    *  If the TestRunner is invoked with "--update-data", this will be
    *  the data directory instead.
+   *
+   * \param [in] filename The bare (no path) file name
+   * \return The full path to \p filename in the temporary directory.
    */
   std::string CreateTempDirFilename (std::string filename);
   /**@}*/
+  
 private:
   friend class TestRunnerImpl;
 
   /**
-   * \brief Implementation to do any local setup required for this TestCase.
+   * \brief Implementation to do any local setup required for this
+   * TestCase.
    *
-   * Subclasses should override this method to perform any costly per-test setup
-   * before DoRun is invoked.
+   * Subclasses should override this method to perform any costly
+   * per-test setup before DoRun is invoked.
    */
   virtual void DoSetup (void);
 
@@ -1229,34 +1290,30 @@
   virtual void DoRun (void) = 0;
 
   /**
-   * \brief Implementation to do any local setup required for this TestCase.
+   * \brief Implementation to do any local setup required for this
+   * TestCase.
    *
-   * Subclasses should override this method to perform any costly per-test teardown
+   * Subclasses should override this method to perform any costly
+   * per-test teardown
    */
   virtual void DoTeardown (void);
 
-  /**
-   * Private, to block copying
-   */
-  TestCase (TestCase& tc);
-  /**
-   * Private, to block copying
-   */
-  TestCase& operator= (TestCase& tc);
-
   // methods called by TestRunnerImpl
   /**
-   * Actually run this TestCase
+   * \brief Actually run this TestCase
    *
-   * \param runner The test runner implementation.
+   * \param [in] runner The test runner implementation.
    */
   void Run (TestRunnerImpl *runner);
   /**
-   * \return the failure status of this TestCase and all it's children
+   * \copydoc IsStatusFailure()
    */
   bool IsFailed (void) const;
 
-  // Forward declaration is enough, since we only include a pointer here
+  /**
+   * \ingroup testingimpl
+   * \brief Container for results from a TestCase.
+   */
   struct Result;
 
   TestCase *m_parent;                   //!< Pointer to my parent TestCase
@@ -1292,22 +1349,22 @@
   /**
    * \brief Constuct a new test suite.
    *
-   * \param name The name of the test suite.
-   * \param type The TestType of the test suite (defaults to UNIT test).
+   * \param [in] name The name of the test suite.
+   * \param [in] type The TestType of the test suite (defaults to UNIT test).
    */
   TestSuite (std::string name, Type type = UNIT);
 
   /**
    * \brief get the kind of test this test suite implements
    *
-   * \returns the Type of the suite.
+   * \returns The Type of the suite.
    */
   TestSuite::Type GetTestType (void);
 
 private:
+  // Inherited
   virtual void DoRun (void);
 
-
   TestSuite::Type m_type;               //!< Type of this TestSuite
 };
 
@@ -1320,11 +1377,12 @@
 {
 public:
   /**
-   * Run the requested suite of tests.
+   * Run the requested suite of tests,
+   * according to the given command line arguments.
    *
-   * \param argc number of elements in \pname{argv}
-   * \param argv vector of command line arguments
-   * \returns success status
+   * \param [in] argc The number of elements in \pname{argv}
+   * \param [in] argv The vector of command line arguments
+   * \returns Success status
    */
   static int Run (int argc, char *argv[]);
 };
@@ -1335,7 +1393,7 @@
  * \brief A simple way to store test vectors (for stimulus or from responses)
  */
 template <typename T>
-class TestVectors
+class TestVectors : private NonCopyable
 {
 public:
   /**
@@ -1348,41 +1406,32 @@
   virtual ~TestVectors ();
 
   /**
-   * \param reserve the number of entries to reserve
+   * \brief Set the expected length of this vector.
+   *
+   * \param [in] reserve The number of entries to reserve
    */
   void Reserve (uint32_t reserve);
 
   /**
-   * \param vector the test vector to add
-   * \returns the new test vector index
+   * \param [in] vector The test vector to add
+   * 
+   * \returns The new test vector index
    */
   uint32_t Add (T vector);
 
   /**
-   * \return the number of test vectors
+   * \brief Get the total number of test vectors.
+   * \return The number of test vectors
    */
   uint32_t GetN (void) const;
   /**
-   * Get the i'th test vector
-   * \param i the requested vector index
-   * \return the requested vector
+   * \brief Get the i'th test vector
+   * \param [in] i The requested vector index
+   * \return The requested vector
    */
   T Get (uint32_t i) const;
 
 private:
-  /**
-   * Copy constructor, private to block copying
-   */
-  TestVectors (const TestVectors& tv);
-  /**
-   * Assignment, private to prevent copying
-   */
-  TestVectors& operator= (const TestVectors& tv);
-  /**
-   * Comparison (unimplemented?)
-   */
-  bool operator== (const TestVectors& tv) const;
-
   typedef std::vector<T> TestVector;    //!< Container type
   TestVector m_vectors;                 //!< The list of test vectors
 };
diff -Naur ns-3.23/src/core/model/timer.h ns-3.24/src/core/model/timer.h
--- ns-3.23/src/core/model/timer.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/timer.h	2015-09-15 11:18:44.000000000 -0700
@@ -108,13 +108,14 @@
    */
   Timer ();
   /**
-   * \param destroyPolicy the event lifetime management policies to use for destroy events
+   * \param [in] destroyPolicy the event lifetime management policies
+   * to use for destroy events
    */
   Timer (enum DestroyPolicy destroyPolicy);
   ~Timer ();
 
   /**
-   * \param fn the function
+   * \param [in] fn the function
    *
    * Store this function in this Timer for later use by Timer::Schedule.
    */
@@ -122,67 +123,68 @@
   void SetFunction (FN fn);
 
   /**
-   * \param memPtr the member function pointer
-   * \param objPtr the pointer to object
+   * \param [in] memPtr the member function pointer
+   * \param [in] objPtr the pointer to object
    *
-   * Store this function and object in this Timer for later use by Timer::Schedule.
+   * Store this function and object in this Timer for later use by
+   * Timer::Schedule.
    */
   template <typename MEM_PTR, typename OBJ_PTR>
   void SetFunction (MEM_PTR memPtr, OBJ_PTR objPtr);
 
 
   /**
-   * \param a1 the first argument
+   * \param [in] a1 the first argument
    *
    * Store this argument in this Timer for later use by Timer::Schedule.
    */
   template <typename T1>
   void SetArguments (T1 a1);
   /**
-   * \param a1 the first argument
-   * \param a2 the second argument
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
    *
    * Store these arguments in this Timer for later use by Timer::Schedule.
    */
   template <typename T1, typename T2>
   void SetArguments (T1 a1, T2 a2);
   /**
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
    *
    * Store these arguments in this Timer for later use by Timer::Schedule.
    */
   template <typename T1, typename T2, typename T3>
   void SetArguments (T1 a1, T2 a2, T3 a3);
   /**
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
-   * \param a4 the fourth argument
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
+   * \param [in] a4 the fourth argument
    *
    * Store these arguments in this Timer for later use by Timer::Schedule.
    */
   template <typename T1, typename T2, typename T3, typename T4>
   void SetArguments (T1 a1, T2 a2, T3 a3, T4 a4);
   /**
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
-   * \param a4 the fourth argument
-   * \param a5 the fifth argument
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
+   * \param [in] a4 the fourth argument
+   * \param [in] a5 the fifth argument
    *
    * Store these arguments in this Timer for later use by Timer::Schedule.
    */
   template <typename T1, typename T2, typename T3, typename T4, typename T5>
   void SetArguments (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
   /**
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
-   * \param a4 the fourth argument
-   * \param a5 the fifth argument
-   * \param a6 the sixth argument
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
+   * \param [in] a4 the fourth argument
+   * \param [in] a5 the fifth argument
+   * \param [in] a6 the sixth argument
    *
    * Store these arguments in this Timer for later use by Timer::Schedule.
    */
@@ -190,17 +192,17 @@
   void SetArguments (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
 
   /**
-   * \param delay the delay
+   * \param [in] delay The delay
    *
    * The next call to Schedule will schedule the timer with this delay.
    */
   void SetDelay (const Time &delay);
   /**
-   * \returns the currently-configured delay for the next Schedule.
+   * \returns The currently-configured delay for the next Schedule.
    */
   Time GetDelay (void) const;
   /**
-   * \returns the amount of time left until this timer expires.
+   * \returns The amount of time left until this timer expires.
    *
    * This method returns zero if the timer is in EXPIRED state.
    */
@@ -216,20 +218,22 @@
    */
   void Remove (void);
   /**
-   * \return true if there is no currently-running event, false otherwise.
+   * \return \c true if there is no currently-running event,
+   * \c false otherwise.
    */
   bool IsExpired (void) const;
   /**
-   * \return true if there is a currently-running event, false otherwise.
+   * \return \c true if there is a currently-running event,
+   * \c false otherwise.
    */
   bool IsRunning (void) const;
   /**
-   * \returns true if this timer was suspended and not yet resumed, false
-   *          otherwise.
+   * \returns \c true if this timer was suspended and not yet resumed,
+   * \c false otherwise.
    */
   bool IsSuspended (void) const;
   /**
-   * \returns the current state of the timer.
+   * \returns The current state of the timer.
    */
   enum Timer::State GetState (void) const;
   /**
@@ -238,7 +242,7 @@
    */
   void Schedule (void);
   /**
-   * \param delay the delay to use
+   * \param [in] delay the delay to use
    *
    * Schedule a new event using the specified delay (ignore the delay set by
    * Timer::SetDelay), function, and arguments.
diff -Naur ns-3.23/src/core/model/timer-impl.h ns-3.24/src/core/model/timer-impl.h
--- ns-3.23/src/core/model/timer-impl.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/timer-impl.h	2015-09-15 11:18:44.000000000 -0700
@@ -52,70 +52,70 @@
    */
   /**@{*/
   /**
-   * \tparam T1 Type of the first argument.
-   * \param a1 The first argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \param [in] a1 The first argument
    */
   template <typename T1>
   void SetArgs (T1 a1);
   /**
-   * \tparam T1 Type of the first argument.
-   * \tparam T2 Type of the second argument.
-   * \param a1 the first argument
-   * \param a2 the second argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \tparam T2 \deduced Type of the second argument.
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
    */
   template <typename T1, typename T2>
   void SetArgs (T1 a1, T2 a2);
   /**
-   * \tparam T1 Type of the first argument.
-   * \tparam T2 Type of the second argument.
-   * \tparam T3 Type of the third argument.
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \tparam T2 \deduced Type of the second argument.
+   * \tparam T3 \deduced Type of the third argument.
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
    */
   template <typename T1, typename T2, typename T3>
   void SetArgs (T1 a1, T2 a2, T3 a3);
   /**
-   * \tparam T1 Type of the first argument.
-   * \tparam T2 Type of the second argument.
-   * \tparam T3 Type of the third argument.
-   * \tparam T4 Type of the fourth argument.
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
-   * \param a4 the fourth argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \tparam T2 \deduced Type of the second argument.
+   * \tparam T3 \deduced Type of the third argument.
+   * \tparam T4 \deduced Type of the fourth argument.
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
+   * \param [in] a4 the fourth argument
    */
   template <typename T1, typename T2, typename T3,
             typename T4>
   void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4);
   /**
-   * \tparam T1 Type of the first argument.
-   * \tparam T2 Type of the second argument.
-   * \tparam T3 Type of the third argument.
-   * \tparam T4 Type of the fourth argument.
-   * \tparam T5 Type of the fifth argument.
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
-   * \param a4 the fourth argument
-   * \param a5 the fifth argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \tparam T2 \deduced Type of the second argument.
+   * \tparam T3 \deduced Type of the third argument.
+   * \tparam T4 \deduced Type of the fourth argument.
+   * \tparam T5 \deduced Type of the fifth argument.
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
+   * \param [in] a4 the fourth argument
+   * \param [in] a5 the fifth argument
    */
   template <typename T1, typename T2, typename T3,
             typename T4, typename T5>
   void SetArgs (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
   /**
-   * \tparam T1 Type of the first argument.
-   * \tparam T2 Type of the second argument.
-   * \tparam T3 Type of the third argument.
-   * \tparam T4 Type of the fourth argument.
-   * \tparam T5 Type of the fifth argument.
-   * \tparam T6 Type of the sixth argument.
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
-   * \param a4 the fourth argument
-   * \param a5 the fifth argument
-   * \param a6 the sixth argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \tparam T2 \deduced Type of the second argument.
+   * \tparam T3 \deduced Type of the third argument.
+   * \tparam T4 \deduced Type of the fourth argument.
+   * \tparam T5 \deduced Type of the fifth argument.
+   * \tparam T6 \deduced Type of the sixth argument.
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
+   * \param [in] a4 the fourth argument
+   * \param [in] a5 the fifth argument
+   * \param [in] a6 the sixth argument
    */
   template <typename T1, typename T2, typename T3,
             typename T4, typename T5, typename T6>
@@ -125,7 +125,7 @@
   /**
    * Schedule the callback for a future time.
    *
-   * \param delay The amount of time until the timer expires.
+   * \param [in] delay The amount of time until the timer expires.
    * \returns The scheduled EventId.
    */
   virtual EventId Schedule (const Time &delay) = 0;
@@ -155,7 +155,7 @@
   /**
    * Bind the arguments to be used when the callback function is invoked.
    *
-   * \param a1 The first argument.
+   * \param [in] a1 The first argument.
    */
   virtual void SetArguments (T1 a1) = 0;
 };
@@ -166,8 +166,8 @@
   /**
    * Bind the arguments to be used when the callback function is invoked.
    *
-   * \param a1 The first argument.
-   * \param a2 The second argument.
+   * \param [in] a1 The first argument.
+   * \param [in] a2 The second argument.
    */
   virtual void SetArguments (T1 a1,T2 a2) = 0;
 };
@@ -178,9 +178,9 @@
   /**
    * Bind the arguments to be used when the callback function is invoked.
    *
-   * \param a1 The first argument.
-   * \param a2 The second argument.
-   * \param a3 The third argument.
+   * \param [in] a1 The first argument.
+   * \param [in] a2 The second argument.
+   * \param [in] a3 The third argument.
    */
   virtual void SetArguments (T1 a1,T2 a2,T3 a3) = 0;
 };
@@ -191,10 +191,10 @@
   /**
    * Bind the arguments to be used when the callback function is invoked.
    *
-   * \param a1 The first argument.
-   * \param a2 The second argument.
-   * \param a3 The third argument.
-   * \param a4 The fourth argument.
+   * \param [in] a1 The first argument.
+   * \param [in] a2 The second argument.
+   * \param [in] a3 The third argument.
+   * \param [in] a4 The fourth argument.
    */
   virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4) = 0;
 };
@@ -205,11 +205,11 @@
   /**
    * Bind the arguments to be used when the callback function is invoked.
    *
-   * \param a1 The first argument.
-   * \param a2 The second argument.
-   * \param a3 The third argument.
-   * \param a4 The fourth argument.
-   * \param a5 The fifth argument.
+   * \param [in] a1 The first argument.
+   * \param [in] a2 The second argument.
+   * \param [in] a3 The third argument.
+   * \param [in] a4 The fourth argument.
+   * \param [in] a5 The fifth argument.
    */
   virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5) = 0;
 };
@@ -220,12 +220,12 @@
   /**
    * Bind the arguments to be used when the callback function is invoked.
    *
-   * \param a1 The first argument.
-   * \param a2 The second argument.
-   * \param a3 The third argument.
-   * \param a4 The fourth argument.
-   * \param a5 The fifth argument.
-   * \param a6 The sixth argument.
+   * \param [in] a1 The first argument.
+   * \param [in] a2 The second argument.
+   * \param [in] a3 The third argument.
+   * \param [in] a4 The fourth argument.
+   * \param [in] a5 The fifth argument.
+   * \param [in] a6 The sixth argument.
    */
   virtual void SetArguments (T1 a1,T2 a2,T3 a3, T4 a4, T5 a5, T6 a6) = 0;
 };
@@ -244,8 +244,8 @@
 /**
  * Make a TimerImpl from a function pointer taking varying numbers of arguments.
  *
- * \tparam FN Function signature type of the callback function.
- * \param fn The function pointer to invoke when the timer expires.
+ * \tparam FN \deduced Function signature type of the callback function.
+ * \param [in] fn The function pointer to invoke when the timer expires.
  * \returns The TimerImpl.
  */
 template <typename FN>
@@ -582,7 +582,7 @@
  *
  * This is the generic template declaration (with empty body).
  *
- * \tparam T The object type.
+ * \tparam T \explicit The object type.
  */
 template <typename T>
 struct TimerImplMemberTraits;
@@ -595,7 +595,7 @@
  *
  * This is the specialization for pointer to \c T.
  *
- * \tparam T The object type.
+ * \tparam T \explicit The object type.
  */
 template <typename T>
 struct TimerImplMemberTraits<T *>
@@ -603,7 +603,7 @@
   /**
    * Convert a pointer type to a reference.
    *
-   * \param p The pointer.
+   * \param [in] p The pointer.
    * \returns A reference to the object pointed to by \c p.
    */
   static T &GetReference (T *p)
@@ -616,10 +616,10 @@
  * Make a TimerImpl from a class method pointer taking
  * a varying number of arguments.
  *
- * \tparam MEM_PTR Class method function signature type.
- * \tparam OBJ_PTR Class type.
- * \param memPtr Class method to invoke when the timer expires.
- * \param objPtr Object instance pointer.
+ * \tparam MEM_PTR \deduced Class method function signature type.
+ * \tparam OBJ_PTR \deduced Class type.
+ * \param [in] memPtr Class method to invoke when the timer expires.
+ * \param [in] objPtr Object instance pointer.
  * \returns The TimerImpl.
  */
 template <typename MEM_PTR, typename OBJ_PTR>
diff -Naur ns-3.23/src/core/model/traced-callback.h ns-3.24/src/core/model/traced-callback.h
--- ns-3.23/src/core/model/traced-callback.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/traced-callback.h	2015-09-15 11:18:44.000000000 -0700
@@ -46,14 +46,14 @@
  * calling one of the \c operator() forms with the appropriate
  * number of arguments.
  *
- * \tparam T1 Type of the first argument to the functor.
- * \tparam T2 Type of the second argument to the functor.
- * \tparam T3 Type of the third argument to the functor.
- * \tparam T4 Type of the fourth argument to the functor.
- * \tparam T5 Type of the fifth argument to the functor.
- * \tparam T6 Type of the sixth argument to the functor.
- * \tparam T7 Type of the seventh argument to the functor.
- * \tparam T8 Type of the eighth argument to the functor.
+ * \tparam T1 \explicit Type of the first argument to the functor.
+ * \tparam T2 \explicit Type of the second argument to the functor.
+ * \tparam T3 \explicit Type of the third argument to the functor.
+ * \tparam T4 \explicit Type of the fourth argument to the functor.
+ * \tparam T5 \explicit Type of the fifth argument to the functor.
+ * \tparam T6 \explicit Type of the sixth argument to the functor.
+ * \tparam T7 \explicit Type of the seventh argument to the functor.
+ * \tparam T8 \explicit Type of the eighth argument to the functor.
  */
 template<typename T1 = empty, typename T2 = empty, 
          typename T3 = empty, typename T4 = empty,
@@ -67,7 +67,7 @@
   /**
    * Append a Callback to the chain (without a context).
    *
-   * \param callback Callback to add to chain.
+   * \param [in] callback Callback to add to chain.
    */
   void ConnectWithoutContext (const CallbackBase & callback);
   /**
@@ -76,21 +76,21 @@
    * The context string will be provided as the first argument
    * to the Callback.
    *
-   * \param callback Callback to add to chain.
-   * \param path Context string to provide when invoking the Callback.
+   * \param [in] callback Callback to add to chain.
+   * \param [in] path Context string to provide when invoking the Callback.
    */
   void Connect (const CallbackBase & callback, std::string path);
   /**
    * Remove from the chain a Callback which was connected without a context.
    *
-   * \param callback Callback to remove from the chain.
+   * \param [in] callback Callback to remove from the chain.
    */
   void DisconnectWithoutContext (const CallbackBase & callback);
   /**
    * Remove from the chain a Callback which was connected with a context.
    *
-   * \param callback Callback to remove from the chain.
-   * \param path Context path which was used to connect the Callback.
+   * \param [in] callback Callback to remove from the chain.
+   * \param [in] path Context path which was used to connect the Callback.
    */
   void Disconnect (const CallbackBase & callback, std::string path);
   /**
@@ -105,106 +105,106 @@
   void operator() (void) const;
   /**
    * \copybrief operator()()
-   * \tparam T1 Type of the first argument to the functor.
-   * \param a1 The first argument to the functor.
+   * \tparam T1 \deduced Type of the first argument to the functor.
+   * \param [in] a1 The first argument to the functor.
    */
   void operator() (T1 a1) const;
   /**
    * \copybrief operator()()
-   * \tparam T1 Type of the first argument to the functor.
-   * \tparam T2 Type of the second argument to the functor.
-   * \param a1 The first argument to the functor.
-   * \param a2 The second argument to the functor.
+   * \tparam T1 \deduced Type of the first argument to the functor.
+   * \tparam T2 \deduced Type of the second argument to the functor.
+   * \param [in] a1 The first argument to the functor.
+   * \param [in] a2 The second argument to the functor.
    */
   void operator() (T1 a1, T2 a2) const;
   /**
    * \copybrief operator()()
-   * \tparam T1 Type of the first argument to the functor.
-   * \tparam T2 Type of the second argument to the functor.
-   * \tparam T3 Type of the third argument to the functor.
-   * \param a1 The first argument to the functor.
-   * \param a2 The second argument to the functor.
-   * \param a3 The third argument to the functor.
+   * \tparam T1 \deduced Type of the first argument to the functor.
+   * \tparam T2 \deduced Type of the second argument to the functor.
+   * \tparam T3 \deduced Type of the third argument to the functor.
+   * \param [in] a1 The first argument to the functor.
+   * \param [in] a2 The second argument to the functor.
+   * \param [in] a3 The third argument to the functor.
    */
   void operator() (T1 a1, T2 a2, T3 a3) const;
   /**
    * \copybrief operator()()
-   * \tparam T1 Type of the first argument to the functor.
-   * \tparam T2 Type of the second argument to the functor.
-   * \tparam T3 Type of the third argument to the functor.
-   * \tparam T4 Type of the fourth argument to the functor.
-   * \param a1 The first argument to the functor.
-   * \param a2 The second argument to the functor.
-   * \param a3 The third argument to the functor.
-   * \param a4 The fourth argument to the functor.
+   * \tparam T1 \deduced Type of the first argument to the functor.
+   * \tparam T2 \deduced Type of the second argument to the functor.
+   * \tparam T3 \deduced Type of the third argument to the functor.
+   * \tparam T4 \deduced Type of the fourth argument to the functor.
+   * \param [in] a1 The first argument to the functor.
+   * \param [in] a2 The second argument to the functor.
+   * \param [in] a3 The third argument to the functor.
+   * \param [in] a4 The fourth argument to the functor.
    */
   void operator() (T1 a1, T2 a2, T3 a3, T4 a4) const;
   /**
    * \copybrief operator()()
-   * \tparam T1 Type of the first argument to the functor.
-   * \tparam T2 Type of the second argument to the functor.
-   * \tparam T3 Type of the third argument to the functor.
-   * \tparam T4 Type of the fourth argument to the functor.
-   * \tparam T5 Type of the fifth argument to the functor.
-   * \param a1 The first argument to the functor.
-   * \param a2 The second argument to the functor.
-   * \param a3 The third argument to the functor.
-   * \param a4 The fourth argument to the functor.
-   * \param a5 The fifth argument to the functor.
+   * \tparam T1 \deduced Type of the first argument to the functor.
+   * \tparam T2 \deduced Type of the second argument to the functor.
+   * \tparam T3 \deduced Type of the third argument to the functor.
+   * \tparam T4 \deduced Type of the fourth argument to the functor.
+   * \tparam T5 \deduced Type of the fifth argument to the functor.
+   * \param [in] a1 The first argument to the functor.
+   * \param [in] a2 The second argument to the functor.
+   * \param [in] a3 The third argument to the functor.
+   * \param [in] a4 The fourth argument to the functor.
+   * \param [in] a5 The fifth argument to the functor.
    */
   void operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) const;
   /**
    * \copybrief operator()()
-   * \tparam T1 Type of the first argument to the functor.
-   * \tparam T2 Type of the second argument to the functor.
-   * \tparam T3 Type of the third argument to the functor.
-   * \tparam T4 Type of the fourth argument to the functor.
-   * \tparam T5 Type of the fifth argument to the functor.
-   * \tparam T6 Type of the sixth argument to the functor.
-   * \param a1 The first argument to the functor.
-   * \param a2 The second argument to the functor.
-   * \param a3 The third argument to the functor.
-   * \param a4 The fourth argument to the functor.
-   * \param a5 The fifth argument to the functor.
-   * \param a6 The sixth argument to the functor.
+   * \tparam T1 \deduced Type of the first argument to the functor.
+   * \tparam T2 \deduced Type of the second argument to the functor.
+   * \tparam T3 \deduced Type of the third argument to the functor.
+   * \tparam T4 \deduced Type of the fourth argument to the functor.
+   * \tparam T5 \deduced Type of the fifth argument to the functor.
+   * \tparam T6 \deduced Type of the sixth argument to the functor.
+   * \param [in] a1 The first argument to the functor.
+   * \param [in] a2 The second argument to the functor.
+   * \param [in] a3 The third argument to the functor.
+   * \param [in] a4 The fourth argument to the functor.
+   * \param [in] a5 The fifth argument to the functor.
+   * \param [in] a6 The sixth argument to the functor.
    */
   void operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) const;
   /**
    * \copybrief operator()()
-   * \tparam T1 Type of the first argument to the functor.
-   * \tparam T2 Type of the second argument to the functor.
-   * \tparam T3 Type of the third argument to the functor.
-   * \tparam T4 Type of the fourth argument to the functor.
-   * \tparam T5 Type of the fifth argument to the functor.
-   * \tparam T6 Type of the sixth argument to the functor.
-   * \tparam T7 Type of the seventh argument to the functor.
-   * \param a1 The first argument to the functor.
-   * \param a2 The second argument to the functor.
-   * \param a3 The third argument to the functor.
-   * \param a4 The fourth argument to the functor.
-   * \param a5 The fifth argument to the functor.
-   * \param a6 The sixth argument to the functor.
-   * \param a7 The seventh argument to the functor.
+   * \tparam T1 \deduced Type of the first argument to the functor.
+   * \tparam T2 \deduced Type of the second argument to the functor.
+   * \tparam T3 \deduced Type of the third argument to the functor.
+   * \tparam T4 \deduced Type of the fourth argument to the functor.
+   * \tparam T5 \deduced Type of the fifth argument to the functor.
+   * \tparam T6 \deduced Type of the sixth argument to the functor.
+   * \tparam T7 \deduced Type of the seventh argument to the functor.
+   * \param [in] a1 The first argument to the functor.
+   * \param [in] a2 The second argument to the functor.
+   * \param [in] a3 The third argument to the functor.
+   * \param [in] a4 The fourth argument to the functor.
+   * \param [in] a5 The fifth argument to the functor.
+   * \param [in] a6 The sixth argument to the functor.
+   * \param [in] a7 The seventh argument to the functor.
    */
   void operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7) const;
   /**
    * \copybrief operator()()
-   * \tparam T1 Type of the first argument to the functor.
-   * \tparam T2 Type of the second argument to the functor.
-   * \tparam T3 Type of the third argument to the functor.
-   * \tparam T4 Type of the fourth argument to the functor.
-   * \tparam T5 Type of the fifth argument to the functor.
-   * \tparam T6 Type of the sixth argument to the functor.
-   * \tparam T7 Type of the seventh argument to the functor.
-   * \tparam T8 Type of the eighth argument to the functor.
-   * \param a1 The first argument to the functor.
-   * \param a2 The second argument to the functor.
-   * \param a3 The third argument to the functor.
-   * \param a4 The fourth argument to the functor.
-   * \param a5 The fifth argument to the functor.
-   * \param a6 The sixth argument to the functor.
-   * \param a7 The seventh argument to the functor.
-   * \param a8 The eighth argument to the functor.
+   * \tparam T1 \deduced Type of the first argument to the functor.
+   * \tparam T2 \deduced Type of the second argument to the functor.
+   * \tparam T3 \deduced Type of the third argument to the functor.
+   * \tparam T4 \deduced Type of the fourth argument to the functor.
+   * \tparam T5 \deduced Type of the fifth argument to the functor.
+   * \tparam T6 \deduced Type of the sixth argument to the functor.
+   * \tparam T7 \deduced Type of the seventh argument to the functor.
+   * \tparam T8 \deduced Type of the eighth argument to the functor.
+   * \param [in] a1 The first argument to the functor.
+   * \param [in] a2 The second argument to the functor.
+   * \param [in] a3 The third argument to the functor.
+   * \param [in] a4 The fourth argument to the functor.
+   * \param [in] a5 The fifth argument to the functor.
+   * \param [in] a6 The sixth argument to the functor.
+   * \param [in] a7 The seventh argument to the functor.
+   * \param [in] a8 The eighth argument to the functor.
    */
   void operator() (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8) const;
   /**@}*/
@@ -225,14 +225,14 @@
   /**
    * Container type for holding the chain of Callbacks.
    *
-   * \tparam T1 Type of the first argument to the functor.
-   * \tparam T2 Type of the second argument to the functor.
-   * \tparam T3 Type of the third argument to the functor.
-   * \tparam T4 Type of the fourth argument to the functor.
-   * \tparam T5 Type of the fifth argument to the functor.
-   * \tparam T6 Type of the sixth argument to the functor.
-   * \tparam T7 Type of the seventh argument to the functor.
-   * \tparam T8 Type of the eighth argument to the functor.
+   * \tparam T1 \deduced Type of the first argument to the functor.
+   * \tparam T2 \deduced Type of the second argument to the functor.
+   * \tparam T3 \deduced Type of the third argument to the functor.
+   * \tparam T4 \deduced Type of the fourth argument to the functor.
+   * \tparam T5 \deduced Type of the fifth argument to the functor.
+   * \tparam T6 \deduced Type of the sixth argument to the functor.
+   * \tparam T7 \deduced Type of the seventh argument to the functor.
+   * \tparam T8 \deduced Type of the eighth argument to the functor.
    */
   typedef std::list<Callback<void,T1,T2,T3,T4,T5,T6,T7,T8> > CallbackList;
   /** The chain of Callbacks. */
@@ -264,7 +264,8 @@
 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::ConnectWithoutContext (const CallbackBase & callback)
 {
   Callback<void,T1,T2,T3,T4,T5,T6,T7,T8> cb;
-  cb.Assign (callback);
+  if (!cb.Assign (callback))
+    NS_FATAL_ERROR_NO_MSG();
   m_callbackList.push_back (cb);
 }
 template<typename T1, typename T2,
@@ -275,7 +276,8 @@
 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::Connect (const CallbackBase & callback, std::string path)
 {
   Callback<void,std::string,T1,T2,T3,T4,T5,T6,T7,T8> cb;
-  cb.Assign (callback);
+  if (!cb.Assign (callback))
+    NS_FATAL_ERROR ("when connecting to " << path);
   Callback<void,T1,T2,T3,T4,T5,T6,T7,T8> realCb = cb.Bind (path);
   m_callbackList.push_back (realCb);
 }
@@ -307,7 +309,8 @@
 TracedCallback<T1,T2,T3,T4,T5,T6,T7,T8>::Disconnect (const CallbackBase & callback, std::string path)
 {
   Callback<void,std::string,T1,T2,T3,T4,T5,T6,T7,T8> cb;
-  cb.Assign (callback);
+  if (!cb.Assign (callback))
+    NS_FATAL_ERROR ("when disconnecting from " << path);
   Callback<void,T1,T2,T3,T4,T5,T6,T7,T8> realCb = cb.Bind (path);
   DisconnectWithoutContext (realCb);
 }
diff -Naur ns-3.23/src/core/model/traced-value.h ns-3.24/src/core/model/traced-value.h
--- ns-3.23/src/core/model/traced-value.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/traced-value.h	2015-09-15 11:18:44.000000000 -0700
@@ -56,13 +56,44 @@
  *        values used by the various model components.
  *
  * Additional callback function signatures defined elsewhere:
- *   - Time::TracedValueCallback
- *   - ns3::SequenceNumber32TracedValueCallback
+ *   - TracedValueCallback::Time
+ *   - TracedValueCallback::SequenceNumber32
+ *   - TracedValueCallback::LrWpanMacState
+ *   - TracedValueCallback::LrWpanPhyEnumeration
  */
 
 /**
  * \ingroup tracing
  *
+ * \brief TracedValue Callback function types.
+ */
+namespace TracedValueCallback {
+
+  /**
+   * \name TracedValueCallback Signatures for POD.
+   * @{
+   */
+  /**
+   *  TracedValue Callback signature for POD.
+   *
+   * \param [in] oldValue original value of the traced variable
+   * \param [in] newValue new value of the traced variable
+   */
+  typedef void (* Bool)  (bool     oldValue, bool     newValue);
+  typedef void (* Int8)  (int8_t   oldValue, int8_t   newValue);
+  typedef void (* Uint8) (uint8_t  oldValue, uint8_t  newValue);
+  typedef void (* Int16) (int16_t  oldValue, int16_t  newValue);
+  typedef void (* Uint16)(uint16_t oldValue, uint16_t newValue);
+  typedef void (* Int32) (int32_t  oldValue, int32_t  newValue);
+  typedef void (* Uint32)(uint32_t oldValue, uint32_t newValue);
+  typedef void (* Double)(double   oldValue, double   newValue);
+  /**@}*/
+}  // namespace TracedValueCallback
+
+  
+/**
+ * \ingroup tracing
+ *
  * \brief Trace classes with value semantics
  *
  * If you want to trace the change of value of a class or
@@ -73,7 +104,7 @@
  * and will define Connect/DisconnectWithoutContext methods to work
  * with MakeTraceSourceAccessor.
  *
- * \tparam T The type of the underlying value being traced.
+ * \tparam T \explicit The type of the underlying value being traced.
  */
 template <typename T>
 class TracedValue
@@ -84,13 +115,13 @@
     : m_v () {}
   /**
    * Copy constructor.
-   * \param o The value to copy.
+   * \param [in] o The value to copy.
    */
   TracedValue (const TracedValue &o)
     : m_v (o.m_v) {}
   /**
    * Construct from an explicit variable.
-   * \param v The variable to trace.
+   * \param [in] v The variable to trace.
    */
   TracedValue (const T &v)
     : m_v (v) {}
@@ -103,7 +134,7 @@
   }
   /**
    * Assignment.
-   * \param o The value to assign to this instance.
+   * \param [in] o The value to assign to this instance.
    * \return This TracedValue.
    */
   TracedValue &operator = (const TracedValue &o) {
@@ -113,8 +144,8 @@
   }
   /**
    * Copy from a TracedValue of a compatable type.
-   * \tparam U The underlying type of the other TracedValue.
-   * \param other The other TracedValuet to copy.
+   * \tparam U \deduced The underlying type of the other TracedValue.
+   * \param [in] other The other TracedValuet to copy.
    */
   template <typename U>
   TracedValue (const TracedValue<U> &other)
@@ -122,8 +153,8 @@
   {}
   /**
    * Copy from a variable type compatible with this underlying type.
-   * \tparam U Type of the other variable.
-   * \param other The other variable to copy.
+   * \tparam U \deduced Type of the other variable.
+   * \param [in] other The other variable to copy.
    */
   template <typename U>
   TracedValue (const U &other)
@@ -132,7 +163,7 @@
   /**
    * Connect a Callback (without context.)
    *
-   * \param cb The callback to connect.
+   * \param [in] cb The callback to connect.
    */
   void ConnectWithoutContext (const CallbackBase &cb) {
     m_cb.ConnectWithoutContext (cb);
@@ -143,8 +174,8 @@
    * The context string will be provided as the first argument to the
    * Callback function.
    *
-   * \param cb The Callback to connect to the target trace source.
-   * \param path The context to bind to the user callback.
+   * \param [in] cb The Callback to connect to the target trace source.
+   * \param [in] path The context to bind to the user callback.
    */
   void Connect (const CallbackBase &cb, std::string path) {
     m_cb.Connect (cb, path);
@@ -152,7 +183,7 @@
   /**
    * Disconnect a Callback which was connected without context.
    *
-   * \param cb The Callback to disconnect.
+   * \param [in] cb The Callback to disconnect.
    */
   void DisconnectWithoutContext (const CallbackBase &cb) {
     m_cb.DisconnectWithoutContext (cb);
@@ -160,8 +191,8 @@
   /**
    * Disconnect a Callback which was connected with context.
    *
-   * \param cb The Callback to disconnect.
-   * \param path The context to bind to the user callback.
+   * \param [in] cb The Callback to disconnect.
+   * \param [in] path The context to bind to the user callback.
    */
   void Disconnect (const CallbackBase &cb, std::string path) {
     m_cb.Disconnect (cb, path);
@@ -170,7 +201,7 @@
    * Set the value of the underlying variable.
    *
    * If the new value differs from the old, the Callback will be invoked.
-   * \param v The new value.
+   * \param [in] v The new value.
    */
   void Set (const T &v) {
     if (m_v != v)
@@ -225,23 +256,6 @@
   }
   /**@}*/
 
-  /**
-   *  TracedValue Callback signature for POD.
-   *
-   * \param [in] oldValue original value of the traced variable
-   * \param [in] newValue new value of the traced variable
-   * @{
-   */
-  typedef void (* BoolCallback)  (const bool     oldValue, const bool     newValue);
-  typedef void (* Int8Callback)  (const int8_t   oldValue, const int8_t   newValue);
-  typedef void (* Uint8Callback) (const uint8_t  oldValue, const uint8_t  newValue);
-  typedef void (* Int16Callback) (const int16_t  oldValue, const int16_t  newValue);
-  typedef void (* Uint16Callback)(const uint16_t oldValue, const uint16_t newValue);
-  typedef void (* Int32Callback) (const int32_t  oldValue, const int32_t  newValue);
-  typedef void (* Uint32Callback)(const uint32_t oldValue, const uint32_t newValue);
-  typedef void (* DoubleCallback)(const double   oldValue, const double   newValue);
-  /**@}*/
-
 private:
   /** The underlying value. */
   T m_v;
@@ -263,9 +277,9 @@
  *
  * The underlying value will be written to the stream.
  *
- * \tparam T The underlying type of the TracedValue.
- * \param os The output stream.
- * \param rhs The TracedValue to stream.
+ * \tparam T \deduced The underlying type of the TracedValue.
+ * \param [in,out] os The output stream.
+ * \param [in] rhs The TracedValue to stream.
  * \returns The stream.
  */
 template <typename T>
@@ -276,10 +290,10 @@
 
 /**
  * Boolean operator for TracedValue.
- * \tparam T The underlying type held by the left-hand argument.
- * \tparam U The underlying type held by the right-hand argument.
- * \param lhs The left-hand argument.
- * \param rhs The right-hand argument.
+ * \tparam T \deduced The underlying type held by the left-hand argument.
+ * \tparam U \deduced The underlying type held by the right-hand argument.
+ * \param [in] lhs The left-hand argument.
+ * \param [in] rhs The right-hand argument.
  * \returns The boolean result of comparing the underlying values.
  */
 template <typename T, typename U>
@@ -418,10 +432,10 @@
  * This returns the arithmetic result in a new TracedValue,
  * which has no Callback connected.
  *
- * \tparam T The underlying type held by the left-hand argument.
- * \tparam U The underlying type held by the right-hand argument.
- * \param lhs The left-hand argument.
- * \param rhs The right-hand argument.
+ * \tparam T \deduced The underlying type held by the left-hand argument.
+ * \tparam U \deduced The underlying type held by the right-hand argument.
+ * \param [in] lhs The left-hand argument.
+ * \param [in] rhs The right-hand argument.
  * \returns The result of doing the operator on
  *     the underlying values.
  */
@@ -621,10 +635,10 @@
  * is assigned to the \c lhs TracedValue.  If the new value 
  * is different, the Callback will be invoked.
  *
- * \tparam T The underlying type held by the left-hand argument.
- * \tparam U The underlying type held by the right-hand argument.
- * \param lhs The left-hand argument.
- * \param rhs The right-hand argument.
+ * \tparam T \deduced The underlying type held by the left-hand argument.
+ * \tparam U \deduced The underlying type held by the right-hand argument.
+ * \param [in] lhs The left-hand argument.
+ * \param [in] rhs The right-hand argument.
  * \returns The result of doing the operator on
  *     the underlying values.
  */
@@ -722,8 +736,8 @@
 /**
  * Unary arithmetic operator for TracedValue.
  *
- * \tparam T The underlying type held by the TracedValue.
- * \param lhs The TracedValue.
+ * \tparam T \deduced The underlying type held by the TracedValue.
+ * \param [in] lhs The TracedValue.
  * \returns The result of doing the operator on
  *     the underlying values.
  */
diff -Naur ns-3.23/src/core/model/trace-source-accessor.h ns-3.24/src/core/model/trace-source-accessor.h
--- ns-3.23/src/core/model/trace-source-accessor.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/trace-source-accessor.h	2015-09-15 11:18:44.000000000 -0700
@@ -54,8 +54,8 @@
   /**
    * Connect a Callback to a TraceSource (without context.)
    *
-   * \param obj The object instance which contains the target trace source.
-   * \param cb The callback to connect to the target trace source.
+   * \param [in] obj The object instance which contains the target trace source.
+   * \param [in] cb The callback to connect to the target trace source.
    * \return \c true unless the connection could not be made, typically because
    *         the \c obj couldn't be cast to the correct type.
    */
@@ -66,9 +66,9 @@
    * The context string will be provided as the first argument to the
    * Callback function.
    *
-   * \param obj The object instance which contains the target trace source.
-   * \param context The context to bind to the user callback.
-   * \param cb The callback to connect to the target trace source.
+   * \param [in] obj The object instance which contains the target trace source.
+   * \param [in] context The context to bind to the user callback.
+   * \param [in] cb The callback to connect to the target trace source.
    * \return \c true unless the connection could not be made, typically because
    *         the \c obj couldn't be cast to the correct type.
    */
@@ -76,8 +76,8 @@
   /**
    * Disconnect a Callback from a TraceSource (without context).
    *
-   * \param obj The object instance which contains the target trace source.
-   * \param cb The callback to disconnect from the target trace source.
+   * \param [in] obj The object instance which contains the target trace source.
+   * \param [in] cb The callback to disconnect from the target trace source.
    * \return \c true unless the connection could not be made, typically because
    *         the \c obj couldn't be cast to the correct type.
    */
@@ -88,9 +88,9 @@
    * The context string will be provided as the first argument to the
    * Callback function.
    *
-   * \param obj the object instance which contains the target trace source.
-   * \param context the context which was bound to the user callback.
-   * \param cb the callback to disconnect from the target trace source.
+   * \param [in] obj the object instance which contains the target trace source.
+   * \param [in] context the context which was bound to the user callback.
+   * \param [in] cb the callback to disconnect from the target trace source.
    * \return \c true unless the connection could not be made, typically because
    *         the \c obj couldn't be cast to the correct type.
    */
@@ -109,7 +109,7 @@
  * static-polymorphic class.  This functionality is typically provided
  * by wrapping an object data member in a TracedCallback.
  *
- * \param a the trace source
+ * \param [in] a The trace source
  * \returns The TraceSourceAccessor
  */
 template <typename T>
@@ -128,9 +128,9 @@
  * \ingroup tracing
  * MakeTraceSourceAccessor() implementation.
  *
- * \tparam T Class type of the TracedCallback
- * \tparam SOURCE Type of the underlying value.
- * \param a The underlying data value.
+ * \tparam T \deduced Class type of the TracedCallback
+ * \tparam SOURCE \deduced Type of the underlying value.
+ * \param [in] a The underlying data value.
  * \returns The TraceSourceAccessor
  */
 template <typename T, typename SOURCE>
diff -Naur ns-3.23/src/core/model/type-id.cc ns-3.24/src/core/model/type-id.cc
--- ns-3.23/src/core/model/type-id.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/type-id.cc	2015-09-15 11:18:44.000000000 -0700
@@ -47,6 +47,7 @@
 // to find g_log
 
 /**
+ * \ingroup object
  * \brief TypeId information manager
  *
  * Information records are stored in a vector.  Name and hash lookup
@@ -74,89 +75,276 @@
  * collisions.  The three-fold collision probability should be an
  * acceptablly small error rate.
  */
-class IidManager
+class IidManager : public Singleton<IidManager>
 {
 public:
-  IidManager ();
+  /**
+   * Create a new unique type id.
+   * \param [in] name The name of this type id.
+   * \returns The id.
+   */
   uint16_t AllocateUid (std::string name);
+  /**
+   * Set the parent of a type id.
+   * \param [in] uid The id.
+   * \param [in] parent The id of the parent.
+   */
   void SetParent (uint16_t uid, uint16_t parent);
+  /**
+   * Set the group name of a type id.
+   * \param [in] uid The id.
+   * \param [in] groupName The group name.
+   */
   void SetGroupName (uint16_t uid, std::string groupName);
+  /**
+   * Set the size of the object class referred to by this id.
+   * \param [in] uid The id.
+   * \param [in] size The object size.
+   */
   void SetSize (uint16_t uid, std::size_t size);
+  /**
+   * Add a constructor Callback to this type id.
+   * \param [in] uid The id.
+   * \param [in] callback The Callback for the constructor.
+   */
   void AddConstructor (uint16_t uid, Callback<ObjectBase *> callback);
+  /**
+   * Mark this type id to be excluded from documentation.
+   * \param [in] uid The id.
+   */
   void HideFromDocumentation (uint16_t uid);
+  /**
+   * Get a type id by name.
+   * \param [in] name The type id to find.
+   * \returns The type id.  A type id of 0 means \p name wasn't found.
+   */
   uint16_t GetUid (std::string name) const;
+  /**
+   * Get a type id by hash value.
+   * \param [in] hash The type id to find.
+   * \returns The type id.  A type id of 0 means \p hash wasn't found.
+   */
   uint16_t GetUid (TypeId::hash_t hash) const;
+  /**
+   * Get the name of a type id.
+   * \param [in] uid The id.
+   * \returns The name of the type id.
+   */
   std::string GetName (uint16_t uid) const;
+  /**
+   * Get the hash of a type id.
+   * \param [in] uid The id.
+   * \returns The hash of the type id.
+   */
   TypeId::hash_t GetHash (uint16_t uid) const;
+  /**
+   * Get the parent of a type id.
+   * \param [in] uid The id.
+   * \returns The parent type id of the type id.
+   */
   uint16_t GetParent (uint16_t uid) const;
+  /**
+   * Get the group name of a type id.
+   * \param [in] uid The id.
+   * \returns The group name of the type id.
+   */
   std::string GetGroupName (uint16_t uid) const;
+  /**
+   * Get the size of a type id.
+   * \param [in] uid The id.
+   * \returns The size of the type id.
+   */
   std::size_t GetSize (uint16_t uid) const;
+  /**
+   * Get the constructor Callback of a type id.
+   * \param [in] uid The id.
+   * \returns The constructor Callback of the type id.
+   */
   Callback<ObjectBase *> GetConstructor (uint16_t uid) const;
+  /**
+   * Check if a type id has a constructor Callback.
+   * \param [in] uid The id.
+   * \returns \c true if the type id has a constructor Callback.
+   */
   bool HasConstructor (uint16_t uid) const;
+  /**
+   * Get the total number of type ids.
+   * \returns The total number.
+   */
   uint32_t GetRegisteredN (void) const;
+  /**
+   * Get a type id by index.
+   *
+   * The type id value 0 indicates not registerd, so there is an offset
+   * of 1 between the index and the type id value.  This function converts
+   * from an index to the type id value.
+   * \param [in] i The index.
+   * \returns The type id.
+   */
   uint16_t GetRegistered (uint32_t i) const;
-  void AddAttribute (uint16_t uid, 
+  /**
+   * Record a new attribute in a type id.
+   * \param [in] uid The id.
+   * \param [in] name The name of the new attribute
+   * \param [in] help Some help text which describes the purpose of this
+   *             attribute.
+   * \param [in] flags Flags which describe how this attribute can be
+   *             read and/or written.
+   * \param [in] initialValue The initial value for this attribute.
+   * \param [in] accessor An instance of the associated AttributeAccessor
+   *             subclass.
+   * \param [in] checker An instance of the associated AttributeChecker
+   *             subclass.
+   */
+  void AddAttribute (uint16_t uid,
                      std::string name,
                      std::string help, 
                      uint32_t flags,
                      Ptr<const AttributeValue> initialValue,
-                     Ptr<const AttributeAccessor> spec,
+                     Ptr<const AttributeAccessor> accessor,
                      Ptr<const AttributeChecker> checker);
+  /**
+   * Set the initial value of an Attribute.
+   * \param [in] uid The id.
+   * \param [in] i The attribute to manipulate
+   * \param [in] initialValue The new initial value to use for this attribute.
+   */
   void SetAttributeInitialValue(uint16_t uid,
                                 uint32_t i,
                                 Ptr<const AttributeValue> initialValue);
+  /**
+   * Get the number of attributes.
+   * \param [in] uid The id.
+   * \returns The number of attributes associated to this TypeId
+   */
   uint32_t GetAttributeN (uint16_t uid) const;
+  /**
+   * Get Attribute information by index.
+   * \param [in] uid The id.
+   * \param [in] i Index into attribute array
+   * \returns The information associated to attribute whose index is \p i.
+   */
   struct TypeId::AttributeInformation GetAttribute(uint16_t uid, uint32_t i) const;
+  /**
+   * Record a new TraceSource.
+   * \param [in] uid The id.
+   * \param [in] name The name of the new trace source
+   * \param [in] help Some help text which describes the purpose of this
+   *             trace source.
+   * \param [in] accessor A pointer to a TraceSourceAccessor which can be
+   *             used to connect/disconnect sinks to this trace source.
+   * \param [in] callback Fully qualified typedef name for the callback
+   *             signature.  Generally this should begin with the
+   *             "ns3::" namespace qualifier.  
+   * \returns This TypeId instance.
+   */
   void AddTraceSource (uint16_t uid,
                        std::string name, 
                        std::string help,
                        Ptr<const TraceSourceAccessor> accessor,
                        std::string callback);
+  /**
+   * Get the number of Trace sources.
+   * \param [in] uid The id.
+   * \returns The number of trace sources defined in this TypeId.
+   */
   uint32_t GetTraceSourceN (uint16_t uid) const;
+  /**
+   * Get the trace source by index.
+   * \param [in] uid The id.
+   * \param [in] i Index into trace source array.
+   * \returns Detailed information about the requested trace source.
+   */
   struct TypeId::TraceSourceInformation GetTraceSource(uint16_t uid, uint32_t i) const;
+  /**
+   * Check if this TypeId should not be listed in documentation.
+   * \param [in] uid The id.
+   * \returns \c true if this TypeId should be hidden from the user.
+   */
   bool MustHideFromDocumentation (uint16_t uid) const;
 
 private:
+  /**
+   * Check if a type id has a given TraceSource.
+   * \param [in] uid The id.
+   * \param [in] name The TraceSource name.
+   * \returns \c true if \p uid has the TraceSource \p name.
+   */
   bool HasTraceSource (uint16_t uid, std::string name);
+  /**
+   * Check if a type id has a given Attribute.
+   * \param [in] uid The id.
+   * \param [in] name The Attribute name.
+   * \returns \c true if \p uid has the Attribute \p name.
+   */
   bool HasAttribute (uint16_t uid, std::string name);
+  /**
+   * Hashing function.
+   * \param [in] name The type id name.
+   * \returns The hashed value of \p name.
+   */
   static TypeId::hash_t Hasher (const std::string name);
 
+  /** The information record about a single type id. */
   struct IidInformation {
+    /** The type id name. */
     std::string name;
+    /** The type id hash value. */
     TypeId::hash_t hash;
+    /** The parent type id. */
     uint16_t parent;
+    /** The group name. */
     std::string groupName;
+    /** The size of the object represented by this type id. */
     std::size_t size;
+    /** \c true if a constructor Callback has been registered. */
     bool hasConstructor;
+    /** The constructor Callback. */
     Callback<ObjectBase *> constructor;
+    /** \c true if this type should be omitted from documentation. */
     bool mustHideFromDocumentation;
+    /** The container of Attributes. */
     std::vector<struct TypeId::AttributeInformation> attributes;
+    /** The container of TraceSources. */
     std::vector<struct TypeId::TraceSourceInformation> traceSources;
   };
+  /** Iterator type. */
   typedef std::vector<struct IidInformation>::const_iterator Iterator;
 
+  /**
+   * Retrieve the information record for a type.
+   * \param [in] uid The id.
+   * \returns The information record.
+   */
   struct IidManager::IidInformation *LookupInformation (uint16_t uid) const;
 
+  /** The container of all type id records. */
   std::vector<struct IidInformation> m_information;
 
+  /** Type of the by-name index. */
   typedef std::map<std::string, uint16_t> namemap_t;
+  /** The by-name index. */
   namemap_t m_namemap;
 
+  /** Type of the by-hash index. */
   typedef std::map<TypeId::hash_t, uint16_t> hashmap_t;
+  /** The by-hash index. */
   hashmap_t m_hashmap;
 
-  
-  // To handle the first collision, we reserve the high bit as a
-  // chain flag:
-  enum { HashChainFlag = 0x80000000};
+
+  enum {
+    /**
+     * Hash chaining flag.
+     *
+     * To handle the first collision, we reserve the high bit as a
+     * chain flag.
+     */
+    HashChainFlag = 0x80000000
+  };
 };
 
-IidManager::IidManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
 
-  //static
+//static
 TypeId::hash_t
 IidManager::Hasher (const std::string name)
 {
@@ -548,7 +736,7 @@
 TypeId::TypeId (const char *name)
 {
   NS_LOG_FUNCTION (this << name);
-  uint16_t uid = Singleton<IidManager>::Get ()->AllocateUid (name);
+  uint16_t uid = IidManager::Get ()->AllocateUid (name);
   NS_ASSERT (uid != 0);
   m_tid = uid;
 }
@@ -563,7 +751,7 @@
 TypeId::LookupByName (std::string name)
 {
   NS_LOG_FUNCTION (name);
-  uint16_t uid = Singleton<IidManager>::Get ()->GetUid (name);
+  uint16_t uid = IidManager::Get ()->GetUid (name);
   NS_ASSERT_MSG (uid != 0, "Assert in TypeId::LookupByName: " << name << " not found");
   return TypeId (uid);
 }
@@ -571,7 +759,7 @@
 TypeId::LookupByNameFailSafe (std::string name, TypeId *tid)
 {
   NS_LOG_FUNCTION (name << tid);
-  uint16_t uid = Singleton<IidManager>::Get ()->GetUid (name);
+  uint16_t uid = IidManager::Get ()->GetUid (name);
   if (uid == 0)
     {
       return false;
@@ -582,7 +770,7 @@
 TypeId
 TypeId::LookupByHash (hash_t hash)
 {
-  uint16_t uid = Singleton<IidManager>::Get ()->GetUid (hash);
+  uint16_t uid = IidManager::Get ()->GetUid (hash);
   NS_ASSERT_MSG (uid != 0, "Assert in TypeId::LookupByHash: 0x"
                  << std::hex << hash << std::dec << " not found");
   return TypeId (uid);
@@ -590,7 +778,7 @@
 bool
 TypeId::LookupByHashFailSafe (hash_t hash, TypeId *tid)
 {
-  uint16_t uid = Singleton<IidManager>::Get ()->GetUid (hash);
+  uint16_t uid = IidManager::Get ()->GetUid (hash);
   if (uid == 0)
     {
       return false;
@@ -603,13 +791,13 @@
 TypeId::GetRegisteredN (void)
 {
   NS_LOG_FUNCTION_NOARGS ();
-  return Singleton<IidManager>::Get ()->GetRegisteredN ();
+  return IidManager::Get ()->GetRegisteredN ();
 }
 TypeId 
 TypeId::GetRegistered (uint32_t i)
 {
   NS_LOG_FUNCTION (i);
-  return TypeId (Singleton<IidManager>::Get ()->GetRegistered (i));
+  return TypeId (IidManager::Get ()->GetRegistered (i));
 }
 
 bool
@@ -638,35 +826,35 @@
 TypeId::SetParent (TypeId tid)
 {
   NS_LOG_FUNCTION (this << tid);
-  Singleton<IidManager>::Get ()->SetParent (m_tid, tid.m_tid);
+  IidManager::Get ()->SetParent (m_tid, tid.m_tid);
   return *this;
 }
 TypeId 
 TypeId::SetGroupName (std::string groupName)
 {
   NS_LOG_FUNCTION (this << groupName);
-  Singleton<IidManager>::Get ()->SetGroupName (m_tid, groupName);
+  IidManager::Get ()->SetGroupName (m_tid, groupName);
   return *this;
 }
 TypeId 
 TypeId::SetSize (std::size_t size)
 {
   NS_LOG_FUNCTION (this << size);
-  Singleton<IidManager>::Get ()->SetSize (m_tid, size);
+  IidManager::Get ()->SetSize (m_tid, size);
   return *this;
 }
 TypeId 
 TypeId::GetParent (void) const
 {
   NS_LOG_FUNCTION (this);
-  uint16_t parent = Singleton<IidManager>::Get ()->GetParent (m_tid);
+  uint16_t parent = IidManager::Get ()->GetParent (m_tid);
   return TypeId (parent);
 }
 bool 
 TypeId::HasParent (void) const
 {
   NS_LOG_FUNCTION (this);
-  uint16_t parent = Singleton<IidManager>::Get ()->GetParent (m_tid);
+  uint16_t parent = IidManager::Get ()->GetParent (m_tid);
   return parent != m_tid;
 }
 bool 
@@ -684,7 +872,7 @@
 TypeId::GetGroupName (void) const
 {
   NS_LOG_FUNCTION (this);
-  std::string groupName = Singleton<IidManager>::Get ()->GetGroupName (m_tid);
+  std::string groupName = IidManager::Get ()->GetGroupName (m_tid);
   return groupName;
 }
 
@@ -692,21 +880,21 @@
 TypeId::GetName (void) const
 {
   NS_LOG_FUNCTION (this);
-  std::string name = Singleton<IidManager>::Get ()->GetName (m_tid);
+  std::string name = IidManager::Get ()->GetName (m_tid);
   return name;
 }
 
 TypeId::hash_t
 TypeId::GetHash (void) const
 {
-  hash_t hash = Singleton<IidManager>::Get ()->GetHash (m_tid);
+  hash_t hash = IidManager::Get ()->GetHash (m_tid);
   return hash;
 }
 std::size_t
 TypeId::GetSize (void) const
 {
   NS_LOG_FUNCTION (this);
-  std::size_t size = Singleton<IidManager>::Get ()->GetSize (m_tid);
+  std::size_t size = IidManager::Get ()->GetSize (m_tid);
   return size;
 }
 
@@ -714,7 +902,7 @@
 TypeId::HasConstructor (void) const
 {
   NS_LOG_FUNCTION (this);
-  bool hasConstructor = Singleton<IidManager>::Get ()->HasConstructor (m_tid);
+  bool hasConstructor = IidManager::Get ()->HasConstructor (m_tid);
   return hasConstructor;
 }
 
@@ -722,7 +910,7 @@
 TypeId::DoAddConstructor (Callback<ObjectBase *> cb)
 {
   NS_LOG_FUNCTION (this << &cb);
-  Singleton<IidManager>::Get ()->AddConstructor (m_tid, cb);
+  IidManager::Get ()->AddConstructor (m_tid, cb);
 }
 
 TypeId 
@@ -733,7 +921,7 @@
                       Ptr<const AttributeChecker> checker)
 {
   NS_LOG_FUNCTION (this << name << help << &initialValue << accessor << checker);
-  Singleton<IidManager>::Get ()->AddAttribute (m_tid, name, help, ATTR_SGC, initialValue.Copy (), accessor, checker);
+  IidManager::Get ()->AddAttribute (m_tid, name, help, ATTR_SGC, initialValue.Copy (), accessor, checker);
   return *this;
 }
 
@@ -746,7 +934,7 @@
                       Ptr<const AttributeChecker> checker)
 {
   NS_LOG_FUNCTION (this << name << help << flags << &initialValue << accessor << checker);
-  Singleton<IidManager>::Get ()->AddAttribute (m_tid, name, help, flags, initialValue.Copy (), accessor, checker);
+  IidManager::Get ()->AddAttribute (m_tid, name, help, flags, initialValue.Copy (), accessor, checker);
   return *this;
 }
 
@@ -755,7 +943,7 @@
                                  Ptr<const AttributeValue> initialValue)
 {
   NS_LOG_FUNCTION (this << i << initialValue);
-  Singleton<IidManager>::Get ()->SetAttributeInitialValue (m_tid, i, initialValue);
+  IidManager::Get ()->SetAttributeInitialValue (m_tid, i, initialValue);
   return true;
 }
 
@@ -764,7 +952,7 @@
 TypeId::GetConstructor (void) const
 {
   NS_LOG_FUNCTION (this);
-  Callback<ObjectBase *>  cb = Singleton<IidManager>::Get ()->GetConstructor (m_tid);
+  Callback<ObjectBase *>  cb = IidManager::Get ()->GetConstructor (m_tid);
   return cb;
 }
 
@@ -772,7 +960,7 @@
 TypeId::MustHideFromDocumentation (void) const
 {
   NS_LOG_FUNCTION (this);
-  bool mustHide = Singleton<IidManager>::Get ()->MustHideFromDocumentation (m_tid);
+  bool mustHide = IidManager::Get ()->MustHideFromDocumentation (m_tid);
   return mustHide;
 }
 
@@ -780,14 +968,14 @@
 TypeId::GetAttributeN (void) const
 {
   NS_LOG_FUNCTION (this);
-  uint32_t n = Singleton<IidManager>::Get ()->GetAttributeN (m_tid);
+  uint32_t n = IidManager::Get ()->GetAttributeN (m_tid);
   return n;
 }
 struct TypeId::AttributeInformation 
 TypeId::GetAttribute(uint32_t i) const
 {
   NS_LOG_FUNCTION (this << i);
-  return Singleton<IidManager>::Get ()->GetAttribute(m_tid, i);
+  return IidManager::Get ()->GetAttribute(m_tid, i);
 }
 std::string 
 TypeId::GetAttributeFullName (uint32_t i) const
@@ -801,13 +989,13 @@
 TypeId::GetTraceSourceN (void) const
 {
   NS_LOG_FUNCTION (this);
-  return Singleton<IidManager>::Get ()->GetTraceSourceN (m_tid);
+  return IidManager::Get ()->GetTraceSourceN (m_tid);
 }
 struct TypeId::TraceSourceInformation 
 TypeId::GetTraceSource(uint32_t i) const
 {
   NS_LOG_FUNCTION (this << i);
-  return Singleton<IidManager>::Get ()->GetTraceSource(m_tid, i);
+  return IidManager::Get ()->GetTraceSource(m_tid, i);
 }
 
 TypeId 
@@ -825,7 +1013,7 @@
                         std::string callback)
 {
   NS_LOG_FUNCTION (this << name << help << accessor);
-  Singleton<IidManager>::Get ()->AddTraceSource (m_tid, name, help, accessor, callback);
+  IidManager::Get ()->AddTraceSource (m_tid, name, help, accessor, callback);
   return *this;
 }
 
@@ -833,7 +1021,7 @@
 TypeId::HideFromDocumentation (void)
 {
   NS_LOG_FUNCTION (this);
-  Singleton<IidManager>::Get ()->HideFromDocumentation (m_tid);
+  IidManager::Get ()->HideFromDocumentation (m_tid);
   return *this;
 }
 
diff -Naur ns-3.23/src/core/model/type-id.h ns-3.24/src/core/model/type-id.h
--- ns-3.23/src/core/model/type-id.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/type-id.h	2015-09-15 11:18:44.000000000 -0700
@@ -41,6 +41,7 @@
 class ObjectBase;
 
 /**
+ * \ingroup object
  * \brief a unique identifier for an interface.
  *
  * This class records a lot of meta-information about a 
@@ -57,80 +58,102 @@
 class TypeId
 {
 public:
-  /**
-   * Flags describing when a given attribute can be read or written
-   */
+  /** Flags describing when a given attribute can be read or written. */
   enum AttributeFlag {
     ATTR_GET = 1<<0, /**< The attribute can be read */
     ATTR_SET = 1<<1, /**< The attribute can be written */
     ATTR_CONSTRUCT = 1<<2, /**< The attribute can be written at construction-time */
     ATTR_SGC = ATTR_GET | ATTR_SET | ATTR_CONSTRUCT, /**< The attribute can be read, and written at any time */
   };
+  /** Attribute implementation. */
   struct AttributeInformation {
+    /** Attribute name. */
     std::string name;
+    /** Attribute help string. */
     std::string help;
+    /** AttributeFlags value. */
     uint32_t flags;
+    /** Default initial value. */
     Ptr<const AttributeValue> originalInitialValue;
+    /** Configured initial value. */
     Ptr<const AttributeValue> initialValue;
+    /** Accessor object. */
     Ptr<const AttributeAccessor> accessor;
+    /** Checker object. */
     Ptr<const AttributeChecker> checker;
   };
+  /** TraceSource implementation. */
   struct TraceSourceInformation {
+    /** Trace name. */
     std::string name;
+    /** Trace help string. */
     std::string help;
+    /** Callback function signature type. */
     std::string callback;
+    /** Trace accessor. */
     Ptr<const TraceSourceAccessor> accessor;
   };
 
-  /**
-   * Type of hash values
-   */
+  /** Type of hash values. */
   typedef uint32_t hash_t;
 
   /**
-   * \param name the name of the requested TypeId
-   * \returns the unique id associated with the requested
-   *          name. 
+   * Get a TypeId by name.
+   *
+   * \param [in] name The name of the requested TypeId
+   * \returns The unique id associated with the requested name. 
    *
    * This method cannot fail: it will crash if the input 
    * name is not a valid TypeId name.
    */
   static TypeId LookupByName (std::string name);
   /**
-   * \param name the name of the requested TypeId
-   * \param tid a pointer to the TypeId instance where the 
-   *        result of this function should be stored.
-   * \returns true if the requested name was found, false otherwise.
+   * Get a TypeId by name.
+   * 
+   * \param [in]  name The name of the requested TypeId
+   * \param [out] tid A pointer to the TypeId instance where the 
+   *              result of this function should be stored.
+   * \returns \c true if the requested name was found.
    */
   static bool LookupByNameFailSafe (std::string name, TypeId *tid);
   /**
-   * \param hash the hash to lookup
-   * \returns the unique id associated with the requested hash.
+   * Get a TypeId by hash.
+   *
+   * \param [in] hash The hash to lookup
+   * \returns The unique id associated with the requested hash.
    *
    * This method cannot fail: it will crash if the input 
    * hash does not match an existing TypeId.
    */
   static TypeId LookupByHash (hash_t hash);
   /**
-   * \param hash the hash of the requested TypeId
-   * \param tid a pointer to the TypeId instance where the 
-   *        result of this function should be stored.
-   * \returns true if the requested hash was found, false otherwise.
+   * Get a TypeId by hash.
+   *
+   * \param [in]  hash The hash of the requested TypeId
+   * \param [out] tid A pointer to the TypeId instance where the 
+   *              result of this function should be stored.
+   * \returns \c true if the requested hash was found.
    */
   static bool LookupByHashFailSafe (hash_t hash, TypeId *tid);
 
   /**
-   * \returns the number of TypeId instances registered.
+   * Get the number of registered TypeIds.
+   *
+   * \returns The number of TypeId instances registered.
    */
   static uint32_t GetRegisteredN (void);
   /**
-   * \param i index
-   * \returns the TypeId instance whose index is i.
+   * Get a TypeId by index.
+   *
+   * \param [in] i Index of the TypeId.
+   * \returns The TypeId instance whose index is \c i.
    */
   static TypeId GetRegistered (uint32_t i);
 
   /**
-   * \param name the name of the interface to construct.
+   * Constructor.
+   *
+   * \param [in] name The name of the interface to construct.
    *
    * No two instances can share the same name. The name is expected to be
    * the full c++ typename of associated c++ object.
@@ -138,22 +161,30 @@
   explicit TypeId (const char * name);
 
   /**
-   * \returns the parent of this TypeId
+   * Get the parent of this TypeId.
+   *
+   * \returns The parent of this TypeId
    *
    * This method cannot fail. It will return itself
    * if this TypeId has no parent. i.e., it is at the top
    * of the TypeId hierarchy. Currently, this is the
-   * case for the TypeId associated to the Object class 
+   * case for the TypeId associated to the ns3::ObjectBase class 
    * only.
    */
   TypeId GetParent (void) const;
-
+  
+  /**
+   * Check if this TypeId has a parent.
+   *
+   * \return \c true if this TypeId has a parent.
+   */
   bool HasParent (void) const;
 
   /**
-   * \param other a parent TypeId
-   * \returns true if the input TypeId is really a parent
-   *          of this TypeId, false otherwise.
+   * Check if this TypeId is a child of another.
+   *
+   * \param [in] other A parent TypeId
+   * \returns \c true if the input TypeId is really a parent of this TypeId.
    *
    * Calling this method is roughly similar to calling dynamic_cast
    * except that you do not need object instances: you can do the check
@@ -162,80 +193,106 @@
   bool IsChildOf (TypeId other) const;
 
   /**
-   * \returns the name of the group associated to this TypeId.
+   * Get the group name.
+   *
+   * \returns The name of the group associated to this TypeId.
    */
   std::string GetGroupName (void) const;
 
   /**
-   * \returns the name of this interface.
+   * Get the name.
+   *
+   * \returns The name of this interface.
    */
   std::string GetName (void) const;
 
   /**
-   * \returns the hash of this interface.
+   * Get the hash.
+   *
+   * \returns The hash of this interface.
    */
   hash_t GetHash (void) const;
 
   /**
-   * \returns the size of this interface.
+   * Get the size of this object.
+   *
+   * \returns The size of this interface.
    */
   std::size_t GetSize (void) const;
 
   /**
-   * \returns true if this TypeId has a constructor
+   * Check if this TypeId has a constructor.
+   *
+   * \returns \c true if this TypeId has a constructor
    */
   bool HasConstructor (void) const;
 
   /**
-   * \returns the number of attributes associated to this TypeId
+   * Get the number of attributes.
+   *
+   * \returns The number of attributes associated to this TypeId
    */
   uint32_t GetAttributeN (void) const;
   /**
-   * \param i index into attribute array
-   * \returns the information associated to attribute whose 
-   *          index is i.
+   * Get Attribute information by index.
+   *
+   * \param [in] i Index into attribute array
+   * \returns The information associated to attribute whose index is \p i.
    */
   struct TypeId::AttributeInformation GetAttribute(uint32_t i) const;
   /**
-   * \param i index into attribute array
-   * \returns the full name associated to the attribute whose
-   *          index is i.
+   * Get the Attribute name by index.
+   *
+   * \param [in] i Index into attribute array
+   * \returns The full name associated to the attribute whose index is \p i.
    */
   std::string GetAttributeFullName (uint32_t i) const;
 
   /**
-   * \returns a callback which can be used to instanciate an object
+   * Get the constructor callback.
+   *
+   * \returns A callback which can be used to instanciate an object
    *          of this type.
    */
   Callback<ObjectBase *> GetConstructor (void) const;
 
   /**
-   * \returns true if this TypeId should be hidden from the user, 
-   *          false otherwise.
+   * Check if this TypeId should not be listed in documentation.
+   *
+   * \returns \c true if this TypeId should be hidden from the user.
    */
   bool MustHideFromDocumentation (void) const;
 
 
   /**
-   * \returns the number of trace sources defined in this TypeId.
+   * Get the number of Trace sources.
+   *
+   * \returns The number of trace sources defined in this TypeId.
    */
   uint32_t GetTraceSourceN (void) const;
   /**
-   * \param i index into trace source array.
-   * \returns detailed information about the requested trace source.
+   * Get the trace source by index.
+   *
+   * \param [in] i Index into trace source array.
+   * \returns Detailed information about the requested trace source.
    */
   struct TypeId::TraceSourceInformation GetTraceSource(uint32_t i) const;
 
   /**
-   * \param tid the TypeId of the base class.
-   * \return this TypeId instance.
+   * Set the parent TypeId.
+   *
+   * \param [in] tid The TypeId of the base class.
+   * \return This TypeId instance.
    *
    * Record in this TypeId which TypeId is the TypeId
    * of the base class of the subclass.
    */
   TypeId SetParent (TypeId tid);
   /**
-   * \return this TypeId instance.
+   * Set the parent TypeId.
+   *
+   * \tparam T \explicit The parent TypeID type.
+   * \return This TypeId instance.
    *
    * Record in this TypeId which TypeId is the TypeId
    * of the base class of the subclass.
@@ -244,8 +301,10 @@
   TypeId SetParent (void);
 
   /**
-   * \param groupName the name of the group this TypeId belongs to.
-   * \returns this TypeId instance.
+   * Set the group name.
+   *
+   * \param [in] groupName The name of the group this TypeId belongs to.
+   * \returns This TypeId instance.
    *
    * The group name is purely an advisory information used to 
    * group together types according to a user-specific grouping
@@ -254,7 +313,7 @@
   TypeId SetGroupName (std::string groupName);
 
   /**
-   * Set the size of this type, based on the \p sizeof operator.
+   * Set the size of this type.
    *
    * Call this way:
    * \code
@@ -264,30 +323,33 @@
    * A ridiculously large reported size is a symptom that the
    * type hasn't been registered.
    *
-   * \param size The size of the object, in bytes.
-   * \returns this TypeId instance.
+   * \param [in] size The size of the object, in bytes.
+   * \returns This TypeId instance.
    */
   TypeId SetSize (std::size_t size);
   
   /**
-   * \returns this TypeId instance
-   *
    * Record in this TypeId the fact that the default constructor
    * is accessible.
+   *
+   * \tparam T \explicit The class name represented by this TypeId.
+   * \returns This TypeId instance
    */
   template <typename T>
   TypeId AddConstructor (void);
 
   /**
-   * \param name the name of the new attribute
-   * \param help some help text which describes the purpose of this
-   *        attribute.
-   * \param initialValue the initial value for this attribute.
-   * \param accessor an instance of the associated AttributeAccessor subclass.
-   * \param checker an instance of the associated AttributeChecker subclass.
-   * \returns this TypeId instance
-   *
    * Record in this TypeId the fact that a new attribute exists.
+   *
+   * \param [in] name The name of the new attribute
+   * \param [in] help Some help text which describes the purpose of this
+   *             attribute.
+   * \param [in] initialValue The initial value for this attribute.
+   * \param [in] accessor An instance of the associated AttributeAccessor
+   *             subclass.
+   * \param [in] checker An instance of the associated AttributeChecker
+   *             subclass.
+   * \returns This TypeId instance
    */
   TypeId AddAttribute (std::string name,
                        std::string help, 
@@ -296,24 +358,28 @@
                        Ptr<const AttributeChecker> checker);
 
   /**
-   * \param i the attribute to manipulate
-   * \param initialValue the new initial value to use for this attribute.
-   * \returns true if the call was successfuly, false otherwise.
+   * Set the initial value of an Attribute.
+   *
+   * \param [in] i The attribute to manipulate
+   * \param [in] initialValue The new initial value to use for this attribute.
+   * \returns \c true if the call was successfuly.
    */
   bool SetAttributeInitialValue(uint32_t i, 
                                 Ptr<const AttributeValue> initialValue);
 
   /**
-   * \param name the name of the new attribute
-   * \param help some help text which describes the purpose of this
-   *        attribute
-   * \param flags flags which describe how this attribute can be read and/or written.
-   * \param initialValue the initial value for this attribute.
-   * \param accessor an instance of the associated AttributeAccessor subclass.
-   * \param checker an instance of the associated AttributeChecker subclass.
-   * \returns this TypeId instance
-   *
    * Record in this TypeId the fact that a new attribute exists.
+   *
+   * \param [in] name The name of the new attribute
+   * \param [in] help Some help text which describes the purpose of this
+   *        attribute
+   * \param [in] flags Flags which describe how this attribute can be read and/or written.
+   * \param [in] initialValue The initial value for this attribute.
+   * \param [in] accessor An instance of the associated AttributeAccessor
+   *             subclass.
+   * \param [in] checker An instance of the associated AttributeChecker
+   *             subclass.
+   * \returns This TypeId instance
    */
   TypeId AddAttribute (std::string name,
                        std::string help, 
@@ -323,13 +389,13 @@
                        Ptr<const AttributeChecker> checker);
 
   /**
-   * \param name the name of the new trace source
-   * \param help some help text which describes the purpose of this
-   *        trace source.
-   * \param accessor a pointer to a TraceSourceAccessor which can be
-   *        used to connect/disconnect sinks to this trace source.
-   * \param callback fully qualified typedef name for the callback signature.
-   *        Generally this should begin with the "ns3::" namespace qualifier.
+   * Record a new TraceSource.
+   *
+   * \param [in] name The name of the new trace source
+   * \param [in] help Some help text which describes the purpose of this
+   *             trace source.
+   * \param [in] accessor A pointer to a TraceSourceAccessor which can be
+   *             used to connect/disconnect sinks to this trace source.
    * \returns this TypeId instance.
    */
   TypeId AddTraceSource (std::string name,
@@ -338,80 +404,146 @@
     NS_DEPRECATED;
   
   /**
-   * \param name the name of the new trace source
-   * \param help some help text which describes the purpose of this
-   *        trace source.
-   * \param accessor a pointer to a TraceSourceAccessor which can be
-   *        used to connect/disconnect sinks to this trace source.
-   * \param callback fully qualified typedef name for the callback signature.
-   *        Generally this should begin with the "ns3::" namespace qualifier.
-   * \returns this TypeId instance.
+   * Record a new TraceSource.
+   *
+   * \param [in] name The name of the new trace source
+   * \param [in] help Some help text which describes the purpose of this
+   *             trace source.
+   * \param [in] accessor A pointer to a TraceSourceAccessor which can be
+   *             used to connect/disconnect sinks to this trace source.
+   * \param [in] callback Fully qualified typedef name for the callback
+   *             signature.  Generally this should begin with the
+   *             "ns3::" namespace qualifier.
+   * \returns This TypeId instance.
    */
   TypeId AddTraceSource (std::string name,
                          std::string help,
                          Ptr<const TraceSourceAccessor> accessor,
                          std::string callback);
 
+  /**
+   * Hide this TypeId from documentation.
+   * \returns This TypeId instance.
+   */
   TypeId HideFromDocumentation (void);
 
   /**
-   * \param name the name of the requested attribute
-   * \param info a pointer to the TypeId::AttributeInformation data structure
-   *        where the result value of this method will be stored.
-   * \returns true if the requested attribute could be found, false otherwise.
+   * Find an Attribute by name.
+   *
+   * \param [in]  name The name of the requested attribute
+   * \param [out] info A pointer to the TypeId::AttributeInformation
+   *              data structure where the result value of this method
+   *              will be stored.
+   * \returns \c true if the requested attribute could be found.
    */
   bool LookupAttributeByName (std::string name, struct AttributeInformation *info) const;
   /**
-   * \param name the name of the requested trace source
-   * \returns the trace source accessor which can be used to connect and disconnect
-   *          trace sinks with the requested trace source on an object instance.
+   * Find a TraceSource by name.
    *
    * If no matching trace source is found, this method returns zero.
+   *
+   * \param [in] name The name of the requested trace source
+   * \returns The trace source accessor which can be used to connect
+   *  and disconnect trace sinks with the requested trace source on
+   *  an object instance.
    */
   Ptr<const TraceSourceAccessor> LookupTraceSourceByName (std::string name) const;
 
   /**
-   * \returns the internal integer which uniquely identifies this
-   *          TypeId.
+   * Get the internal id of this TypeId.
+   *
+   * \returns The internal integer which uniquely identifies this TypeId.
    *
    * This is really an internal method which users are not expected
    * to use.
    */
   uint16_t GetUid (void) const;
   /**
-   * \param tid the internal integer which uniquely identifies 
-   *        this TypeId.
+   * Set the internal id of this TypeId.
+   *
+   * \param [in] tid The internal integer which uniquely identifies
+   *            this TypeId.  This TypeId should already have been registered.
    *
-   * This method is even more internal than TypeId::GetUid. Use
+   * Typically this is used in serialization/deserialization.
+   *
+   * This method is even more internal than GetUid(). Use
    * at your own risk and don't be surprised that it eats raw 
    * babies on full-moon nights.
    */
   void SetUid (uint16_t tid);
 
-  // construct an invalid TypeId.
+  /** Default constructor.  This produces an invalid TypeId. */
   inline TypeId ();
+  /**
+   * Copy constructor.
+   * \param [in] o The other TypeId.
+   */
   inline TypeId (const TypeId &o);
+  /**
+   * Assignment.
+   * \param [in] o The other TypeId.
+   * \returns The copied TypeId.
+   */
   inline TypeId &operator = (const TypeId &o);
+  /** Destructor. */
   inline ~TypeId ();
 
 private:
-  friend class AttributeList;
-  friend bool operator == (TypeId a, TypeId b);
-  friend bool operator != (TypeId a, TypeId b);
-  friend bool operator <  (TypeId a, TypeId b);
-
+  /**
+   * \name Comparison operators.
+   * Standard comparison operators.
+   * @{
+   */
+  friend inline bool operator == (TypeId a, TypeId b);
+  friend inline bool operator != (TypeId a, TypeId b);
+  friend  bool operator <  (TypeId a, TypeId b);
+  /**@}*/
 
+  /**
+   * Construct from an integer value.
+   * \param [in] tid The TypeId value as an integer.
+   */
   explicit TypeId (uint16_t tid);
+  /**
+   * Implementation for AddConstructor().
+   *
+   * \param [in] callback Callback which constructs an instance of this TypeId.
+   */
   void DoAddConstructor (Callback<ObjectBase *> callback);
-
+  
+  /** The TypeId value. */ 
   uint16_t m_tid;
 };
-  
+
+/**
+ * \relates TypeId
+ * Output streamer.
+ *
+ * \param [in,out] os The output stream.
+ * \param [in] tid The TypeId.
+ * \returns The output stream.
+ */
 std::ostream & operator << (std::ostream &os, TypeId tid);
+/**
+ * \relates TypeId
+ * Input Streamer.
+ * \param [in,out] is The input stream.
+ * \param [out] tid The TypeId to set from the stream.
+ * \returns The input stream.
+ */
 std::istream & operator >> (std::istream &is, TypeId &tid);
+  
+ /**
+  * Comparison operator.
+  * \param [in] a One value.
+  * \param [in] b The other value.
+  * \returns The result of the comparison.
+  * @{
+  */
 inline bool operator == (TypeId a, TypeId b);
 inline bool operator != (TypeId a, TypeId b);
 bool operator <  (TypeId a, TypeId b);
+/** @} */
 
 ATTRIBUTE_HELPER_HEADER (TypeId);
 
diff -Naur ns-3.23/src/core/model/type-name.h ns-3.24/src/core/model/type-name.h
--- ns-3.23/src/core/model/type-name.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/type-name.h	2015-09-15 11:18:44.000000000 -0700
@@ -35,7 +35,7 @@
  * \ingroup attributeimpl
  * Type name strings for numeric AttributeValue types.
  *
- * \tparam T The numeric type.
+ * \tparam T \explicit The numeric type.
  * \returns The numeric type name as a string.
  */
 template <typename T>
diff -Naur ns-3.23/src/core/model/type-traits.h ns-3.24/src/core/model/type-traits.h
--- ns-3.23/src/core/model/type-traits.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/type-traits.h	2015-09-15 11:18:44.000000000 -0700
@@ -20,302 +20,581 @@
 #ifndef TYPE_TRAITS_H
 #define TYPE_TRAITS_H
 
+#include "ptr.h"
+
 /**
- * \file
- * \ingroup object
- * TypeTraits introspection template.
+ *  \file
+ *  \ingroup object
+ *  TypeTraits introspection template.
  */
 
-/** Type trait reference values */
+/**
+ * \ingroup object
+ *  Inspect a type to deduce its features.
+ *  \tparam T \deduced The type to inspect.
+ */
 template <typename T>
 struct TypeTraits
 {
 private:
-  struct NullType {};                             //!< Null value type traits
-  template <typename U> struct UnConst            //!< Non-const type
+  /** Null value type traits. */
+  struct NullType {};
+  /**
+   *  Not a const type.
+   *  \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct UnConst
+  {
+    typedef U Result;                             /**< Non-const type.       */
+  };
+  /**
+   *  Const type.
+   *  \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct UnConst<const U>
   {
-    typedef U Result;                             //!< Non-const result type
+    typedef U Result;                             /**< Non-const type.       */
   };
-  template <typename U> struct UnConst<const U>   //!< Non-const template type traits
+  /**
+   *  Not a reference type.
+   *  \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct ReferenceTraits
   {
-    typedef U Result;                             //!< Non-const result type
+    /** Value. */  enum { IsReference = 0         /**< Not a reference type. */ };
+    typedef U ReferencedType;                     /**< Base type.            */
   };
-  template <typename U> struct ReferenceTraits    //!< Non-reference type traits
-  {
-    enum { IsReference = 0                        /**< Non-reference value */ };
-    typedef U ReferencedType;                     //!< Non-referenced result type
-  };
-  template <typename U> struct ReferenceTraits<U&>//!< Reference type traits
-  {
-    enum { IsReference = 1                        /**< Reference value */ };
-    typedef U ReferencedType;                     //!< Referenced result type
-  };
-  template <typename U> struct PointerTraits      //!< Non-pointer type traits
-  {
-    enum { IsPointer = 0};                        //!< Non-pointer value
-    typedef U PointeeType;                        //!< Non-pointer result type
-  };
-  template <typename U> struct PointerTraits<U *> //!< Pointer type traits
-  {
-    enum { IsPointer = 1};                        //!< Pointer value
-    typedef U PointeeType;                        //!< Pointer result type
-  };
-  template <typename U> struct FunctionPtrTraits  //!< Non-function pointer type traits
-  {
-    enum { IsFunctionPointer = 0};                //!< Non-function pointer value
-    typedef NullType ReturnType;                  //!< Non-function pointer result type
-  };
-  template <typename U> 
-  struct FunctionPtrTraits <U (*)(void)>          //!< Function pointer type traits
-  {
-    enum { IsFunctionPointer = 1};                //!< Function pointer value
-    enum { nArgs = 0};                            //!< Number of arguments
-    typedef U ReturnType;                         //!< Return type
-  };
-  template <typename U, typename V1> 
-  struct FunctionPtrTraits <U (*)(V1)>            //!< Function pointer type traits
-  {						                                   
-    enum { IsFunctionPointer = 1};                //!< Function pointer value	   
-    enum { nArgs = 1};				  //!< Number of arguments	   
-    typedef U ReturnType;			  //!< Return type
-    typedef V1 Arg1Type;                          //!< First argument type
-  };
-  template <typename U, typename V1, typename V2> 
-  struct FunctionPtrTraits <U (*)(V1,V2)>         //!< Function pointer type traits
-  {						                                   
-    enum { IsFunctionPointer = 1};		  //!< Function pointer value	   
-    enum { nArgs = 2};				  //!< Number of arguments	   
-    typedef U ReturnType;			  //!< Return type
-    typedef V1 Arg1Type;			  //!< First argument type	   
-    typedef V2 Arg2Type;                          //!< Second argument type
-  };
-  template <typename U, typename V1, typename V2,
-            typename V3> 
-  struct FunctionPtrTraits <U (*)(V1,V2,V3)>      //!< Function pointer type traits
-  {						                                   
-    enum { IsFunctionPointer = 1};		  //!< Function pointer value	   
-    enum { nArgs = 3};				  //!< Number of arguments	   
-    typedef U ReturnType;			  //!< Return type
-    typedef V1 Arg1Type;			  //!< First argument type	   
-    typedef V2 Arg2Type;			  //!< Second argument type	   
-    typedef V3 Arg3Type;                          //!< Third argument type
-  };
-  template <typename U, typename V1, typename V2,
-            typename V3, typename V4> 
-  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4)>   //!< Function pointer type traits
-  {						                                   
-    enum { IsFunctionPointer = 1};		  //!< Function pointer value	   
-    enum { nArgs = 4};				  //!< Number of arguments	   
-    typedef U ReturnType;			  //!< Return type
-    typedef V1 Arg1Type;			  //!< First argument type	   
-    typedef V2 Arg2Type;			  //!< Second argument type	   
-    typedef V3 Arg3Type;			  //!< Third argument type	   
-    typedef V4 Arg4Type;                          //!< Fourth argument type
-  };
-  template <typename U, typename V1, typename V2,
-            typename V3, typename V4,
-            typename V5> 
-  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5)>//!< Function pointer type traits
-  {						                                   
-    enum { IsFunctionPointer = 1};		  //!< Function pointer value	   
-    enum { nArgs = 5};				  //!< Number of arguments	   
-    typedef U ReturnType;			  //!< Return type
-    typedef V1 Arg1Type;			  //!< First argument type	   
-    typedef V2 Arg2Type;			  //!< Second argument type	   
-    typedef V3 Arg3Type;			  //!< Third argument type	   
-    typedef V4 Arg4Type;			  //!< Fourth argument type	   
-    typedef V5 Arg5Type;                          //!< Fifth argument type
-  };
-  template <typename U, typename V1, typename V2,
-            typename V3, typename V4,
-            typename V5, typename V6> 
-  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5,V6)>  //!< Function pointer type traits
-  {						                                        
-    enum { IsFunctionPointer = 1};		       //!< Function pointer value	   
-    enum { nArgs = 6};				       //!< Number of arguments	   
-    typedef U ReturnType;			       //!< Return type
-    typedef V1 Arg1Type;			       //!< First argument type	   
-    typedef V2 Arg2Type;			       //!< Second argument type	   
-    typedef V3 Arg3Type;			       //!< Third argument type	   
-    typedef V4 Arg4Type;			       //!< Fourth argument type	   
-    typedef V5 Arg5Type;			       //!< Fifth argument type	   
-    typedef V6 Arg6Type;                               //!< Sixth argument type
-  };
-  template <typename U> struct PtrToMemberTraits  //!< Pointer to member type traits
-  {
-    enum { IsPointerToMember = 0};                //!< Non-pointer to member value
-  };
-  template <typename U, typename V> 
-  struct PtrToMemberTraits <U (V::*) (void)>      //!< Pointer to member type traits
-  {
-    enum { IsPointerToMember = 1};                //!< Pointer to member value
-    enum { nArgs = 0};                            //!< Number of arguments
-    typedef U ReturnType;                         //!< Return type
-  };
-  template <typename U, typename V> 
-  struct PtrToMemberTraits <U (V::*) (void) const>//!< Pointer to const member type traits
-  {						                                    
-    enum { IsPointerToMember = 1};		  //!< Pointer to member value	    
-    enum { nArgs = 0};				  //!< Number of arguments	    
-    typedef U ReturnType;			  //!< Return type		    
-  };
-  template <typename U, typename V,typename W1> 
-  struct PtrToMemberTraits <U (V::*) (W1)>        //!< Pointer to member type traits
-  {						                                    
-    enum { IsPointerToMember = 1};		  //!< Pointer to member value	    
-    enum { nArgs = 1};				  //!< Number of arguments	    
-    typedef U ReturnType;			  //!< Return type		    
-    typedef W1 Arg1Type;                          //!< First argument type
-  };
-  template <typename U, typename V,typename W1> 
-  struct PtrToMemberTraits <U (V::*) (W1) const>  //!< Pointer to const member type traits
-  {						                                    	  
-    enum { IsPointerToMember = 1};		  //!< Pointer to member value	    	  
-    enum { nArgs = 1};				  //!< Number of arguments	    	  
-    typedef U ReturnType;			  //!< Return type		    	  
-    typedef W1 Arg1Type;                          //!< First argument type
-  };
-  template <typename U, typename V,typename W1, typename W2> 
-  struct PtrToMemberTraits <U (V::*) (W1,W2)>     //!< Pointer to member type traits
-  {						                                    
-    enum { IsPointerToMember = 1};		  //!< Pointer to member value	    
-    enum { nArgs = 2};				  //!< Number of arguments	    
-    typedef U ReturnType;			  //!< Return type		    
-    typedef W1 Arg1Type;			  //!< First argument type	    
-    typedef W2 Arg2Type;			  //!< Second argument type	    
-  };
-  template <typename U, typename V,typename W1, typename W2> 
-  struct PtrToMemberTraits <U (V::*) (W1,W2) const>  //!< Pointer to const member type traits
-  {						                                       	  
-    enum { IsPointerToMember = 1};		     //!< Pointer to member value	    	  
-    enum { nArgs = 2};				     //!< Number of arguments	    	  
-    typedef U ReturnType;			     //!< Return type		    	  
-    typedef W1 Arg1Type;			     //!< First argument type		  
-    typedef W2 Arg2Type;			     //!< Second argument type		  
-  };
-  template <typename U, typename V,
-            typename W1, typename W2,
-            typename W3> 
-  struct PtrToMemberTraits <U (V::*) (W1,W2,W3)>  //!< Pointer to member type traits
-  {						                                    
-    enum { IsPointerToMember = 1};		  //!< Pointer to member value	    
-    enum { nArgs = 3};				  //!< Number of arguments	    
-    typedef U ReturnType;			  //!< Return type		    
-    typedef W1 Arg1Type;			  //!< First argument type	    
-    typedef W2 Arg2Type;			  //!< Second argument type	    
-    typedef W3 Arg3Type;			  //!< Third argument type	    
-  };
-  template <typename U, typename V,
-            typename W1, typename W2,
-            typename W3> 
-  struct PtrToMemberTraits <U (V::*) (W1,W2,W3) const>  //!< Pointer to const member type traits
-  {							                                  	     
-    enum { IsPointerToMember = 1};			//!< Pointer to member value	     
-    enum { nArgs = 3};					//!< Number of arguments	    	     
-    typedef U ReturnType;				//!< Return type		    	     
-    typedef W1 Arg1Type;				//!< First argument type		     
-    typedef W2 Arg2Type;				//!< Second argument type		     
-    typedef W3 Arg3Type;				//!< Third argument type		     
-  };
-  template <typename U, typename V,
-            typename W1, typename W2,
-            typename W3, typename W4> 
-  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4)>  //!< Pointer to member type traits
-  {						                                       
-    enum { IsPointerToMember = 1};		     //!< Pointer to member value	    
-    enum { nArgs = 4};				     //!< Number of arguments	    
-    typedef U ReturnType;			     //!< Return type		    
-    typedef W1 Arg1Type;			     //!< First argument type	    
-    typedef W2 Arg2Type;			     //!< Second argument type	    
-    typedef W3 Arg3Type;			     //!< Third argument type	    
-    typedef W4 Arg4Type;			     //!< Fourth argument type	    
-  };
-  template <typename U, typename V,
-            typename W1, typename W2,
-            typename W3, typename W4> 
-  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4) const>  //!< Pointer to const member type traits
-  {							                                     	
-    enum { IsPointerToMember = 1};			   //!< Pointer to member value	     	
-    enum { nArgs = 4};					   //!< Number of arguments	    	
-    typedef U ReturnType;				   //!< Return type		    	
-    typedef W1 Arg1Type;				   //!< First argument type		
-    typedef W2 Arg2Type;				   //!< Second argument type		
-    typedef W3 Arg3Type;				   //!< Third argument type		
-    typedef W4 Arg4Type;				   //!< Fourth argument type		
-  };
-  template <typename U, typename V,
-            typename W1, typename W2,
-            typename W3, typename W4,
-            typename W5> 
-  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5)>  //!< Pointer to member type traits
-  {							                                  
-    enum { IsPointerToMember = 1};			//!< Pointer to member value      
-    enum { nArgs = 5};					//!< Number of arguments	       
-    typedef U ReturnType;				//!< Return type		       
-    typedef W1 Arg1Type;				//!< First argument type	       
-    typedef W2 Arg2Type;				//!< Second argument type	       
-    typedef W3 Arg3Type;				//!< Third argument type	       
-    typedef W4 Arg4Type;				//!< Fourth argument type	       
-    typedef W5 Arg5Type;				//!< Fifth argument type	       
-  };
-  template <typename U, typename V,
-            typename W1, typename W2,
-            typename W3, typename W4,
-            typename W5> 
-  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5) const>  //!< Pointer to const member type traits
-  {							                                        	   
-    enum { IsPointerToMember = 1};			      //!< Pointer to member value	     	   
-    enum { nArgs = 5};					      //!< Number of arguments	    	   
-    typedef U ReturnType;				      //!< Return type		    	   
-    typedef W1 Arg1Type;				      //!< First argument type		   
-    typedef W2 Arg2Type;				      //!< Second argument type		   
-    typedef W3 Arg3Type;				      //!< Third argument type		   
-    typedef W4 Arg4Type;				      //!< Fourth argument type		   
-    typedef W5 Arg5Type;				      //!< Fifth argument type		   
-  };
-  template <typename U, typename V,
-            typename W1, typename W2,
-            typename W3, typename W4,
-            typename W5, typename W6> 
-  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5,W6)>  //!< Pointer to member type traits
-  {							                                     
-    enum { IsPointerToMember = 1};			   //!< Pointer to member value      
-    enum { nArgs = 6};					   //!< Number of arguments	  
-    typedef U ReturnType;				   //!< Return type		  
-    typedef W1 Arg1Type;				   //!< First argument type	  
-    typedef W2 Arg2Type;				   //!< Second argument type	  
-    typedef W3 Arg3Type;				   //!< Third argument type	  
-    typedef W4 Arg4Type;				   //!< Fourth argument type	  
-    typedef W5 Arg5Type;				   //!< Fifth argument type	  
-    typedef W6 Arg6Type;				   //!< Sixth argument type	  
-  };
-  template <typename U, typename V,
-            typename W1, typename W2,
-            typename W3, typename W4,
-            typename W5, typename W6> 
-  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5,W6) const>  //!< Pointer to const member type traits
-  {								                                         
-    enum { IsPointerToMember = 1};				 //!< Pointer to member value	      
-    enum { nArgs = 6};						 //!< Number of arguments	    	      
-    typedef U ReturnType;					 //!< Return type		    	      
-    typedef W1 Arg1Type;					 //!< First argument type		      
-    typedef W2 Arg2Type;					 //!< Second argument type		      
-    typedef W3 Arg3Type;					 //!< Third argument type		      
-    typedef W4 Arg4Type;					 //!< Fourth argument type		      
-    typedef W5 Arg5Type;					 //!< Fifth argument type		      
-    typedef W6 Arg6Type;					 //!< Sixth argument type		      
+  /**
+   *  Reference type.
+   *  \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct ReferenceTraits<U&>
+  {
+    /** Value. */  enum { IsReference = 1         /**< Reference type.       */ };
+    typedef U ReferencedType;                     /**< Base type.            */
+  };
+  /**
+   *  Not a pointer type.
+   *  \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct PointerTraits
+  {
+    /** Value. */  enum { IsPointer = 0,          /**< Not a pointer type.   */
+                          IsPtr = 0               /**< Not a Ptr type.       */};
+    typedef U PointeeType;                        /**< Base type.            */
+  };
+  /**
+   *  Pointer type.
+   *  \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct PointerTraits<U *>
+  {
+    /** Value. */  enum { IsPointer = 1,          /**< Pointer type.         */
+                          IsPtr = 0               /**< Not a Ptr type.       */};
+    typedef U PointeeType;                        /**< Pointee type.         */
+  };  
+  /**
+   *  Ptr type.
+   *  \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct PointerTraits<ns3::Ptr<U> >
+  {
+    /** Value. */  enum { IsPointer = 0,          /**< Not a pointer type.   */
+                          IsPtr = 1               /**< Ptr type.             */};
+    typedef U PointeeType;                        /**< Pointee type.         */
+  };
+  /**
+   * Base type, after removing \c &, \c * and \c const.
+   * \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct Base
+  {
+    typedef U Type;                               /**< Base type.            */
+  };
+  /**
+   * Base type, after removing \c &.
+   * \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct Base <U &>
+  {
+    typedef typename Base<U>::Type Type;          /**< Base type.            */
+  };
+  /**
+   * Base type, after removing \c *.
+   * \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct Base <U *>
+  {
+    typedef typename Base<U>::Type  Type;         /**< Base type.            */
+  };
+  /**
+   * Base type, after removing \c const.
+   * \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct Base <const U >
+  {
+    typedef typename Base<U>::Type  Type;         /**< Base type.            */
+  };
+  /**
+   * Base type of a Ptr.
+   * \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct PtrBase
+  {
+    typedef U Type;                               /**< Base type.            */
+  };
+  /**
+   * Base type of a Ptr.
+   * \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct PtrBase <ns3::Ptr<U> >
+  {
+    typedef U Type;                               /**< Base type.            */
+  };
+  /**
+   *  Not a function pointer type.
+   *  \tparam U \deduced The type being inspected.
+   */
+  template <typename U> struct FunctionPtrTraits
+  {
+    /** Value. */  enum { IsFunctionPointer = 0   /**< Not a function pointer. */ };
+    typedef NullType ReturnType;                  /**< Return type.            */
+  };
+  /**
+   *  Function pointer type.
+   *  \tparam U \deduced Return type.
+   */
+  template <typename U>
+  struct FunctionPtrTraits <U (*)(void)>
+  {
+    /** Value. */  enum { IsFunctionPointer = 1   /**< Function pointer.     */ };
+    /** Value. */  enum { nArgs = 0               /**< Number of arguments.  */ };
+    typedef U ReturnType;                         /**< Return type.          */
+  };
+  /**
+   *  Function pointer type.
+   *  \tparam U \deduced Return type.
+   *  \tparam V1 \deduced Argument type.
+   */
+  template <typename U,
+            typename V1>
+  struct FunctionPtrTraits <U (*)(V1)>
+  {
+    /** Value. */  enum { IsFunctionPointer = 1   /**< Function pointer.     */ };
+    /** Value. */  enum { nArgs = 1               /**< Number of arguments.  */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef V1 Arg1Type;                          /**< First argument type.  */
+  };
+  /**
+   *  Function pointer type.
+   *  \tparam U \deduced Return type.
+   *  \tparam V1 \deduced Argument type.
+   *  \tparam V2 \deduced Argument type.
+   */
+  template <typename U,
+            typename V1, typename V2>
+  struct FunctionPtrTraits <U (*)(V1,V2)>
+  {
+    /** Value. */  enum { IsFunctionPointer = 1   /**< Function pointer.     */ };
+    /** Value. */  enum { nArgs = 2               /**< Number of arguments.  */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef V1 Arg1Type;                          /**< First argument type.  */
+    typedef V2 Arg2Type;                          /**< Second argument type. */
+  };
+  /**
+   *  Function pointer type.
+   *  \tparam U \deduced Return type.
+   *  \tparam V1 \deduced Argument type.
+   *  \tparam V2 \deduced Argument type.
+   *  \tparam V3 \deduced Argument type.
+   */
+  template <typename U,
+            typename V1, typename V2, typename V3>
+  struct FunctionPtrTraits <U (*)(V1,V2,V3)>
+  {
+    /** Value. */  enum { IsFunctionPointer = 1   /**< Function pointer.     */ };
+    /** Value. */  enum { nArgs = 3               /**< Number of arguments.  */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef V1 Arg1Type;                          /**< First argument type.  */
+    typedef V2 Arg2Type;                          /**< Second argument type. */
+    typedef V3 Arg3Type;                          /**< Third argument type.  */
+  };
+  /**
+   *  Function pointer type.
+   *  \tparam U \deduced Return type.
+   *  \tparam V1 \deduced Argument type.
+   *  \tparam V2 \deduced Argument type.
+   *  \tparam V3 \deduced Argument type.
+   *  \tparam V4 \deduced Argument type.
+   */
+  template <typename U,
+            typename V1, typename V2, typename V3,
+            typename V4>
+  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4)>
+  {
+    /** Value. */  enum { IsFunctionPointer = 1   /**< Function pointer.     */ };
+    /** Value. */  enum { nArgs = 4               /**< Number of arguments.  */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef V1 Arg1Type;                          /**< First argument type.  */
+    typedef V2 Arg2Type;                          /**< Second argument type. */
+    typedef V3 Arg3Type;                          /**< Third argument type.  */
+    typedef V4 Arg4Type;                          /**< Fourth argument type. */
+  };
+  /**
+   *  Function pointer type.
+   *  \tparam U \deduced Return type.
+   *  \tparam V1 \deduced Argument type.
+   *  \tparam V2 \deduced Argument type.
+   *  \tparam V3 \deduced Argument type.
+   *  \tparam V4 \deduced Argument type.
+   *  \tparam V5 \deduced Argument type.
+   */
+  template <typename U,
+            typename V1, typename V2, typename V3,
+            typename V4, typename V5>
+  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5)>
+  {
+    /** Value. */  enum { IsFunctionPointer = 1   /**< Function pointer.     */ };
+    /** Value. */  enum { nArgs = 5               /**< Number of arguments.  */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef V1 Arg1Type;                          /**< First argument type.  */
+    typedef V2 Arg2Type;                          /**< Second argument type. */
+    typedef V3 Arg3Type;                          /**< Third argument type.  */
+    typedef V4 Arg4Type;                          /**< Fourth argument type. */
+    typedef V5 Arg5Type;                          /**< Fifth argument type.  */
+  };
+  /**
+   *  Function pointer type.
+   *  \tparam U \deduced Return type.
+   *  \tparam V1 \deduced Argument type.
+   *  \tparam V2 \deduced Argument type.
+   *  \tparam V3 \deduced Argument type.
+   *  \tparam V4 \deduced Argument type.
+   *  \tparam V5 \deduced Argument type.
+   *  \tparam V6 \deduced Argument type.
+   */
+  template <typename U,
+            typename V1, typename V2, typename V3,
+            typename V4, typename V5, typename V6>
+  struct FunctionPtrTraits <U (*)(V1,V2,V3,V4,V5,V6)>
+  {
+    /** Value. */  enum { IsFunctionPointer = 1   /**< Function pointer.     */ };
+    /** Value. */  enum { nArgs = 6               /**< Number of arguments.  */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef V1 Arg1Type;                          /**< First argument type.  */
+    typedef V2 Arg2Type;                          /**< Second argument type. */
+    typedef V3 Arg3Type;                          /**< Third argument type.  */
+    typedef V4 Arg4Type;                          /**< Fourth argument type. */
+    typedef V5 Arg5Type;                          /**< Fifth argument type.  */
+    typedef V6 Arg6Type;                          /**< Sixth argument type.  */
+  };
+  /**
+   *  Not a pointer to member type.
+   *  \tparam U \deduced Return type.
+   */
+  template <typename U> struct PtrToMemberTraits
+  {
+    /** Value. */  enum { IsPointerToMember = 0   /**< Not a pointer to member.    */ };
+  };
+  /**
+   *  Pointer to member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   */
+  template <typename U,  typename V>
+  struct PtrToMemberTraits <U (V::*) (void)>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 0               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.                */
+  };
+  /**
+   *  Pointer to const member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   */
+  template <typename U,  typename V>
+  struct PtrToMemberTraits <U (V::*) (void) const>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 0               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.                */
+  };
+  /**
+   *  Pointer to member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1>
+  struct PtrToMemberTraits <U (V::*) (W1)>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 1               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+  };
+  /**
+   *  Pointer to const member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1>
+  struct PtrToMemberTraits <U (V::*) (W1) const>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 1               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+  };
+  /**
+   *  Pointer to member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   *  \tparam W2 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1, typename W2>
+  struct PtrToMemberTraits <U (V::*) (W1,W2)>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 2               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+    typedef W2 Arg2Type;                          /**< Second argument type. */
+  };
+  /**
+   *  Pointer to const member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   *  \tparam W2 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1, typename W2>
+  struct PtrToMemberTraits <U (V::*) (W1,W2) const>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 2               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+    typedef W2 Arg2Type;                          /**< Second argument type. */
+  };
+  /**
+   *  Pointer to member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   *  \tparam W2 \deduced Argument type.
+   *  \tparam W3 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1, typename W2, typename W3>
+  struct PtrToMemberTraits <U (V::*) (W1,W2,W3)>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 3               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+    typedef W2 Arg2Type;                          /**< Second argument type. */
+    typedef W3 Arg3Type;                          /**< Third argument type.  */
+  };
+  /**
+   *  Pointer to const member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   *  \tparam W2 \deduced Argument type.
+   *  \tparam W3 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1, typename W2, typename W3>
+  struct PtrToMemberTraits <U (V::*) (W1,W2,W3) const>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 3               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+    typedef W2 Arg2Type;                          /**< Second argument type. */
+    typedef W3 Arg3Type;                          /**< Third argument type.  */
+  };
+  /**
+   *  Pointer to member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   *  \tparam W2 \deduced Argument type.
+   *  \tparam W3 \deduced Argument type.
+   *  \tparam W4 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1, typename W2, typename W3,
+            typename W4>
+  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4)>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 4               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+    typedef W2 Arg2Type;                          /**< Second argument type. */
+    typedef W3 Arg3Type;                          /**< Third argument type.  */
+    typedef W4 Arg4Type;                          /**< Fourth argument type. */
+  };
+  /**
+   *  Pointer to const member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   *  \tparam W2 \deduced Argument type.
+   *  \tparam W3 \deduced Argument type.
+   *  \tparam W4 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1, typename W2, typename W3,
+            typename W4>
+  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4) const>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 4               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+    typedef W2 Arg2Type;                          /**< Second argument type. */
+    typedef W3 Arg3Type;                          /**< Third argument type.  */
+    typedef W4 Arg4Type;                          /**< Fourth argument type. */
+  };
+  /**
+   *  Pointer to member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   *  \tparam W2 \deduced Argument type.
+   *  \tparam W3 \deduced Argument type.
+   *  \tparam W4 \deduced Argument type.
+   *  \tparam W5 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1, typename W2, typename W3,
+            typename W4, typename W5>
+  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5)>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 5               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+    typedef W2 Arg2Type;                          /**< Second argument type. */
+    typedef W3 Arg3Type;                          /**< Third argument type.  */
+    typedef W4 Arg4Type;                          /**< Fourth argument type. */
+    typedef W5 Arg5Type;                          /**< Fifth argument type.  */
+  };
+  /**
+   *  Pointer to const member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   *  \tparam W2 \deduced Argument type.
+   *  \tparam W3 \deduced Argument type.
+   *  \tparam W4 \deduced Argument type.
+   *  \tparam W5 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1, typename W2, typename W3,
+            typename W4, typename W5>
+  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5) const>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 5               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+    typedef W2 Arg2Type;                          /**< Second argument type. */
+    typedef W3 Arg3Type;                          /**< Third argument type.  */
+    typedef W4 Arg4Type;                          /**< Fourth argument type. */
+    typedef W5 Arg5Type;                          /**< Fifth argument type.  */
+  };
+  /**
+   *  Pointer to member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   *  \tparam W2 \deduced Argument type.
+   *  \tparam W3 \deduced Argument type.
+   *  \tparam W4 \deduced Argument type.
+   *  \tparam W5 \deduced Argument type.
+   *  \tparam W6 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1, typename W2, typename W3,
+            typename W4, typename W5, typename W6>
+  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5,W6)>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 6               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+    typedef W2 Arg2Type;                          /**< Second argument type. */
+    typedef W3 Arg3Type;                          /**< Third argument type.  */
+    typedef W4 Arg4Type;                          /**< Fourth argument type. */
+    typedef W5 Arg5Type;                          /**< Fifth argument type.  */
+    typedef W6 Arg6Type;                          /**< Sixth argument type.  */
+  };
+  /**
+   *  Pointer to const member function.
+   *  \tparam U \deduced Return type.
+   *  \tparam V \deduced Class type.
+   *  \tparam W1 \deduced Argument type.
+   *  \tparam W2 \deduced Argument type.
+   *  \tparam W3 \deduced Argument type.
+   *  \tparam W4 \deduced Argument type.
+   *  \tparam W5 \deduced Argument type.
+   *  \tparam W6 \deduced Argument type.
+   */
+  template <typename U,  typename V,
+            typename W1, typename W2, typename W3,
+            typename W4, typename W5, typename W6>
+  struct PtrToMemberTraits <U (V::*) (W1,W2,W3,W4,W5,W6) const>
+  {
+    /** Value. */  enum { IsPointerToMember = 1   /**< Pointer to member function. */ };
+    /** Value. */  enum { nArgs = 6               /**< Number of arguments.        */ };
+    typedef U ReturnType;                         /**< Return type.          */
+    typedef W1 Arg1Type;                          /**< First argument type.  */
+    typedef W2 Arg2Type;                          /**< Second argument type. */
+    typedef W3 Arg3Type;                          /**< Third argument type.  */
+    typedef W4 Arg4Type;                          /**< Fourth argument type. */
+    typedef W5 Arg5Type;                          /**< Fifth argument type.  */
+    typedef W6 Arg6Type;                          /**< Sixth argument type.  */
   };
 
 public:
-  typedef typename UnConst<T>::Result NonConstType;                    //!< Non-const type
-  typedef typename ReferenceTraits<T>::ReferencedType ReferencedType;  //!< Referenced type
-  typedef typename PointerTraits<T>::PointeeType PointeeType;          //!< Pointee type
-  enum { IsPointerToMember = PtrToMemberTraits<T>::IsPointerToMember}; //!< Pointer to member predicate
-  enum { IsPointer = PointerTraits<T>::IsPointer};                     //!< Pointer predicate
-  enum { IsReference = ReferenceTraits<T>::IsReference};               //!< Reference predicate
-  enum { IsFunctionPointer = FunctionPtrTraits<T>::IsFunctionPointer}; //!< Function pointer predicate
-  typedef PtrToMemberTraits<T> PointerToMemberTraits;                  //!< Pointer to member traits type
-  typedef FunctionPtrTraits<T> FunctionPointerTraits;                  //!< Function pointer traits
+  /** Not a const type. */
+  typedef typename UnConst<T>::Result NonConstType;
+  /** Referenced type. */
+  typedef typename ReferenceTraits<T>::ReferencedType ReferencedType;
+  /** Pointee type. */
+  typedef typename PointerTraits<T>::PointeeType PointeeType;
+  /** Base type, after removing \c &, \c * and \c const. */
+  typedef typename Base<T>::Type BaseType;
+  /** Ptr base type. */
+  typedef typename PtrBase<T>::Type PtrBaseType;
+  /** Predicates. */
+  enum {
+    /** Pointer to member predicate. */
+    IsPointerToMember = PtrToMemberTraits<T>::IsPointerToMember,
+    /** Pointer predicate. */
+    IsPointer = PointerTraits<T>::IsPointer,
+    /** Ptr predicate. */
+    IsPtr = PointerTraits<T>::IsPtr,
+    /** Reference predicate. */
+    IsReference = ReferenceTraits<T>::IsReference,
+    /** Function pointer predicate. */
+    IsFunctionPointer = FunctionPtrTraits<T>::IsFunctionPointer
+  };
+  /** Pointer to member traits type. */
+  typedef PtrToMemberTraits<T> PointerToMemberTraits;
+  /** Function pointer traits. */
+  typedef FunctionPtrTraits<T> FunctionPointerTraits;
 };
 
 
diff -Naur ns-3.23/src/core/model/uinteger.cc ns-3.24/src/core/model/uinteger.cc
--- ns-3.23/src/core/model/uinteger.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/uinteger.cc	2015-09-15 11:18:44.000000000 -0700
@@ -40,9 +40,9 @@
  * \ingroup attribute_Uinteger
  * Make an Uinteger attribute checker with embedded numeric type name.
  *
- * \param min The minimum allowed value.
- * \param max The maximum allowed value.
- * \param name The original type name ("uint8_t", "uint16_t", _etc_.).
+ * \param [in] min The minimum allowed value.
+ * \param [in] max The maximum allowed value.
+ * \param [in] name The original type name ("uint8_t", "uint16_t", _etc_.).
  * \returns The AttributeChecker.
  */
 Ptr<const AttributeChecker> MakeUintegerChecker (uint64_t min, uint64_t max, std::string name)
diff -Naur ns-3.23/src/core/model/unix-fd-reader.h ns-3.24/src/core/model/unix-fd-reader.h
--- ns-3.23/src/core/model/unix-fd-reader.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/unix-fd-reader.h	2015-09-15 11:18:44.000000000 -0700
@@ -55,9 +55,9 @@
   /**
    * Start a new read thread.
    *
-   * \param fd A valid file descriptor open for reading.
+   * \param [in] fd A valid file descriptor open for reading.
    *
-   * \param readCallback A callback to invoke when new data is
+   * \param [in] readCallback A callback to invoke when new data is
    * available.
    */
   void Start (int fd, Callback<void, uint8_t *, ssize_t> readCallback);
@@ -80,8 +80,8 @@
     /**
      * Construct from a buffer of a given length.
      *
-     * \param buf The buffer.
-     * \param len The size of the buffer, in bytes.
+     * \param [in] buf The buffer.
+     * \param [in] len The size of the buffer, in bytes.
      */
     Data (uint8_t *buf, ssize_t len) : m_buf (buf), m_len (len) {}
     /** The read data buffer. */
diff -Naur ns-3.23/src/core/model/unix-system-condition.cc ns-3.24/src/core/model/unix-system-condition.cc
--- ns-3.23/src/core/model/unix-system-condition.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/unix-system-condition.cc	2015-09-15 11:18:44.000000000 -0700
@@ -52,7 +52,7 @@
   /**
    * Set the condition.
    *
-   * \param condition The new condition value.
+   * \param [in] condition The new condition value.
    */
   void SetCondition (bool condition);
   /**
@@ -73,7 +73,7 @@
    * Unset the condition, then wait for a limited amount of wall-clock
    * time for another thread to set it with SetCondition.
    *
-   * \param ns Maximum time to wait, in ns.
+   * \param [in] ns Maximum time to wait, in ns.
    * \returns \c true if the condition timed out; \c false if the other
    * thread set it.
    */
diff -Naur ns-3.23/src/core/model/unused.h ns-3.24/src/core/model/unused.h
--- ns-3.23/src/core/model/unused.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/unused.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 Andrey Mazo
+ *
+ * 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: Andrey Mazo <ahippo@yandex.com>
+ */
+
 #ifndef UNUSED_H
 #define UNUSED_H
 
diff -Naur ns-3.23/src/core/model/vector.h ns-3.24/src/core/model/vector.h
--- ns-3.23/src/core/model/vector.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/vector.h	2015-09-15 11:18:44.000000000 -0700
@@ -39,9 +39,9 @@
 {
 public:
   /**
-   * \param _x x coordinate of vector
-   * \param _y y coordinate of vector
-   * \param _z z coordinate of vector
+   * \param [in] _x X coordinate of vector
+   * \param [in] _y Y coordinate of vector
+   * \param [in] _z Z coordinate of vector
    *
    * Create vector (_x, _y, _z)
    */
@@ -76,8 +76,8 @@
 {
 public:
   /**
-   * \param _x x coordinate of vector
-   * \param _y y coordinate of vector
+   * \param [in] _x X coordinate of vector
+   * \param [in] _y Y coordinate of vector
    *
    * Create vector (_x, _y)
    */
@@ -101,15 +101,15 @@
 };
 
 /**
- * \param a one point
- * \param b another point
- * \returns the cartesian distance between a and b.
+ * \param [in] a One point
+ * \param [in] b Another point
+ * \returns The cartesian distance between a and b.
  */
 double CalculateDistance (const Vector3D &a, const Vector3D &b);
 /**
- * \param a one point
- * \param b another point
- * \returns the cartesian distance between a and b.
+ * \param [in] a One point
+ * \param [in] b Another point
+ * \returns The cartesian distance between a and b.
  */
 double CalculateDistance (const Vector2D &a, const Vector2D &b);
 
diff -Naur ns-3.23/src/core/model/wall-clock-synchronizer.h ns-3.24/src/core/model/wall-clock-synchronizer.h
--- ns-3.23/src/core/model/wall-clock-synchronizer.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/wall-clock-synchronizer.h	2015-09-15 11:18:44.000000000 -0700
@@ -23,8 +23,8 @@
 #include "synchronizer.h"
 
 /**
- * \file
- * \ingroup realtime
+ * @file
+ * @ingroup realtime
  * ns3::WallClockSynchronizer declaration.
  */
 
@@ -37,9 +37,9 @@
  *
  * Enable this synchronizer using:
  *
- * \code
+ * @code
  *   DefaultValue::Bind ("Synchronizer", "WallClockSynchronizer");
- * \endcode
+ * @endcode
  *
  * before calling any simulator functions.
  *
@@ -47,21 +47,21 @@
  * access to several clocks we could use as a wall clock.  We don't care about
  * time in the sense of 04:30 CEST, we care about some piece of hardware that
  * ticks at some regular period.  The most accurate posix clock in this
- * respect is the \c CLOCK_PROCESS_CPUTIME_ID clock.  This is a high-resolution
+ * respect is the @c CLOCK_PROCESS_CPUTIME_ID clock.  This is a high-resolution
  * register in the CPU.  For example, on Intel machines this corresponds to
  * the timestamp counter (TSC) register.  The resolution of this counter will
  * be on the order of nanoseconds.
  *
  * Now, just because we can measure time in nanoseconds doesn't mean we can
  * put our process to sleep to nanosecond resolution.  We are eventually going
- * to use the function \c clock_nanosleep() to sleep until a simulation Time
+ * to use the function @c clock_nanosleep() to sleep until a simulation Time
  * specified by the caller. 
  *
- * \todo Add more on jiffies, sleep, processes, etc.
+ * @todo Add more on jiffies, sleep, processes, etc.
  *
- * \internal
+ * @internal
  * Nanosleep takes a <tt>struct timeval</tt> as an input so we have to
- * deal with conversion between Time and \c timeval here.
+ * deal with conversion between Time and @c timeval here.
  * They are both interpreted as elapsed times.
  */
 class WallClockSynchronizer : public Synchronizer
@@ -69,7 +69,7 @@
 public:
   /**
    * Get the registered TypeId for this class.
-   * \returns The TypeId.
+   * @returns The TypeId.
    */
   static TypeId GetTypeId (void);
 
@@ -88,15 +88,15 @@
 protected:
   /**
    * @brief Do a busy-wait until the normalized realtime equals the argument
-   * or the condition variable becomes \c true.
+   * or the condition variable becomes @c true.
   
-   * The condition becomes \c true if an outside entity (a network device
+   * The condition becomes @c true if an outside entity (a network device
    * receives a packet), sets the condition and signals the scheduler
    * it needs to re-evaluate.
    *
-   * @param ns The target normalized real time we should wait for.
-   * @returns \c true if we reached the target time,
-   *          \c false if we retured because the condition was set.
+   * @param [in] ns The target normalized real time we should wait for.
+   * @returns @c true if we reached the target time,
+   *          @c false if we retured because the condition was set.
    */
   bool SpinWait (uint64_t ns);
   /**
@@ -114,13 +114,13 @@
    * SystemCondition we have saved in m_condition takes care of this for us.
    *
    * This call will return if the timeout expires OR if the condition is 
-   * set \c true by a call to SetCondition (true) followed by a call to
+   * set @c true by a call to SetCondition (true) followed by a call to
    * Signal().  In either case, we are done waiting.  If the timeout happened,
-   * we return \c true; if a Signal happened we return \c false.
+   * we return @c true; if a Signal happened we return @c false.
    *
-   * @param ns The target normalized real time we should wait for.
-   * @returns \c true if we reached the target time,
-   *          \c false if we retured because the condition was set.
+   * @param [in] ns The target normalized real time we should wait for.
+   * @returns @c true if we reached the target time,
+   *          @c false if we retured because the condition was set.
    */
   bool SleepWait (uint64_t ns);
 
@@ -139,8 +139,8 @@
    * @brief Compute a correction to the nominal delay to account for
    * realtime drift since the last DoSynchronize.
    *
-   * @param nsNow The current simulation time (in nanosecond units).
-   * @param nsDelay The simulation time we need to wait for (normalized to 
+   * @param [in] nsNow The current simulation time (in nanosecond units).
+   * @param [in] nsDelay The simulation time we need to wait for (normalized to 
    * nanosecond units).
    * @returns The corrected delay.
    */
@@ -160,33 +160,33 @@
   uint64_t GetNormalizedRealtime (void);
 
   /**
-   * @brief Convert an absolute time in ns to a \c timeval
+   * @brief Convert an absolute time in ns to a @c timeval
    *
-   * @param ns Absolute time in ns.
-   * @param tv Converted \c timeval.
+   * @param [in] ns Absolute time in ns.
+   * @param [out] tv Converted @c timeval.
    */
   void NsToTimeval (int64_t ns, struct timeval *tv);
   /**
-   * @brief Convert a \c timeval to absolute time, in ns.
+   * @brief Convert a @c timeval to absolute time, in ns.
    *
-   * @param tv The input \c timeval.
+   * @param [in] tv The input @c timeval.
    * @returns The absolute time, in ns.
    */
   uint64_t TimevalToNs (struct timeval *tv);
 
   /**
-   * @brief Add two \c timeval.
+   * @brief Add two @c timeval.
    *
-   * @param tv1 The first \c timeval.
-   * @param tv2 The second \c timeval.
-   * @param result The sum of \c tv1 and \c tv2.
+   * @param [in]  tv1 The first @c timeval.
+   * @param [in]  tv2 The second @c timeval.
+   * @param [out] result The sum of @c tv1 and @c tv2.
    */
   void TimevalAdd (
     struct timeval *tv1, 
     struct timeval *tv2,
     struct timeval *result);
 
-  /** Size of the system clock tick, as reported by \c clock_getres, in ns. */
+  /** Size of the system clock tick, as reported by @c clock_getres, in ns. */
   uint64_t m_jiffy;
   /** Time recorded by DoEventStart. */
   uint64_t m_nsEventStart;
diff -Naur ns-3.23/src/core/model/watchdog.h ns-3.24/src/core/model/watchdog.h
--- ns-3.23/src/core/model/watchdog.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/model/watchdog.h	2015-09-15 11:18:44.000000000 -0700
@@ -64,7 +64,7 @@
   /**
    * Delay the timer.
    *
-   * \param delay The watchdog delay
+   * \param [in] delay The watchdog delay
    *
    * After a call to this method, the watchdog will not be triggered
    * until the delay specified has been expired. This operation is
@@ -75,7 +75,7 @@
   /**
    * Set the function to execute when the timer expires.
    *
-   * \param fn The function
+   * \param [in] fn The function
    *
    * Store this function in this Timer for later use by Timer::Schedule.
    */
@@ -85,10 +85,10 @@
   /**
    * Set the function to execute when the timer expires.
    *
-   * \tparam MEM_PTR Class method function type.
-   * \tparam OBJ_PTR Class type containing the function.
-   * \param memPtr The member function pointer
-   * \param objPtr The pointer to object
+   * \tparam MEM_PTR \deduced Class method function type.
+   * \tparam OBJ_PTR \deduced Class type containing the function.
+   * \param [in] memPtr The member function pointer
+   * \param [in] objPtr The pointer to object
    *
    * Store this function and object in this Timer for later use by Timer::Schedule.
    */
@@ -101,68 +101,68 @@
    */
   /**@{*/
   /**
-   * \tparam T1 Type of the first argument.
-   * \param a1 The first argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \param [in] a1 The first argument
    */
   template <typename T1>
   void SetArguments (T1 a1);
   /**
-   * \tparam T1 Type of the first argument.
-   * \tparam T2 Type of the second argument.
-   * \param a1 the first argument
-   * \param a2 the second argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \tparam T2 \deduced Type of the second argument.
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
    */
   template <typename T1, typename T2>
   void SetArguments (T1 a1, T2 a2);
   /**
-   * \tparam T1 Type of the first argument.
-   * \tparam T2 Type of the second argument.
-   * \tparam T3 Type of the third argument.
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \tparam T2 \deduced Type of the second argument.
+   * \tparam T3 \deduced Type of the third argument.
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
    */
   template <typename T1, typename T2, typename T3>
   void SetArguments (T1 a1, T2 a2, T3 a3);
   /**
-   * \tparam T1 Type of the first argument.
-   * \tparam T2 Type of the second argument.
-   * \tparam T3 Type of the third argument.
-   * \tparam T4 Type of the fourth argument.
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
-   * \param a4 the fourth argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \tparam T2 \deduced Type of the second argument.
+   * \tparam T3 \deduced Type of the third argument.
+   * \tparam T4 \deduced Type of the fourth argument.
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
+   * \param [in] a4 the fourth argument
    */
   template <typename T1, typename T2, typename T3, typename T4>
   void SetArguments (T1 a1, T2 a2, T3 a3, T4 a4);
   /**
-   * \tparam T1 Type of the first argument.
-   * \tparam T2 Type of the second argument.
-   * \tparam T3 Type of the third argument.
-   * \tparam T4 Type of the fourth argument.
-   * \tparam T5 Type of the fifth argument.
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
-   * \param a4 the fourth argument
-   * \param a5 the fifth argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \tparam T2 \deduced Type of the second argument.
+   * \tparam T3 \deduced Type of the third argument.
+   * \tparam T4 \deduced Type of the fourth argument.
+   * \tparam T5 \deduced Type of the fifth argument.
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
+   * \param [in] a4 the fourth argument
+   * \param [in] a5 the fifth argument
    */
   template <typename T1, typename T2, typename T3, typename T4, typename T5>
   void SetArguments (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
   /**
-   * \tparam T1 Type of the first argument.
-   * \tparam T2 Type of the second argument.
-   * \tparam T3 Type of the third argument.
-   * \tparam T4 Type of the fourth argument.
-   * \tparam T5 Type of the fifth argument.
-   * \tparam T6 Type of the sixth argument.
-   * \param a1 the first argument
-   * \param a2 the second argument
-   * \param a3 the third argument
-   * \param a4 the fourth argument
-   * \param a5 the fifth argument
-   * \param a6 the sixth argument
+   * \tparam T1 \deduced Type of the first argument.
+   * \tparam T2 \deduced Type of the second argument.
+   * \tparam T3 \deduced Type of the third argument.
+   * \tparam T4 \deduced Type of the fourth argument.
+   * \tparam T5 \deduced Type of the fifth argument.
+   * \tparam T6 \deduced Type of the sixth argument.
+   * \param [in] a1 the first argument
+   * \param [in] a2 the second argument
+   * \param [in] a3 the third argument
+   * \param [in] a4 the fourth argument
+   * \param [in] a5 the fifth argument
+   * \param [in] a6 the sixth argument
    */
   template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
   void SetArguments (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
diff -Naur ns-3.23/src/core/test/attribute-test-suite.cc ns-3.24/src/core/test/attribute-test-suite.cc
--- ns-3.23/src/core/test/attribute-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/test/attribute-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -136,6 +136,13 @@
                      MakeEnumChecker (TEST_A, "TestA",
                                       TEST_B, "TestB",
                                       TEST_C, "TestC"))
+      .AddAttribute ("TestEnumSetGet", "help text",
+                     EnumValue (TEST_B),
+                     MakeEnumAccessor (&AttributeObjectTest::DoSetEnum,
+                                       &AttributeObjectTest::DoGetEnum),
+                     MakeEnumChecker (TEST_A, "TestA",
+                                      TEST_B, "TestB",
+                                      TEST_C, "TestC"))
       .AddAttribute ("TestRandom", "help text",
                      StringValue ("ns3::ConstantRandomVariable[Constant=1.0]"),
                      MakePointerAccessor (&AttributeObjectTest::m_random),
@@ -188,7 +195,7 @@
                      MakeValueClassTestChecker ())
       .AddTraceSource ("Source1", "help test",
                        MakeTraceSourceAccessor (&AttributeObjectTest::m_intSrc1),
-                       "ns3::TracedValue::Int8Callback")
+                       "ns3::TracedValueCallback::Int8")
       .AddTraceSource ("Source2", "help text",
                        MakeTraceSourceAccessor (&AttributeObjectTest::m_cb),
                        "ns3::AttributeObjectTest::NumericTracedCallback")
@@ -228,6 +235,7 @@
     NS_UNUSED (m_uint8);
     NS_UNUSED (m_float);
     NS_UNUSED (m_enum);
+    NS_UNUSED (m_enumSetGet);
   }
 
   virtual ~AttributeObjectTest (void) {};
@@ -255,6 +263,8 @@
   Ptr<Derived> DoGetVector (uint32_t i) const { return m_vector2[i]; }
   bool DoSetIntSrc (int8_t v) { m_intSrc2 = v; return true; }
   int8_t DoGetIntSrc (void) const { return m_intSrc2; }
+  bool DoSetEnum (Test_e v) { m_enumSetGet = v; return true; }
+  Test_e DoGetEnum (void) const { return m_enumSetGet; }
 
   bool m_boolTestA;
   bool m_boolTest;
@@ -264,6 +274,7 @@
   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;
@@ -272,7 +283,7 @@
   TracedValue<int8_t> m_intSrc1;
   TracedValue<int8_t> m_intSrc2;
 
-  typedef void (* NumericTracedCallback) (const double, const int, const float);
+  typedef void (* NumericTracedCallback) (double, int, float);
   TracedCallback<double, int, float> m_cb;
   TracedValue<ValueClassTest> m_valueSrc;
   Ptr<Derived> m_ptr;
@@ -654,6 +665,22 @@
   NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by SetAttributeFailSafe() via EnumValue");
 
   //
+  // When the object is first created, the Attribute should have the default 
+  // value.
+  //
+  ok = CheckGetCodePaths (p, "TestEnumSetGet", "TestB", EnumValue (AttributeObjectTest::TEST_B));
+  NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by default value");
+
+  //
+  // Set the Attribute using the EnumValue type.
+  //
+  ok = p->SetAttributeFailSafe ("TestEnumSetGet", EnumValue (AttributeObjectTest::TEST_C));
+  NS_TEST_ASSERT_MSG_EQ (ok, true, "Could not SetAttributeFailSafe() to TEST_C");
+
+  ok = CheckGetCodePaths (p, "TestEnumSetGet", "TestC", EnumValue (AttributeObjectTest::TEST_C));
+  NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by SetAttributeFailSafe() via EnumValue");
+
+  //
   // Set the Attribute using the StringValue type.
   //
   ok = p->SetAttributeFailSafe ("TestEnum", StringValue ("TestB"));
@@ -692,6 +719,9 @@
   p = CreateObject<AttributeObjectTest> ();
   NS_TEST_ASSERT_MSG_NE (p, 0, "Unable to CreateObject");
 
+  // The test vectors assume ns resolution
+  Time::SetResolution (Time::NS);
+  
   //
   // Set value
   //
@@ -699,13 +729,13 @@
   NS_TEST_ASSERT_MSG_EQ (ok, true, "Could not SetAttributeFailSafe() via TimeValue to 5s");
 
   ok = CheckGetCodePaths (p, "TestTimeWithBounds", "+5000000000.0ns", TimeValue (Seconds (5)));
-  NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by SetAttributeFailSafe() (5s) via TimeValue");
+  NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by SetAttributeFailSafe(5s) via TimeValue");
 
   ok = p->SetAttributeFailSafe ("TestTimeWithBounds", StringValue ("3s"));
-  NS_TEST_ASSERT_MSG_EQ (ok, true, "Could not SetAttributeFailSafe() via TimeValue to 5s");
+  NS_TEST_ASSERT_MSG_EQ (ok, true, "Could not SetAttributeFailSafe() via TimeValue to 3s");
 
   ok = CheckGetCodePaths (p, "TestTimeWithBounds", "+3000000000.0ns", TimeValue (Seconds (3)));
-  NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by SetAttributeFailSafe() (3s) via StringValue");
+  NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by SetAttributeFailSafe(3s) via StringValue");
 
   
   //
@@ -717,16 +747,16 @@
   // Set the Attribute at the positive limit
   //
   ok = p->SetAttributeFailSafe ("TestTimeWithBounds", TimeValue (Seconds (10)));
-  NS_TEST_ASSERT_MSG_EQ (ok, true, "Could not SetAttributeFailSafe() via TimeValue to 10");
+  NS_TEST_ASSERT_MSG_EQ (ok, true, "Could not SetAttributeFailSafe() via TimeValue to 10s");
 
   ok = CheckGetCodePaths (p, "TestTimeWithBounds", "+10000000000.0ns", TimeValue (Seconds (10)));
-  NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by SetAttributeFailSafe() (positive limit) via StringValue");
+  NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by SetAttributeFailSafe(10s [positive limit]) via StringValue");
 
   //
   // Set the Attribute past the positive limit.
   //
   ok = p->SetAttributeFailSafe ("TestTimeWithBounds", TimeValue (Seconds (11)));
-  NS_TEST_ASSERT_MSG_EQ (ok, false, "Unexpectedly could SetAttributeFailSafe() via TimeValue to 11");
+  NS_TEST_ASSERT_MSG_EQ (ok, false, "Unexpectedly could SetAttributeFailSafe() via TimeValue to 11s [greater than positive limit]");
 
   ok = CheckGetCodePaths (p, "TestTimeWithBounds", "+10000000000.0ns", TimeValue (Seconds (10)));
   NS_TEST_ASSERT_MSG_EQ (ok, true, "Error in SetAttributeFailSafe() but value changes");
@@ -735,16 +765,16 @@
   // Set the Attribute at the negative limit.
   //
   ok = p->SetAttributeFailSafe ("TestTimeWithBounds", TimeValue (Seconds (-5)));
-  NS_TEST_ASSERT_MSG_EQ (ok, true, "Could not SetAttributeFailSafe() via TimeValue to -5");
+  NS_TEST_ASSERT_MSG_EQ (ok, true, "Could not SetAttributeFailSafe() via TimeValue to -5s");
 
   ok = CheckGetCodePaths (p, "TestTimeWithBounds", "-5000000000.0ns", TimeValue (Seconds (-5)));
-  NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by SetAttributeFailSafe() (negative limit) via StringValue");
+  NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by SetAttributeFailSafe(-5s [negative limit]) via StringValue");
 
   //
   // Set the Attribute past the negative limit.
   //
   ok = p->SetAttributeFailSafe ("TestTimeWithBounds", TimeValue (Seconds (-6)));
-  NS_TEST_ASSERT_MSG_EQ (ok, false, "Unexpectedly could SetAttributeFailSafe() via TimeValue to -6");
+  NS_TEST_ASSERT_MSG_EQ (ok, false, "Unexpectedly could SetAttributeFailSafe() via TimeValue to -6s");
 
   ok = CheckGetCodePaths (p, "TestTimeWithBounds", "-5000000000.0ns", TimeValue (Seconds (-5)));
   NS_TEST_ASSERT_MSG_EQ (ok, true, "Error in SetAttributeFailSafe() but value changes");
diff -Naur ns-3.23/src/core/test/build-profile-test-suite.cc ns-3.24/src/core/test/build-profile-test-suite.cc
--- ns-3.23/src/core/test/build-profile-test-suite.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/core/test/build-profile-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,82 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015 LLNL
+ *
+ * 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>
+ */
+
+#include "ns3/build-profile.h"
+#include "ns3/test.h"
+
+using namespace ns3;
+
+class BuildProfileTestCase : public TestCase
+{
+public:
+  BuildProfileTestCase ();
+  virtual ~BuildProfileTestCase () {}
+
+private:
+  virtual void DoRun (void);
+};
+
+BuildProfileTestCase::BuildProfileTestCase (void)
+  : TestCase ("Check build profile macros")
+{
+}
+
+void
+BuildProfileTestCase::DoRun (void)
+{
+  int i = 0;
+  int j = 0;
+
+#ifdef NS3_BUILD_PROFILE_DEBUG
+  std::cout << GetName () << ": running in build profile debug" << std::endl;
+  NS_BUILD_DEBUG (++i; ++j);
+#elif NS3_BUILD_PROFILE_RELEASE
+  std::cout << GetName () << ": running in build profile release" << std::endl;
+  NS_BUILD_RELEASE (++i; ++j);
+#elif NS3_BUILD_PROFILE_OPTIMIZED
+  std::cout << GetName () << ": running in build profile optimized" << std::endl;
+  NS_BUILD_OPTIMIZED (++i; ++j);
+#else
+  NS_TEST_ASSERT_MSG_EQ (0, 1, ": no build profile case executed");
+#endif
+  
+  if (i == 1)
+    std::cout << "build profile executed first statement." << std::endl;
+  NS_TEST_ASSERT_MSG_EQ (i, 1,
+                         "build profile failed to execute first statement");
+  if (j == 1)
+    std::cout << "build profile executed second statement." << std::endl;
+  NS_TEST_ASSERT_MSG_EQ (j, 1,
+                         "build profile failed to execute second statement");
+}
+
+class BuildProfileTestSuite : public TestSuite
+{
+public:
+  BuildProfileTestSuite ();
+};
+
+BuildProfileTestSuite::BuildProfileTestSuite ()
+  : TestSuite ("build-profile", UNIT)
+{
+  AddTestCase (new BuildProfileTestCase, TestCase::QUICK);
+}
+
+static BuildProfileTestSuite g_BuildProfileTestSuite;
diff -Naur ns-3.23/src/core/test/config-test-suite.cc ns-3.24/src/core/test/config-test-suite.cc
--- ns-3.23/src/core/test/config-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/test/config-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -98,7 +98,7 @@
                    MakeIntegerChecker<int16_t> ())
     .AddTraceSource ("Source", "XX",
                      MakeTraceSourceAccessor (&ConfigTestObject::m_trace),
-                     "ns3::TracedValue::Int16Callback")
+                     "ns3::TracedValueCallback::Int16")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/core/test/hash-test-suite.cc ns-3.24/src/core/test/hash-test-suite.cc
--- ns-3.23/src/core/test/hash-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/test/hash-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -45,7 +45,7 @@
   virtual void DoRun (void);
 };  // class HashTestCase
 
-HashTestCase::HashTestCase (const std:: string name)
+HashTestCase::HashTestCase (const std::string name)
   : TestCase (name),
     key ("The quick brown fox jumped over the lazy dogs.")
 {
diff -Naur ns-3.23/src/core/test/names-test-suite.cc ns-3.24/src/core/test/names-test-suite.cc
--- ns-3.23/src/core/test/names-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/test/names-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -26,10 +26,15 @@
 class TestObject : public Object
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void) 
   {
     static TypeId tid = TypeId ("TestObject")
-      .SetParent (Object::GetTypeId ())
+      .SetParent<Object> ()
+      .SetGroupName ("Core")
       .HideFromDocumentation ()
       .AddConstructor<TestObject> ();
     return tid;
@@ -41,10 +46,15 @@
 class AlternateTestObject : public Object
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void) 
   {
     static TypeId tid = TypeId ("AlternateTestObject")
-      .SetParent (Object::GetTypeId ())
+      .SetParent<Object> ()
+      .SetGroupName ("Core")
       .HideFromDocumentation ()
       .AddConstructor<AlternateTestObject> ();
     return tid;
diff -Naur ns-3.23/src/core/test/object-test-suite.cc ns-3.24/src/core/test/object-test-suite.cc
--- ns-3.23/src/core/test/object-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/test/object-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -28,9 +28,15 @@
 class BaseA : public ns3::Object
 {
 public:
-  static ns3::TypeId GetTypeId (void) {
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static ns3::TypeId GetTypeId (void)
+  {
     static ns3::TypeId tid = ns3::TypeId ("ObjectTest:BaseA")
-      .SetParent (Object::GetTypeId ())
+      .SetParent<Object> ()
+      .SetGroupName ("Core")
       .HideFromDocumentation ()
       .AddConstructor<BaseA> ();
     return tid;
@@ -43,9 +49,15 @@
 class DerivedA : public BaseA
 {
 public:
-  static ns3::TypeId GetTypeId (void) {
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static ns3::TypeId GetTypeId (void)
+  {
     static ns3::TypeId tid = ns3::TypeId ("ObjectTest:DerivedA")
-      .SetParent (BaseA::GetTypeId ())
+      .SetParent<BaseA> ()
+      .SetGroupName ("Core")
       .HideFromDocumentation ()
       .AddConstructor<DerivedA> ();
     return tid;
@@ -60,9 +72,15 @@
 class BaseB : public ns3::Object
 {
 public:
-  static ns3::TypeId GetTypeId (void) {
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static ns3::TypeId GetTypeId (void)
+  {
     static ns3::TypeId tid = ns3::TypeId ("ObjectTest:BaseB")
-      .SetParent (Object::GetTypeId ())
+      .SetParent<Object> ()
+      .SetGroupName ("Core")
       .HideFromDocumentation ()
       .AddConstructor<BaseB> ();
     return tid;
@@ -75,9 +93,15 @@
 class DerivedB : public BaseB
 {
 public:
-  static ns3::TypeId GetTypeId (void) {
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static ns3::TypeId GetTypeId (void)
+  {
     static ns3::TypeId tid = ns3::TypeId ("ObjectTest:DerivedB")
-      .SetParent (BaseB::GetTypeId ())
+      .SetParent<BaseB> ()
+      .SetGroupName ("Core")
       .HideFromDocumentation ()
       .AddConstructor<DerivedB> ();
     return tid;
diff -Naur ns-3.23/src/core/test/random-variable-stream-test-suite.cc ns-3.24/src/core/test/random-variable-stream-test-suite.cc
--- ns-3.23/src/core/test/random-variable-stream-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/test/random-variable-stream-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -34,11 +34,14 @@
 #include "ns3/string.h"
 #include "ns3/integer.h"
 #include "ns3/test.h"
+#include "ns3/log.h"
 #include "ns3/rng-seed-manager.h"
 #include "ns3/random-variable-stream.h"
 
 using namespace ns3;
 
+NS_LOG_COMPONENT_DEFINE ("RandomVariableStreamGenerators");
+
 namespace {
 
 void
@@ -54,6 +57,57 @@
     }
 }
 
+bool seedSet = false;
+
+// Over time, this test suite is designed to be run with varying seed
+// values so that the distributions can be evaluated with chi-squared
+// tests.  To enable this, normal invocation of this test suite will
+// result in a seed value corresponding to the seconds since epoch
+// (time (0) from ctime).  Note: this is not a recommended practice for 
+// seeding normal simulations, as described in the ns-3 manual, but
+// suits our purposes here.
+//
+// However, we also want to provide the ability to run this test suite
+// with a repeatable value, such as when the seed or run number is configured
+// to a specific value.  Therefore, we adopt the following policy.  When
+// the test program is being run with the default global values for seed
+// and run number, this function will instead pick a random, time-based
+// seed for use within this test suite.  If the global values for seed or 
+// run number have been configured differently from the default values,
+// the global seed value will be used instead of the time-based one.
+// 
+// For example, this command will cause this test suite to use the 
+// deterministic value of seed=3 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"
+//  Similarly, if the value of RngRun is not set to 1, the globals will be
+//  used.
+//
+void
+SetTestSuiteSeed (void)
+{
+  if (seedSet == false)
+    {
+      uint32_t seed;
+      if (RngSeedManager::GetSeed () == 1 && RngSeedManager::GetRun () == 1)
+        {
+          seed = static_cast<uint32_t> (time (0));
+          seedSet = true;
+          NS_LOG_DEBUG ("Global seed and run number are default; seeding with time of day: " << seed);
+          
+        }
+      else
+        {
+          seed = RngSeedManager::GetSeed ();
+          seedSet = true;
+          NS_LOG_DEBUG ("Global seed and run number are not default; using the non-default values seed: " <<
+                        seed << " and run: " << RngSeedManager::GetRun ());
+        }
+      SeedManager::SetSeed (seed);
+    }
+}
+
 } // anonymous namespace
 
 // ===========================================================================
@@ -62,10 +116,14 @@
 class RandomVariableStreamUniformTestCase : public TestCase
 {
 public:
-  static const uint32_t N_RUNS = 5;
-  static const uint32_t N_BINS = 50;
+  // We want the number of observations in each bin to be > 5
+  // The following values should yield many more than 5 per bin
+  static const uint32_t N_BINS = 100;
   static const uint32_t N_MEASUREMENTS = 1000000;
 
+  // Number of times to wrap the Chi-Squared test and retry
+  static const uint32_t N_RUNS = 2;
+
   RandomVariableStreamUniformTestCase ();
   virtual ~RandomVariableStreamUniformTestCase ();
 
@@ -125,21 +183,26 @@
 void
 RandomVariableStreamUniformTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
-  double sum = 0.;
-  double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
+  double confidence = 0.99;
+  double maxStatistic = gsl_cdf_chisq_Pinv (confidence, (N_BINS-1));
+  NS_LOG_DEBUG ("Chi square required at " << confidence << " confidence for " << N_BINS << " bins is " << maxStatistic);
 
+  double result = maxStatistic;
+  // If chi-squared test fails, re-try it up to N_RUNS times
   for (uint32_t i = 0; i < N_RUNS; ++i)
     {
       Ptr<UniformRandomVariable> u = CreateObject<UniformRandomVariable> ();
-      double result = ChiSquaredTest (u);
-      sum += result;
+      result = ChiSquaredTest (u);
+      NS_LOG_DEBUG ("Chi square result is " << result);
+      if (result < maxStatistic)
+        {
+          break;
+        }
     }
 
-  sum /= (double)N_RUNS;
-
-  NS_TEST_ASSERT_MSG_LT (sum, maxStatistic, "Chi-squared statistic out of range");
+  NS_TEST_ASSERT_MSG_LT (result, maxStatistic, "Chi-squared statistic out of range");
 
   double min = 0.0;
   double max = 10.0;
@@ -268,7 +331,7 @@
 void
 RandomVariableStreamUniformAntitheticTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -345,7 +408,7 @@
 void
 RandomVariableStreamConstantTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   Ptr<ConstantRandomVariable> c = CreateObject<ConstantRandomVariable> ();
 
@@ -395,7 +458,7 @@
 void
 RandomVariableStreamSequentialTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   Ptr<SequentialRandomVariable> s = CreateObject<SequentialRandomVariable> ();
 
@@ -509,7 +572,7 @@
 void
 RandomVariableStreamNormalTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -635,7 +698,7 @@
 void
 RandomVariableStreamNormalAntitheticTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -766,7 +829,7 @@
 void
 RandomVariableStreamExponentialTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -886,7 +949,7 @@
 void
 RandomVariableStreamExponentialAntitheticTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -1015,7 +1078,7 @@
 void
 RandomVariableStreamParetoTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -1149,7 +1212,7 @@
 void
 RandomVariableStreamParetoAntitheticTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -1291,7 +1354,7 @@
 void
 RandomVariableStreamWeibullTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -1437,7 +1500,7 @@
 void
 RandomVariableStreamWeibullAntitheticTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -1590,7 +1653,7 @@
 void
 RandomVariableStreamLogNormalTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -1726,7 +1789,7 @@
 void
 RandomVariableStreamLogNormalAntitheticTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -1869,7 +1932,7 @@
 void
 RandomVariableStreamGammaTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -1998,7 +2061,7 @@
 void
 RandomVariableStreamGammaAntitheticTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -2138,7 +2201,7 @@
 void
 RandomVariableStreamErlangTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -2270,7 +2333,7 @@
 void
 RandomVariableStreamErlangAntitheticTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double sum = 0.;
   double maxStatistic = gsl_cdf_chisq_Qinv (0.05, N_BINS);
@@ -2351,7 +2414,7 @@
 void
 RandomVariableStreamZipfTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   uint32_t n = 1;
   double alpha = 2.0;
@@ -2433,7 +2496,7 @@
 void
 RandomVariableStreamZipfAntitheticTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   uint32_t n = 1;
   double alpha = 2.0;
@@ -2518,7 +2581,7 @@
 void
 RandomVariableStreamZetaTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double alpha = 5.0;
   double value;
@@ -2582,7 +2645,7 @@
 void
 RandomVariableStreamZetaAntitheticTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   double alpha = 5.0;
   double value;
@@ -2651,7 +2714,7 @@
 void
 RandomVariableStreamDeterministicTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   Ptr<DeterministicRandomVariable> s = CreateObject<DeterministicRandomVariable> ();
 
@@ -2726,7 +2789,7 @@
 void
 RandomVariableStreamEmpiricalTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   // Create the RNG with a uniform distribution between 0 and 10.
   Ptr<EmpiricalRandomVariable> x = CreateObject<EmpiricalRandomVariable> ();
@@ -2790,7 +2853,7 @@
 void
 RandomVariableStreamEmpiricalAntitheticTestCase::DoRun (void)
 {
-  SeedManager::SetSeed (time (0));
+  SetTestSuiteSeed ();
 
   // Create the RNG with a uniform distribution between 0 and 10.
   Ptr<EmpiricalRandomVariable> x = CreateObject<EmpiricalRandomVariable> ();
diff -Naur ns-3.23/src/core/test/time-test-suite.cc ns-3.24/src/core/test/time-test-suite.cc
--- ns-3.23/src/core/test/time-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/test/time-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -102,28 +102,28 @@
 {
 }
 
-class TimesWithSignsTestCase : public TestCase
+class TimeWithSignTestCase : public TestCase
 {
 public:
-  TimesWithSignsTestCase ();
+  TimeWithSignTestCase ();
 private:
   virtual void DoSetup (void);
   virtual void DoRun (void);
   virtual void DoTeardown (void);
 };
 
-TimesWithSignsTestCase::TimesWithSignsTestCase ()
+TimeWithSignTestCase::TimeWithSignTestCase ()
   : TestCase ("Checks times that have plus or minus signs")
 {
 }
 
 void
-TimesWithSignsTestCase::DoSetup (void)
+TimeWithSignTestCase::DoSetup (void)
 {
 }
 
 void
-TimesWithSignsTestCase::DoRun (void)
+TimeWithSignTestCase::DoRun (void)
 {
   Time timePositive          ("+1000.0");
   Time timePositiveWithUnits ("+1000.0ms");
@@ -153,27 +153,27 @@
 }
 
 void 
-TimesWithSignsTestCase::DoTeardown (void)
+TimeWithSignTestCase::DoTeardown (void)
 {
 }
 
 
-class TimeIntputOutputTestCase : public TestCase
+class TimeInputOutputTestCase : public TestCase
 {
 public:
-  TimeIntputOutputTestCase ();
+  TimeInputOutputTestCase ();
 private:
   virtual void DoRun (void);
   void Check (const std::string & str);
 };
 
-TimeIntputOutputTestCase::TimeIntputOutputTestCase ()
+TimeInputOutputTestCase::TimeInputOutputTestCase ()
   : TestCase ("Input,output from,to strings")
 {
 }
 
 void
-TimeIntputOutputTestCase::Check (const std::string & str)
+TimeInputOutputTestCase::Check (const std::string & str)
 {
   std::stringstream ss (str);
   Time time;
@@ -192,7 +192,7 @@
 }
 
 void
-TimeIntputOutputTestCase::DoRun (void)
+TimeInputOutputTestCase::DoRun (void)
 {
   std::cout << std::endl;
   std::cout << GetParent ()->GetName () << " InputOutput: " << GetName ()
@@ -236,8 +236,8 @@
   TimeTestSuite ()
     : TestSuite ("time", UNIT)
   {
-    AddTestCase (new TimesWithSignsTestCase (), TestCase::QUICK);
-    AddTestCase (new TimeIntputOutputTestCase (), TestCase::QUICK);
+    AddTestCase (new TimeWithSignTestCase (), TestCase::QUICK);
+    AddTestCase (new TimeInputOutputTestCase (), TestCase::QUICK);
     // This should be last, since it changes the resolution
     AddTestCase (new TimeSimpleTestCase (), TestCase::QUICK);
   }
diff -Naur ns-3.23/src/core/wscript ns-3.24/src/core/wscript
--- ns-3.23/src/core/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/core/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -32,8 +32,8 @@
                          "the implementation-defined numerical precision may "
                          "be less than the other implementations.  "
                          "[Allowed Values: %s]"
-                         % ", ".join([repr(p) for p in int64x64.keys()])),
-                   choices=int64x64.keys(),
+                         % ", ".join([repr(p) for p in list(int64x64.keys())])),
+                   choices=list(int64x64.keys()),
                    dest='int64x64_impl')
                    
     opt.add_option('--disable-pthread',
@@ -192,6 +192,7 @@
     core_test = bld.create_ns3_module_test_library('core')
     core_test.source = [
         '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',
@@ -296,6 +297,8 @@
         'model/hash-fnv.h',
         'model/hash.h',
         'model/valgrind.h',
+        'model/non-copyable.h',
+        'model/build-profile.h',
         ]
 
     if sys.platform == 'win32':
diff -Naur ns-3.23/src/csma/bindings/modulegen__gcc_ILP32.py ns-3.24/src/csma/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/csma/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/csma/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -109,7 +109,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
@@ -313,6 +313,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -348,6 +354,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -756,17 +769,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -788,11 +801,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -802,16 +810,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1049,14 +1047,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1117,11 +1119,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CsmaDeviceRec_methods(root_module, cls):
@@ -1129,8 +1126,8 @@
     cls.add_constructor([])
     ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::Ptr<ns3::CsmaNetDevice> device) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CsmaNetDevice >', 'device')])
-    ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::CsmaDeviceRec const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CsmaDeviceRec const &', 'arg0')])
+    ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::CsmaDeviceRec const & o) [copy constructor]
+    cls.add_constructor([param('ns3::CsmaDeviceRec const &', 'o')])
     ## csma-channel.h (module 'csma'): bool ns3::CsmaDeviceRec::IsActive() [member function]
     cls.add_method('IsActive', 
                    'bool', 
@@ -2155,7 +2152,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2173,10 +2170,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2240,10 +2237,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -2390,10 +2387,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3016,10 +3013,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -3901,11 +3898,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4167,10 +4174,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5792,6 +5799,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5804,6 +5812,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/csma/bindings/modulegen__gcc_LP64.py ns-3.24/src/csma/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/csma/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/csma/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -109,7 +109,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
@@ -313,6 +313,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -348,6 +354,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -756,17 +769,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -788,11 +801,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -802,16 +810,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1049,14 +1047,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1117,11 +1119,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CsmaDeviceRec_methods(root_module, cls):
@@ -1129,8 +1126,8 @@
     cls.add_constructor([])
     ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::Ptr<ns3::CsmaNetDevice> device) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CsmaNetDevice >', 'device')])
-    ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::CsmaDeviceRec const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CsmaDeviceRec const &', 'arg0')])
+    ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::CsmaDeviceRec const & o) [copy constructor]
+    cls.add_constructor([param('ns3::CsmaDeviceRec const &', 'o')])
     ## csma-channel.h (module 'csma'): bool ns3::CsmaDeviceRec::IsActive() [member function]
     cls.add_method('IsActive', 
                    'bool', 
@@ -2155,7 +2152,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2173,10 +2170,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2240,10 +2237,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -2390,10 +2387,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3016,10 +3013,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -3901,11 +3898,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4167,10 +4174,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5792,6 +5799,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5804,6 +5812,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/csma/helper/csma-helper.h ns-3.24/src/csma/helper/csma-helper.h
--- ns-3.23/src/csma/helper/csma-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/csma/helper/csma-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -34,6 +34,7 @@
 class Packet;
 
 /**
+ * \ingroup csma
  * \brief build a set of CsmaNetDevice objects
  *
  * Normally we eschew multiple inheritance, however, the classes 
@@ -206,6 +207,15 @@
 
 private:
 
+  /**
+   * This method creates an ns3::CsmaNetDevice with the attributes configured by
+   * CsmaHelper::SetDeviceAttribute and then adds the device to the node and
+   * attaches the provided channel to the device.
+   *
+   * \param node The node to install the device in
+   * \param channel The channel to attach to the device.
+   * \returns A container holding the added net device.
+   */
   Ptr<NetDevice> InstallPriv (Ptr<Node> node, Ptr<CsmaChannel> channel) const;
 
   /**
@@ -237,9 +247,9 @@
                                     Ptr<NetDevice> nd,
                                     bool explicitFilename);
 
-  ObjectFactory m_queueFactory;
-  ObjectFactory m_deviceFactory;
-  ObjectFactory m_channelFactory;
+  ObjectFactory m_queueFactory;   //!< factory for the queues
+  ObjectFactory m_deviceFactory;  //!< factory for the NetDevices
+  ObjectFactory m_channelFactory; //!< factory for the channel
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/csma/model/backoff.h ns-3.24/src/csma/model/backoff.h
--- ns-3.23/src/csma/model/backoff.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/csma/model/backoff.h	2015-09-15 11:18:44.000000000 -0700
@@ -29,9 +29,9 @@
 namespace ns3 {
 
 /**
+ * \ingroup csma
  * \brief The backoff class is used for calculating backoff times
  * when many net devices can write to the same channel
- *
  */
 
 class Backoff {
@@ -62,6 +62,14 @@
   Time m_slotTime;
 
   Backoff (void);
+  /**
+   * \brief Constructor
+   * \param slotTime Length of one slot
+   * \param minSlots Minimum number of backoff slots
+   * \param maxSlots Maximum number of backoff slots
+   * \param ceiling Cap to the exponential function
+   * \param maxRetries Maximum number of transmission retries
+   */
   Backoff (Time slotTime, uint32_t minSlots, uint32_t maxSlots, uint32_t ceiling, uint32_t maxRetries);
 
   /**
@@ -103,6 +111,10 @@
    * Number of times that the transmitter has tried to unsuccessfully transmit the current packet.
    */
   uint32_t m_numBackoffRetries;
+
+  /**
+   * Random number generator
+   */
   Ptr<UniformRandomVariable> m_rng;
 };
 
diff -Naur ns-3.23/src/csma/model/csma-channel.h ns-3.24/src/csma/model/csma-channel.h
--- ns-3.23/src/csma/model/csma-channel.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/csma/model/csma-channel.h	2015-09-15 11:18:44.000000000 -0700
@@ -33,6 +33,7 @@
 class CsmaNetDevice;
 
 /**
+ * \ingroup csma
  * \brief CsmaNetDevice Record 
  *
  * Stores the information related to each net device that is
@@ -40,12 +41,24 @@
  */
 class CsmaDeviceRec {
 public:
-  Ptr< CsmaNetDevice > devicePtr; /// Pointer to the net device
-  bool                       active;    /// Is net device enabled to TX/RX
+  Ptr< CsmaNetDevice > devicePtr; //!< Pointer to the net device
+  bool                 active;    //!< Is net device enabled to TX/RX
 
   CsmaDeviceRec();
+
+  /**
+   * \brief Constructor
+   * Builds a record of the given NetDevice, its status is initialized to enabled.
+   *
+   * \param device the device to record
+   */
   CsmaDeviceRec(Ptr< CsmaNetDevice > device);
-  CsmaDeviceRec (CsmaDeviceRec const &);
+
+  /**
+   * Copy constructor
+   * \param o the object to copy
+   */
+  CsmaDeviceRec (CsmaDeviceRec const &o);
 
   /**
    * \return If the net device pointed to by the devicePtr is active
@@ -65,6 +78,7 @@
 };
 
 /**
+ * \ingroup csma
  * \brief Csma Channel.
  *
  * This class represents a simple Csma channel that can be used
@@ -76,6 +90,11 @@
 class CsmaChannel : public Channel 
 {
 public:
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -274,9 +293,20 @@
   Time GetDelay (void);
 
 private:
-  // Avoid implicit copy constructor and assignment (python bindings issues)
-  CsmaChannel (CsmaChannel const &);
-  CsmaChannel &operator = (CsmaChannel const &);
+  /**
+   * Copy constructor is declared but not implemented.  This disables the
+   * copy constructor for CsmaChannel objects.
+   * \param o object to copy
+   */
+  CsmaChannel (CsmaChannel const &o);
+
+  /**
+   * Operator = is declared but not implemented.  This disables the assignment
+   * operator for CsmaChannel objects.
+   * \param o object to copy
+   * \returns the copied object
+   */
+  CsmaChannel &operator = (CsmaChannel const &o);
 
   /**
    * The assigned data rate of the channel
diff -Naur ns-3.23/src/csma/model/csma-net-device.h ns-3.24/src/csma/model/csma-net-device.h
--- ns-3.23/src/csma/model/csma-net-device.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/csma/model/csma-net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -58,6 +58,11 @@
 class CsmaNetDevice : public NetDevice 
 {
 public:
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -114,6 +119,7 @@
    * \see SetDataRate ()
    * \see SetInterframeGap ()
    * \param ch a pointer to the channel to which this object is being attached.
+   * \returns true if no error
    */
   bool Attach (Ptr<CsmaChannel> ch);
 
@@ -356,6 +362,7 @@
    * Operator = is declared but not implemented.  This disables the assignment
    * operator for CsmaNetDevice objects.
    * \param o object to copy
+   * \returns the copied object
    */
   CsmaNetDevice &operator = (const CsmaNetDevice &o);
 
@@ -708,6 +715,9 @@
    */
   TracedCallback<> m_linkChangeCallbacks;
 
+  /**
+   * Default Maximum Transmission Unit (MTU) for the CsmaNetDevice
+   */
   static const uint16_t DEFAULT_MTU = 1500;
 
   /**
diff -Naur ns-3.23/src/csma-layout/bindings/modulegen__gcc_ILP32.py ns-3.24/src/csma-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -104,6 +104,10 @@
     module.add_class('Ipv6InterfaceContainer', import_from_module='ns.internet')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
@@ -137,7 +141,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -304,6 +308,10 @@
     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'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -344,6 +352,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -379,6 +393,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -413,6 +434,7 @@
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -499,6 +521,8 @@
     register_Ns3Ipv6PmtuCache_methods(root_module, root_module['ns3::Ipv6PmtuCache'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     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'])
@@ -875,17 +899,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -907,11 +931,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -921,16 +940,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1168,14 +1177,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1236,11 +1249,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CsmaDeviceRec_methods(root_module, cls):
@@ -1248,8 +1256,8 @@
     cls.add_constructor([])
     ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::Ptr<ns3::CsmaNetDevice> device) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CsmaNetDevice >', 'device')])
-    ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::CsmaDeviceRec const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CsmaDeviceRec const &', 'arg0')])
+    ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::CsmaDeviceRec const & o) [copy constructor]
+    cls.add_constructor([param('ns3::CsmaDeviceRec const &', 'o')])
     ## csma-channel.h (module 'csma'): bool ns3::CsmaDeviceRec::IsActive() [member function]
     cls.add_method('IsActive', 
                    'bool', 
@@ -2309,6 +2317,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -2711,7 +2791,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2729,10 +2809,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2796,10 +2876,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3018,10 +3098,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4003,10 +4083,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -5157,11 +5237,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -6524,6 +6614,46 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -7243,6 +7373,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -7255,6 +7386,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/csma-layout/bindings/modulegen__gcc_LP64.py ns-3.24/src/csma-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/csma-layout/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/csma-layout/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -104,6 +104,10 @@
     module.add_class('Ipv6InterfaceContainer', import_from_module='ns.internet')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
@@ -137,7 +141,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -304,6 +308,10 @@
     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'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -344,6 +352,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -379,6 +393,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -413,6 +434,7 @@
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -499,6 +521,8 @@
     register_Ns3Ipv6PmtuCache_methods(root_module, root_module['ns3::Ipv6PmtuCache'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     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'])
@@ -875,17 +899,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -907,11 +931,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -921,16 +940,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1168,14 +1177,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1236,11 +1249,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CsmaDeviceRec_methods(root_module, cls):
@@ -1248,8 +1256,8 @@
     cls.add_constructor([])
     ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::Ptr<ns3::CsmaNetDevice> device) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CsmaNetDevice >', 'device')])
-    ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::CsmaDeviceRec const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CsmaDeviceRec const &', 'arg0')])
+    ## csma-channel.h (module 'csma'): ns3::CsmaDeviceRec::CsmaDeviceRec(ns3::CsmaDeviceRec const & o) [copy constructor]
+    cls.add_constructor([param('ns3::CsmaDeviceRec const &', 'o')])
     ## csma-channel.h (module 'csma'): bool ns3::CsmaDeviceRec::IsActive() [member function]
     cls.add_method('IsActive', 
                    'bool', 
@@ -2309,6 +2317,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -2711,7 +2791,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2729,10 +2809,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2796,10 +2876,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3018,10 +3098,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4003,10 +4083,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -5157,11 +5237,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -6524,6 +6614,46 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -7243,6 +7373,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -7255,6 +7386,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/csma-layout/model/csma-star-helper.h ns-3.24/src/csma-layout/model/csma-star-helper.h
--- ns-3.23/src/csma-layout/model/csma-star-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/csma-layout/model/csma-star-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -141,14 +141,14 @@
   void AssignIpv6Addresses (Ipv6Address network, Ipv6Prefix prefix);
 
 private:
-  NodeContainer m_hub;
-  NetDeviceContainer m_hubDevices;
-  NodeContainer m_spokes;
-  NetDeviceContainer m_spokeDevices;
-  Ipv4InterfaceContainer m_hubInterfaces;
-  Ipv4InterfaceContainer m_spokeInterfaces;
-  Ipv6InterfaceContainer m_hubInterfaces6;
-  Ipv6InterfaceContainer m_spokeInterfaces6;
+  NodeContainer m_hub;                        //!< NodeContainer for the hub node
+  NetDeviceContainer m_hubDevices;            //!< NetDeviceContainer for the hub node NetDevices
+  NodeContainer m_spokes;                     //!< NodeContainer for the spokes nodes
+  NetDeviceContainer m_spokeDevices;          //!< NetDeviceContainer for the spokes nodes NetDevices
+  Ipv4InterfaceContainer m_hubInterfaces;     //!< Ipv4InterfaceContainer for the hub IPv4 interfaces
+  Ipv4InterfaceContainer m_spokeInterfaces;   //!< Ipv4InterfaceContainer for the spokes IPv4 interfaces
+  Ipv6InterfaceContainer m_hubInterfaces6;    //!< Ipv6InterfaceContainer for the hub IPv6 interfaces
+  Ipv6InterfaceContainer m_spokeInterfaces6;  //!< Ipv6InterfaceContainer for the spokes IPv6 interfaces
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/dsdv/bindings/modulegen__gcc_ILP32.py ns-3.24/src/dsdv/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/dsdv/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/dsdv/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -102,6 +102,10 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
@@ -302,6 +306,10 @@
     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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -348,6 +356,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace dsdv
     
     nested_module = module.add_cpp_namespace('dsdv')
@@ -388,6 +402,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_dsdv(module):
     root_module = module.get_root()
     
@@ -436,6 +457,7 @@
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
@@ -523,6 +545,8 @@
     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_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'])
@@ -669,17 +693,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -701,11 +725,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -715,16 +734,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -962,14 +971,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1030,11 +1043,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -1792,6 +1800,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NodeContainer_methods(root_module, cls):
     ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NodeContainer const &', 'arg0')])
@@ -2149,7 +2229,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2241,10 +2321,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4422,11 +4502,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4536,10 +4626,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5542,6 +5632,46 @@
                    is_virtual=True)
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -6884,6 +7014,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_dsdv(module.get_submodule('dsdv'), root_module)
     return
 
@@ -6897,6 +7028,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_dsdv(module, root_module):
     return
 
diff -Naur ns-3.23/src/dsdv/bindings/modulegen__gcc_LP64.py ns-3.24/src/dsdv/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/dsdv/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/dsdv/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -102,6 +102,10 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
@@ -302,6 +306,10 @@
     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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -348,6 +356,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace dsdv
     
     nested_module = module.add_cpp_namespace('dsdv')
@@ -388,6 +402,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_dsdv(module):
     root_module = module.get_root()
     
@@ -436,6 +457,7 @@
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
@@ -523,6 +545,8 @@
     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_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'])
@@ -669,17 +693,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -701,11 +725,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -715,16 +734,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -962,14 +971,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1030,11 +1043,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -1792,6 +1800,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NodeContainer_methods(root_module, cls):
     ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NodeContainer const &', 'arg0')])
@@ -2149,7 +2229,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2241,10 +2321,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4422,11 +4502,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4536,10 +4626,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5542,6 +5632,46 @@
                    is_virtual=True)
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -6884,6 +7014,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_dsdv(module.get_submodule('dsdv'), root_module)
     return
 
@@ -6897,6 +7028,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_dsdv(module, root_module):
     return
 
diff -Naur ns-3.23/src/dsdv/model/dsdv-routing-protocol.cc ns-3.24/src/dsdv/model/dsdv-routing-protocol.cc
--- ns-3.23/src/dsdv/model/dsdv-routing-protocol.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/dsdv/model/dsdv-routing-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -66,7 +66,11 @@
   static TypeId
   GetTypeId ()
   {
-    static TypeId tid = TypeId ("ns3::dsdv::DeferredRouteOutputTag").SetParent<Tag> ().SetGroupName ("Dsdv");
+    static TypeId tid = TypeId ("ns3::dsdv::DeferredRouteOutputTag")
+      .SetParent<Tag> ()
+      .SetGroupName ("Dsdv")
+      .AddConstructor<DeferredRouteOutputTag> ()
+      ;
     return tid;
   }
 
diff -Naur ns-3.23/src/dsr/bindings/modulegen__gcc_ILP32.py ns-3.24/src/dsr/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/dsr/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/dsr/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -23,11 +23,11 @@
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
     module.add_enum('WifiMacType', ['WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_CTLWRAPPER', '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-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'], import_from_module='ns.wifi')
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT'], import_from_module='ns.wifi')
     ## wifi-phy-standard.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_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211ac'], 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_UNDEF'], import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
@@ -130,6 +130,8 @@
     root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
+    ## 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]
@@ -204,6 +206,10 @@
     module.add_class('int64x64_t', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
     module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo [struct]
+    module.add_class('mpduInfo', import_from_module='ns.wifi')
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm [struct]
+    module.add_class('signalNoiseDbm', import_from_module='ns.wifi')
     ## chunk.h (module 'network'): ns3::Chunk [class]
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
@@ -442,6 +448,12 @@
     module.add_class('UdpL4Protocol', import_from_module='ns.internet', parent=root_module['ns3::IpL4Protocol'])
     ## uinteger.h (module 'core'): ns3::UintegerValue [class]
     module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities [class]
+    module.add_class('VhtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker [class]
+    module.add_class('VhtCapabilitiesChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue [class]
+    module.add_class('VhtCapabilitiesValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker [class]
     module.add_class('WifiModeChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue [class]
@@ -453,24 +465,26 @@
     ## 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('ns3::WifiModeList', 'ns3::WifiMode', container_type=u'vector')
-    module.add_container('ns3::WifiMcsList', 'unsigned char', container_type=u'vector')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type=u'list')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type=u'map')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', u'ns3::WifiMcsListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', u'ns3::WifiMcsListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', u'ns3::WifiMcsListIterator&')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >', u'ns3::WifiMcsList')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >*', u'ns3::WifiMcsList*')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >&', u'ns3::WifiMcsList&')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< short unsigned int, short int >', u'ns3::SequenceNumber16')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< short unsigned int, short int >*', u'ns3::SequenceNumber16*')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< short unsigned int, short int >&', u'ns3::SequenceNumber16&')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned int, int >', u'ns3::SequenceNumber32')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned int, int >*', u'ns3::SequenceNumber32*')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned int, int >&', u'ns3::SequenceNumber32&')
     typehandlers.add_type_alias(u'uint8_t', u'ns3::WifiInformationElementId')
     typehandlers.add_type_alias(u'uint8_t*', u'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias(u'uint8_t&', u'ns3::WifiInformationElementId&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >', u'ns3::SequenceNumber8')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >*', u'ns3::SequenceNumber8*')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >&', u'ns3::SequenceNumber8&')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >', u'ns3::WifiModeList')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >*', u'ns3::WifiModeList*')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >&', u'ns3::WifiModeList&')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -484,6 +498,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace dsr
     
     nested_module = module.add_cpp_namespace('dsr')
@@ -530,6 +550,16 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_dsr(module):
     root_module = module.get_root()
     
@@ -688,6 +718,7 @@
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     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'])
@@ -718,6 +749,8 @@
     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_Ns3MpduInfo_methods(root_module, root_module['ns3::mpduInfo'])
+    register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::signalNoiseDbm'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3Icmpv4DestinationUnreachable_methods(root_module, root_module['ns3::Icmpv4DestinationUnreachable'])
@@ -821,6 +854,9 @@
     register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
     register_Ns3UdpL4Protocol_methods(root_module, root_module['ns3::UdpL4Protocol'])
     register_Ns3UintegerValue_methods(root_module, root_module['ns3::UintegerValue'])
+    register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
+    register_Ns3VhtCapabilitiesChecker_methods(root_module, root_module['ns3::VhtCapabilitiesChecker'])
+    register_Ns3VhtCapabilitiesValue_methods(root_module, root_module['ns3::VhtCapabilitiesValue'])
     register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
@@ -1001,17 +1037,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1033,11 +1069,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1047,16 +1078,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1294,14 +1315,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1362,11 +1387,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DsrHelper_methods(root_module, cls):
@@ -2310,6 +2330,12 @@
                    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([])
@@ -2603,7 +2629,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2695,10 +2721,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3133,24 +3159,24 @@
     cls.add_constructor([])
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
     cls.add_constructor([param('std::string', 'name')])
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate(uint8_t nss) const [member function]
     cls.add_method('GetCodeRate', 
                    'ns3::WifiCodeRate', 
-                   [], 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint16_t ns3::WifiMode::GetConstellationSize(uint8_t nss) const [member function]
     cls.add_method('GetConstellationSize', 
-                   'uint8_t', 
-                   [], 
+                   'uint16_t', 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetMcsValue() const [member function]
+    cls.add_method('GetMcsValue', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
@@ -3158,10 +3184,10 @@
                    'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [], 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -3183,10 +3209,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    cls.add_method('CreateWifiMcs', 
+                   'ns3::WifiMode', 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   is_static=True)
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
                    is_static=True)
     return
 
@@ -3279,6 +3310,10 @@
     cls.add_constructor([param('ns3::WifiRemoteStationState const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_address [variable]
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
+    cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
+    cls.add_instance_attribute('m_channelWidth', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_greenfield [variable]
     cls.add_instance_attribute('m_greenfield', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_info [variable]
@@ -3286,7 +3321,7 @@
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
-    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiMcsList', is_const=False)
+    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
     cls.add_instance_attribute('m_operationalRateSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_rx [variable]
@@ -3305,8 +3340,13 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## 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, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, uint32_t channelWidth, bool aggregation, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint32_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): uint32_t ns3::WifiTxVector::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -3332,6 +3372,11 @@
                    '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::IsShortGuardInterval() const [member function]
     cls.add_method('IsShortGuardInterval', 
                    'bool', 
@@ -3342,6 +3387,14 @@
                    '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::SetChannelWidth(uint32_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelWidth')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -3446,6 +3499,28 @@
     cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
 
+def register_Ns3MpduInfo_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo(ns3::mpduInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::mpduInfo const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::packetType [variable]
+    cls.add_instance_attribute('packetType', 'uint8_t', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::referenceNumber [variable]
+    cls.add_instance_attribute('referenceNumber', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3SignalNoiseDbm_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm(ns3::signalNoiseDbm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::signalNoiseDbm const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::noise [variable]
+    cls.add_instance_attribute('noise', 'double', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signal [variable]
+    cls.add_instance_attribute('signal', 'double', is_const=False)
+    return
+
 def register_Ns3Chunk_methods(root_module, cls):
     ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
     cls.add_constructor([])
@@ -5986,6 +6061,10 @@
     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::SetQosNoAck() [member function]
     cls.add_method('SetQosNoAck', 
                    'void', 
@@ -5998,6 +6077,10 @@
     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::SetQosNormalAck() [member function]
     cls.add_method('SetQosNormalAck', 
                    'void', 
@@ -6042,19 +6125,19 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuration(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('CalculatePlcpDuration', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpPreambleAndHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('CalculatePlcpPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
                    [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('ConfigureStandard', 
                    'void', 
@@ -6070,11 +6153,6 @@
                    'ns3::Ptr< ns3::WifiChannel >', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint16_t', 
@@ -6085,6 +6163,11 @@
                    'ns3::Time', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -6165,328 +6248,328 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetMFPlcpHeaderMode', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
+    cls.add_method('GetHtMcs0', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
-    cls.add_method('GetMembershipSelectorModes', 
-                   'ns3::WifiModeList', 
-                   [param('uint32_t', 'selector')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
-    cls.add_method('GetMode', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
+    cls.add_method('GetHtMcs1', 
                    'ns3::WifiMode', 
-                   [param('uint32_t', 'mode')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
-    cls.add_method('GetNumberOfReceiveAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
-    cls.add_method('GetNumberOfTransmitAntennas', 
-                   'uint32_t', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
+    cls.add_method('GetHtMcs10', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
+    cls.add_method('GetHtMcs11', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
+    cls.add_method('GetHtMcs12', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
+    cls.add_method('GetHtMcs13', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
+    cls.add_method('GetHtMcs14', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
+    cls.add_method('GetHtMcs15', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
+    cls.add_method('GetHtMcs16', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
+    cls.add_method('GetHtMcs17', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
+    cls.add_method('GetHtMcs18', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
+    cls.add_method('GetHtMcs19', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
+    cls.add_method('GetHtMcs2', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
+    cls.add_method('GetHtMcs20', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
+    cls.add_method('GetHtMcs21', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
+    cls.add_method('GetHtMcs22', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
+    cls.add_method('GetHtMcs23', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
+    cls.add_method('GetHtMcs24', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
+    cls.add_method('GetHtMcs25', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
+    cls.add_method('GetHtMcs26', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
+    cls.add_method('GetHtMcs27', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
+    cls.add_method('GetHtMcs28', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
+    cls.add_method('GetHtMcs29', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
+    cls.add_method('GetHtMcs3', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
+    cls.add_method('GetHtMcs30', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
+    cls.add_method('GetHtMcs31', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
+    cls.add_method('GetHtMcs4', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
+    cls.add_method('GetHtMcs5', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
+    cls.add_method('GetHtMcs6', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
+    cls.add_method('GetHtMcs7', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
+    cls.add_method('GetHtMcs8', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
+    cls.add_method('GetHtMcs9', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetHtPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [], 
+                   [param('ns3::WifiMode', 'payloadMode')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
                    'ns3::WifiMode', 
+                   [param('uint8_t', 'mcs')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
+    cls.add_method('GetOfdmRate12Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
+    cls.add_method('GetOfdmRate18Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
+    cls.add_method('GetOfdmRate24Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
+    cls.add_method('GetOfdmRate36Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
+    cls.add_method('GetOfdmRate48Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
+    cls.add_method('GetOfdmRate54Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
@@ -6505,34 +6588,49 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
                    [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHtTrainingSymbolDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpPreambleDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA1Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA1Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA2Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA2Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigBDuration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
     cls.add_method('GetStateDuration', 
@@ -6553,12 +6651,67 @@
     cls.add_method('GetTxPowerStart', 
                    'double', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
+    cls.add_method('GetVhtMcs0', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
+    cls.add_method('GetVhtMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
+    cls.add_method('GetVhtMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
+    cls.add_method('GetVhtMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
+    cls.add_method('GetVhtMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
+    cls.add_method('GetVhtMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
+    cls.add_method('GetVhtMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
+    cls.add_method('GetVhtMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
+    cls.add_method('GetVhtMcs8', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
+    cls.add_method('GetVhtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetVhtPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
@@ -6599,19 +6752,14 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu, ns3::signalNoiseDbm signalNoise) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::signalNoiseDbm', 'signalNoise')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu) [member function]
     cls.add_method('NotifyMonitorSniffTx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('NotifyRxBegin', 
                    'void', 
@@ -6646,21 +6794,21 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
     cls.add_method('SendPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
                    [param('uint16_t', 'id')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
@@ -6716,11 +6864,6 @@
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
@@ -6732,10 +6875,10 @@
     cls.add_method('AddAllSupportedModes', 
                    'void', 
                    [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
+                   [param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
     cls.add_method('AddBasicMode', 
                    'void', 
@@ -6744,10 +6887,14 @@
     cls.add_method('AddStationHtCapabilities', 
                    'void', 
                    [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htcapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtcapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
     cls.add_method('AddSupportedMcs', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'mcs')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
     cls.add_method('AddSupportedMode', 
                    'void', 
@@ -6760,9 +6907,9 @@
     cls.add_method('GetAckTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
     cls.add_method('GetBasicMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint32_t', 'i')], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint32_t i) const [member function]
@@ -6786,9 +6933,9 @@
     cls.add_method('GetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
     cls.add_method('GetDefaultMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
@@ -6871,6 +7018,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::HasVhtSupported() const [member function]
+    cls.add_method('HasVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
     cls.add_method('IsAssociated', 
                    'bool', 
@@ -6990,6 +7142,10 @@
     cls.add_method('SetRtsCtsThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetupMac', 
                    'void', 
@@ -7000,11 +7156,25 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
+    cls.add_method('UpdateFragmentationThreshold', 
+                   'void', 
+                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAggregation', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetGreenfield', 
                    'bool', 
@@ -7020,9 +7190,9 @@
                    'ns3::Ptr< ns3::WifiMac >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
     cls.add_method('GetMcsSupported', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
                    is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
@@ -7080,6 +7250,11 @@
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
     cls.add_method('DoGetAckTxGuardInterval', 
                    'bool', 
@@ -7105,6 +7280,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetBlockAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetBlockAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
     cls.add_method('DoGetBlockAckTxGuardInterval', 
                    'bool', 
@@ -7130,6 +7310,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetCtsTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
     cls.add_method('DoGetCtsTxGuardInterval', 
                    'bool', 
@@ -7347,6 +7532,10 @@
     cls.add_method('PrintArpCache', 
                    'void', 
                    [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Remove(ns3::ArpCache::Entry * entry) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::ArpCache::Entry *', 'entry')])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::SetAliveTimeout(ns3::Time aliveTimeout) [member function]
     cls.add_method('SetAliveTimeout', 
                    'void', 
@@ -7383,6 +7572,10 @@
     cls.add_constructor([param('ns3::ArpCache::Entry const &', 'arg0')])
     ## arp-cache.h (module 'internet'): ns3::ArpCache::Entry::Entry(ns3::ArpCache * arp) [constructor]
     cls.add_constructor([param('ns3::ArpCache *', 'arp')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearPendingPacket() [member function]
+    cls.add_method('ClearPendingPacket', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearRetries() [member function]
     cls.add_method('ClearRetries', 
                    'void', 
@@ -7423,6 +7616,10 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsPermanent() [member function]
+    cls.add_method('IsPermanent', 
+                   'bool', 
+                   [])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsWaitReply() [member function]
     cls.add_method('IsWaitReply', 
                    'bool', 
@@ -7435,6 +7632,10 @@
     cls.add_method('MarkDead', 
                    'void', 
                    [])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkPermanent() [member function]
+    cls.add_method('MarkPermanent', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('MarkWaitReply', 
                    'void', 
@@ -7443,6 +7644,10 @@
     cls.add_method('SetIpv4Address', 
                    'void', 
                    [param('ns3::Ipv4Address', 'destination')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::SetMacAddresss(ns3::Address macAddress) [member function]
+    cls.add_method('SetMacAddresss', 
+                   'void', 
+                   [param('ns3::Address', 'macAddress')])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::UpdateWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('UpdateWaitReply', 
                    'bool', 
@@ -7552,11 +7757,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -7666,10 +7881,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -7937,6 +8152,16 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
+    cls.add_method('GetAntennaSelectionCapabilities', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
+    cls.add_method('GetExtendedHtCapabilities', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
     cls.add_method('GetGreenfield', 
                    'uint8_t', 
@@ -7952,11 +8177,31 @@
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLSigProtectionSupport() const [member function]
+    cls.add_method('GetLSigProtectionSupport', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
     cls.add_method('GetLdpc', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
+    cls.add_method('GetMaxAmsduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetRxHighestSupportedDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t * ns3::HtCapabilities::GetRxMcsBitmask() [member function]
     cls.add_method('GetRxMcsBitmask', 
                    'uint8_t *', 
@@ -7971,6 +8216,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval40() const [member function]
+    cls.add_method('GetShortGuardInterval40', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
     cls.add_method('GetSupportedChannelWidth', 
                    'uint8_t', 
@@ -7986,6 +8236,21 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
+    cls.add_method('GetTxBfCapabilities', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMaxNSpatialStreams() const [member function]
+    cls.add_method('GetTxMaxNSpatialStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMcsSetDefined() const [member function]
+    cls.add_method('GetTxMcsSetDefined', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) [member function]
     cls.add_method('IsSupportedMcs', 
                    'bool', 
@@ -8004,6 +8269,14 @@
     cls.add_method('SetAmpduParameters', 
                    'void', 
                    [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
+    cls.add_method('SetAntennaSelectionCapabilities', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
+    cls.add_method('SetExtendedHtCapabilities', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
     cls.add_method('SetGreenfield', 
                    'void', 
@@ -8016,10 +8289,26 @@
     cls.add_method('SetHtSupported', 
                    'void', 
                    [param('uint8_t', 'htsupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lsigprotection) [member function]
+    cls.add_method('SetLSigProtectionSupport', 
+                   'void', 
+                   [param('uint8_t', 'lsigprotection')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint8_t maxampdulength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxampdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint8_t maxamsdulength) [member function]
+    cls.add_method('SetMaxAmsduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxamsdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxsupportedrate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxsupportedrate')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
     cls.add_method('SetRxMcsBitmask', 
                    'void', 
@@ -8028,6 +8317,10 @@
     cls.add_method('SetShortGuardInterval20', 
                    'void', 
                    [param('uint8_t', 'shortguardinterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardInterval40', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedchannelwidth) [member function]
     cls.add_method('SetSupportedChannelWidth', 
                    'void', 
@@ -8036,6 +8329,18 @@
     cls.add_method('SetSupportedMcsSet', 
                    'void', 
                    [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
+    cls.add_method('SetTxBfCapabilities', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxtxspatialstreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxtxspatialstreams')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txmcssetdefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txmcssetdefined')])
     return
 
 def register_Ns3HtCapabilitiesChecker_methods(root_module, cls):
@@ -9845,11 +10150,6 @@
     cls.add_method('SetNode', 
                    'void', 
                    [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## tcp-l4-protocol.h (module 'internet'): int ns3::TcpL4Protocol::GetProtocolNumber() const [member function]
-    cls.add_method('GetProtocolNumber', 
-                   'int', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): ns3::Ptr<ns3::Socket> ns3::TcpL4Protocol::CreateSocket() [member function]
     cls.add_method('CreateSocket', 
                    'ns3::Ptr< ns3::Socket >', 
@@ -9898,6 +10198,19 @@
     cls.add_method('Allocate6', 
                    'ns3::Ipv6EndPoint *', 
                    [param('ns3::Ipv6Address', 'localAddress'), param('uint16_t', 'localPort'), param('ns3::Ipv6Address', 'peerAddress'), param('uint16_t', 'peerPort')])
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::SendPacket(ns3::Ptr<ns3::Packet> pkt, ns3::TcpHeader const & outgoing, ns3::Address const & saddr, ns3::Address const & daddr, ns3::Ptr<ns3::NetDevice> oif=0) const [member function]
+    cls.add_method('SendPacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'pkt'), param('ns3::TcpHeader const &', 'outgoing'), param('ns3::Address const &', 'saddr'), param('ns3::Address const &', 'daddr'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')], 
+                   is_const=True)
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::AddSocket(ns3::Ptr<ns3::TcpSocketBase> socket) [member function]
+    cls.add_method('AddSocket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketBase >', 'socket')])
+    ## tcp-l4-protocol.h (module 'internet'): bool ns3::TcpL4Protocol::RemoveSocket(ns3::Ptr<ns3::TcpSocketBase> socket) [member function]
+    cls.add_method('RemoveSocket', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::TcpSocketBase >', 'socket')])
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::DeAllocate(ns3::Ipv4EndPoint * endPoint) [member function]
     cls.add_method('DeAllocate', 
                    'void', 
@@ -9906,23 +10219,15 @@
     cls.add_method('DeAllocate', 
                    'void', 
                    [param('ns3::Ipv6EndPoint *', 'endPoint')])
-    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv4Address saddr, ns3::Ipv4Address daddr, uint16_t sport, uint16_t dport, ns3::Ptr<ns3::NetDevice> oif=0) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Address', 'saddr'), param('ns3::Ipv4Address', 'daddr'), param('uint16_t', 'sport'), param('uint16_t', 'dport'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')])
-    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Address saddr, ns3::Ipv6Address daddr, uint16_t sport, uint16_t dport, ns3::Ptr<ns3::NetDevice> oif=0) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Address', 'saddr'), param('ns3::Ipv6Address', 'daddr'), param('uint16_t', 'sport'), param('uint16_t', 'dport'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')])
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & header, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & incomingIpHeader, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'incomingIpHeader'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
                    is_virtual=True)
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & incomingIpHeader, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'incomingIpHeader'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::ReceiveIcmp(ns3::Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo, ns3::Ipv4Address payloadSource, ns3::Ipv4Address payloadDestination, uint8_t const * payload) [member function]
     cls.add_method('ReceiveIcmp', 
@@ -9944,6 +10249,11 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Ipv6Address, ns3::Ipv6Address, unsigned char, ns3::Ptr< ns3::Ipv6Route >, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
+    ## tcp-l4-protocol.h (module 'internet'): int ns3::TcpL4Protocol::GetProtocolNumber() const [member function]
+    cls.add_method('GetProtocolNumber', 
+                   'int', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::Ipv4Address, ns3::Ipv4Address, unsigned char, ns3::Ptr<ns3::Ipv4Route>, ns3::empty, ns3::empty, ns3::empty, ns3::empty> ns3::TcpL4Protocol::GetDownTarget() const [member function]
     cls.add_method('GetDownTarget', 
                    'ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Ipv4Address, ns3::Ipv4Address, unsigned char, ns3::Ptr< ns3::Ipv4Route >, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 
@@ -9964,6 +10274,16 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::PacketReceived(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader & incomingTcpHeader, ns3::Address const & source, ns3::Address const & destination) [member function]
+    cls.add_method('PacketReceived', 
+                   'ns3::IpL4Protocol::RxStatus', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader &', 'incomingTcpHeader'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'destination')], 
+                   visibility='protected')
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::NoEndPointsFound(ns3::TcpHeader const & incomingHeader, ns3::Address const & incomingSAddr, ns3::Address const & incomingDAddr) [member function]
+    cls.add_method('NoEndPointsFound', 
+                   'void', 
+                   [param('ns3::TcpHeader const &', 'incomingHeader'), param('ns3::Address const &', 'incomingSAddr'), param('ns3::Address const &', 'incomingDAddr')], 
+                   visibility='protected')
     return
 
 def register_Ns3TimeValue_methods(root_module, cls):
@@ -10211,6 +10531,237 @@
                    [param('uint64_t const &', 'value')])
     return
 
+def register_Ns3VhtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::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)
+    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxAmpduLengthExponent() const [member function]
+    cls.add_method('GetMaxAmpduLengthExponent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
+    cls.add_method('GetMaxMpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
+    cls.add_method('GetRxLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxMcsMap() const [member function]
+    cls.add_method('GetRxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
+    cls.add_method('GetRxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor160Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor160Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor80Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor80Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
+    cls.add_method('GetSupportedMcsAndNssSet', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetTxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxMcsMap() const [member function]
+    cls.add_method('GetTxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
+    cls.add_method('GetTxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
+    cls.add_method('GetVhtCapabilitiesInfo', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t Nss) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'Nss')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLengthExponent(uint8_t exponent) [member function]
+    cls.add_method('SetMaxAmpduLengthExponent', 
+                   'void', 
+                   [param('uint8_t', 'exponent')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint8_t length) [member function]
+    cls.add_method('SetMaxMpduLength', 
+                   'void', 
+                   [param('uint8_t', 'length')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetRxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxldpc) [member function]
+    cls.add_method('SetRxLdpc', 
+                   'void', 
+                   [param('uint8_t', 'rxldpc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxstbc) [member function]
+    cls.add_method('SetRxStbc', 
+                   'void', 
+                   [param('uint8_t', 'rxstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor160Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor80Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelwidthset) [member function]
+    cls.add_method('SetSupportedChannelWidthSet', 
+                   'void', 
+                   [param('uint8_t', 'channelwidthset')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNssSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetTxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txstbc) [member function]
+    cls.add_method('SetTxStbc', 
+                   'void', 
+                   [param('uint8_t', 'txstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
+    cls.add_method('SetVhtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtsupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtsupported')])
+    return
+
+def register_Ns3VhtCapabilitiesChecker_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker(ns3::VhtCapabilitiesChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesChecker const &', 'arg0')])
+    return
+
+def register_Ns3VhtCapabilitiesValue_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilitiesValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesValue const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilities const & value) [constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'value')])
+    ## vht-capabilities.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::VhtCapabilitiesValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilitiesValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities ns3::VhtCapabilitiesValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): std::string ns3::VhtCapabilitiesValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilitiesValue::Set(ns3::VhtCapabilities const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::VhtCapabilities const &', 'value')])
+    return
+
 def register_Ns3WifiModeChecker_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
     cls.add_constructor([])
@@ -13307,6 +13858,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_dsr(module.get_submodule('dsr'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
@@ -13321,6 +13873,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_dsr(module, root_module):
     return
 
diff -Naur ns-3.23/src/dsr/bindings/modulegen__gcc_LP64.py ns-3.24/src/dsr/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/dsr/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/dsr/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -23,11 +23,11 @@
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
     module.add_enum('WifiMacType', ['WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_CTLWRAPPER', '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-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'], import_from_module='ns.wifi')
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT'], import_from_module='ns.wifi')
     ## wifi-phy-standard.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_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211ac'], 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_UNDEF'], import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
@@ -130,6 +130,8 @@
     root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
+    ## 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]
@@ -204,6 +206,10 @@
     module.add_class('int64x64_t', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
     module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo [struct]
+    module.add_class('mpduInfo', import_from_module='ns.wifi')
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm [struct]
+    module.add_class('signalNoiseDbm', import_from_module='ns.wifi')
     ## chunk.h (module 'network'): ns3::Chunk [class]
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
@@ -442,6 +448,12 @@
     module.add_class('UdpL4Protocol', import_from_module='ns.internet', parent=root_module['ns3::IpL4Protocol'])
     ## uinteger.h (module 'core'): ns3::UintegerValue [class]
     module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities [class]
+    module.add_class('VhtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker [class]
+    module.add_class('VhtCapabilitiesChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue [class]
+    module.add_class('VhtCapabilitiesValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker [class]
     module.add_class('WifiModeChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue [class]
@@ -453,24 +465,26 @@
     ## 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('ns3::WifiModeList', 'ns3::WifiMode', container_type=u'vector')
-    module.add_container('ns3::WifiMcsList', 'unsigned char', container_type=u'vector')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type=u'list')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type=u'map')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', u'ns3::WifiMcsListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', u'ns3::WifiMcsListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', u'ns3::WifiMcsListIterator&')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >', u'ns3::WifiMcsList')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >*', u'ns3::WifiMcsList*')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >&', u'ns3::WifiMcsList&')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< short unsigned int, short int >', u'ns3::SequenceNumber16')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< short unsigned int, short int >*', u'ns3::SequenceNumber16*')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< short unsigned int, short int >&', u'ns3::SequenceNumber16&')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned int, int >', u'ns3::SequenceNumber32')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned int, int >*', u'ns3::SequenceNumber32*')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned int, int >&', u'ns3::SequenceNumber32&')
     typehandlers.add_type_alias(u'uint8_t', u'ns3::WifiInformationElementId')
     typehandlers.add_type_alias(u'uint8_t*', u'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias(u'uint8_t&', u'ns3::WifiInformationElementId&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >', u'ns3::SequenceNumber8')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >*', u'ns3::SequenceNumber8*')
+    typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >&', u'ns3::SequenceNumber8&')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >', u'ns3::WifiModeList')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >*', u'ns3::WifiModeList*')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >&', u'ns3::WifiModeList&')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -484,6 +498,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace dsr
     
     nested_module = module.add_cpp_namespace('dsr')
@@ -530,6 +550,16 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_dsr(module):
     root_module = module.get_root()
     
@@ -688,6 +718,7 @@
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     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'])
@@ -718,6 +749,8 @@
     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_Ns3MpduInfo_methods(root_module, root_module['ns3::mpduInfo'])
+    register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::signalNoiseDbm'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3Icmpv4DestinationUnreachable_methods(root_module, root_module['ns3::Icmpv4DestinationUnreachable'])
@@ -821,6 +854,9 @@
     register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
     register_Ns3UdpL4Protocol_methods(root_module, root_module['ns3::UdpL4Protocol'])
     register_Ns3UintegerValue_methods(root_module, root_module['ns3::UintegerValue'])
+    register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
+    register_Ns3VhtCapabilitiesChecker_methods(root_module, root_module['ns3::VhtCapabilitiesChecker'])
+    register_Ns3VhtCapabilitiesValue_methods(root_module, root_module['ns3::VhtCapabilitiesValue'])
     register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
@@ -1001,17 +1037,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1033,11 +1069,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1047,16 +1078,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1294,14 +1315,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1362,11 +1387,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DsrHelper_methods(root_module, cls):
@@ -2310,6 +2330,12 @@
                    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([])
@@ -2603,7 +2629,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2695,10 +2721,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3133,24 +3159,24 @@
     cls.add_constructor([])
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
     cls.add_constructor([param('std::string', 'name')])
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate(uint8_t nss) const [member function]
     cls.add_method('GetCodeRate', 
                    'ns3::WifiCodeRate', 
-                   [], 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint16_t ns3::WifiMode::GetConstellationSize(uint8_t nss) const [member function]
     cls.add_method('GetConstellationSize', 
-                   'uint8_t', 
-                   [], 
+                   'uint16_t', 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetMcsValue() const [member function]
+    cls.add_method('GetMcsValue', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
@@ -3158,10 +3184,10 @@
                    'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [], 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -3183,10 +3209,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    cls.add_method('CreateWifiMcs', 
+                   'ns3::WifiMode', 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   is_static=True)
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
                    is_static=True)
     return
 
@@ -3279,6 +3310,10 @@
     cls.add_constructor([param('ns3::WifiRemoteStationState const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_address [variable]
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
+    cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
+    cls.add_instance_attribute('m_channelWidth', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_greenfield [variable]
     cls.add_instance_attribute('m_greenfield', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_info [variable]
@@ -3286,7 +3321,7 @@
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
-    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiMcsList', is_const=False)
+    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
     cls.add_instance_attribute('m_operationalRateSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_rx [variable]
@@ -3305,8 +3340,13 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## 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, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, uint32_t channelWidth, bool aggregation, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint32_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): uint32_t ns3::WifiTxVector::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -3332,6 +3372,11 @@
                    '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::IsShortGuardInterval() const [member function]
     cls.add_method('IsShortGuardInterval', 
                    'bool', 
@@ -3342,6 +3387,14 @@
                    '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::SetChannelWidth(uint32_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelWidth')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -3446,6 +3499,28 @@
     cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
 
+def register_Ns3MpduInfo_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo(ns3::mpduInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::mpduInfo const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::packetType [variable]
+    cls.add_instance_attribute('packetType', 'uint8_t', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::referenceNumber [variable]
+    cls.add_instance_attribute('referenceNumber', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3SignalNoiseDbm_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm(ns3::signalNoiseDbm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::signalNoiseDbm const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::noise [variable]
+    cls.add_instance_attribute('noise', 'double', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signal [variable]
+    cls.add_instance_attribute('signal', 'double', is_const=False)
+    return
+
 def register_Ns3Chunk_methods(root_module, cls):
     ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
     cls.add_constructor([])
@@ -5986,6 +6061,10 @@
     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::SetQosNoAck() [member function]
     cls.add_method('SetQosNoAck', 
                    'void', 
@@ -5998,6 +6077,10 @@
     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::SetQosNormalAck() [member function]
     cls.add_method('SetQosNormalAck', 
                    'void', 
@@ -6042,19 +6125,19 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuration(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('CalculatePlcpDuration', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpPreambleAndHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('CalculatePlcpPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
                    [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('ConfigureStandard', 
                    'void', 
@@ -6070,11 +6153,6 @@
                    'ns3::Ptr< ns3::WifiChannel >', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint16_t', 
@@ -6085,6 +6163,11 @@
                    'ns3::Time', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -6165,328 +6248,328 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetMFPlcpHeaderMode', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
+    cls.add_method('GetHtMcs0', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
-    cls.add_method('GetMembershipSelectorModes', 
-                   'ns3::WifiModeList', 
-                   [param('uint32_t', 'selector')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
-    cls.add_method('GetMode', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
+    cls.add_method('GetHtMcs1', 
                    'ns3::WifiMode', 
-                   [param('uint32_t', 'mode')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
-    cls.add_method('GetNumberOfReceiveAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
-    cls.add_method('GetNumberOfTransmitAntennas', 
-                   'uint32_t', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
+    cls.add_method('GetHtMcs10', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
+    cls.add_method('GetHtMcs11', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
+    cls.add_method('GetHtMcs12', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
+    cls.add_method('GetHtMcs13', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
+    cls.add_method('GetHtMcs14', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
+    cls.add_method('GetHtMcs15', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
+    cls.add_method('GetHtMcs16', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
+    cls.add_method('GetHtMcs17', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
+    cls.add_method('GetHtMcs18', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
+    cls.add_method('GetHtMcs19', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
+    cls.add_method('GetHtMcs2', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
+    cls.add_method('GetHtMcs20', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
+    cls.add_method('GetHtMcs21', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
+    cls.add_method('GetHtMcs22', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
+    cls.add_method('GetHtMcs23', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
+    cls.add_method('GetHtMcs24', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
+    cls.add_method('GetHtMcs25', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
+    cls.add_method('GetHtMcs26', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
+    cls.add_method('GetHtMcs27', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
+    cls.add_method('GetHtMcs28', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
+    cls.add_method('GetHtMcs29', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
+    cls.add_method('GetHtMcs3', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
+    cls.add_method('GetHtMcs30', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
+    cls.add_method('GetHtMcs31', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
+    cls.add_method('GetHtMcs4', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
+    cls.add_method('GetHtMcs5', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
+    cls.add_method('GetHtMcs6', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
+    cls.add_method('GetHtMcs7', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
+    cls.add_method('GetHtMcs8', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
+    cls.add_method('GetHtMcs9', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetHtPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [], 
+                   [param('ns3::WifiMode', 'payloadMode')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
                    'ns3::WifiMode', 
+                   [param('uint8_t', 'mcs')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
+    cls.add_method('GetOfdmRate12Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
+    cls.add_method('GetOfdmRate18Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
+    cls.add_method('GetOfdmRate24Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
+    cls.add_method('GetOfdmRate36Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
+    cls.add_method('GetOfdmRate48Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
+    cls.add_method('GetOfdmRate54Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
@@ -6505,34 +6588,49 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
                    [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHtTrainingSymbolDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpPreambleDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA1Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA1Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA2Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA2Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigBDuration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
     cls.add_method('GetStateDuration', 
@@ -6553,12 +6651,67 @@
     cls.add_method('GetTxPowerStart', 
                    'double', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
+    cls.add_method('GetVhtMcs0', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
+    cls.add_method('GetVhtMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
+    cls.add_method('GetVhtMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
+    cls.add_method('GetVhtMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
+    cls.add_method('GetVhtMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
+    cls.add_method('GetVhtMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
+    cls.add_method('GetVhtMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
+    cls.add_method('GetVhtMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
+    cls.add_method('GetVhtMcs8', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
+    cls.add_method('GetVhtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetVhtPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
@@ -6599,19 +6752,14 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu, ns3::signalNoiseDbm signalNoise) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::signalNoiseDbm', 'signalNoise')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu) [member function]
     cls.add_method('NotifyMonitorSniffTx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('NotifyRxBegin', 
                    'void', 
@@ -6646,21 +6794,21 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
     cls.add_method('SendPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
                    [param('uint16_t', 'id')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
@@ -6716,11 +6864,6 @@
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
@@ -6732,10 +6875,10 @@
     cls.add_method('AddAllSupportedModes', 
                    'void', 
                    [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
+                   [param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
     cls.add_method('AddBasicMode', 
                    'void', 
@@ -6744,10 +6887,14 @@
     cls.add_method('AddStationHtCapabilities', 
                    'void', 
                    [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htcapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtcapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
     cls.add_method('AddSupportedMcs', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'mcs')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
     cls.add_method('AddSupportedMode', 
                    'void', 
@@ -6760,9 +6907,9 @@
     cls.add_method('GetAckTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
     cls.add_method('GetBasicMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint32_t', 'i')], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint32_t i) const [member function]
@@ -6786,9 +6933,9 @@
     cls.add_method('GetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
     cls.add_method('GetDefaultMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
@@ -6871,6 +7018,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::HasVhtSupported() const [member function]
+    cls.add_method('HasVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
     cls.add_method('IsAssociated', 
                    'bool', 
@@ -6990,6 +7142,10 @@
     cls.add_method('SetRtsCtsThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetupMac', 
                    'void', 
@@ -7000,11 +7156,25 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
+    cls.add_method('UpdateFragmentationThreshold', 
+                   'void', 
+                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAggregation', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetGreenfield', 
                    'bool', 
@@ -7020,9 +7190,9 @@
                    'ns3::Ptr< ns3::WifiMac >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
     cls.add_method('GetMcsSupported', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
                    is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
@@ -7080,6 +7250,11 @@
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
     cls.add_method('DoGetAckTxGuardInterval', 
                    'bool', 
@@ -7105,6 +7280,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetBlockAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetBlockAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
     cls.add_method('DoGetBlockAckTxGuardInterval', 
                    'bool', 
@@ -7130,6 +7310,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetCtsTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
     cls.add_method('DoGetCtsTxGuardInterval', 
                    'bool', 
@@ -7347,6 +7532,10 @@
     cls.add_method('PrintArpCache', 
                    'void', 
                    [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Remove(ns3::ArpCache::Entry * entry) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::ArpCache::Entry *', 'entry')])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::SetAliveTimeout(ns3::Time aliveTimeout) [member function]
     cls.add_method('SetAliveTimeout', 
                    'void', 
@@ -7383,6 +7572,10 @@
     cls.add_constructor([param('ns3::ArpCache::Entry const &', 'arg0')])
     ## arp-cache.h (module 'internet'): ns3::ArpCache::Entry::Entry(ns3::ArpCache * arp) [constructor]
     cls.add_constructor([param('ns3::ArpCache *', 'arp')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearPendingPacket() [member function]
+    cls.add_method('ClearPendingPacket', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearRetries() [member function]
     cls.add_method('ClearRetries', 
                    'void', 
@@ -7423,6 +7616,10 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsPermanent() [member function]
+    cls.add_method('IsPermanent', 
+                   'bool', 
+                   [])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsWaitReply() [member function]
     cls.add_method('IsWaitReply', 
                    'bool', 
@@ -7435,6 +7632,10 @@
     cls.add_method('MarkDead', 
                    'void', 
                    [])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkPermanent() [member function]
+    cls.add_method('MarkPermanent', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('MarkWaitReply', 
                    'void', 
@@ -7443,6 +7644,10 @@
     cls.add_method('SetIpv4Address', 
                    'void', 
                    [param('ns3::Ipv4Address', 'destination')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::SetMacAddresss(ns3::Address macAddress) [member function]
+    cls.add_method('SetMacAddresss', 
+                   'void', 
+                   [param('ns3::Address', 'macAddress')])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::UpdateWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('UpdateWaitReply', 
                    'bool', 
@@ -7552,11 +7757,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -7666,10 +7881,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -7937,6 +8152,16 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
+    cls.add_method('GetAntennaSelectionCapabilities', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
+    cls.add_method('GetExtendedHtCapabilities', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
     cls.add_method('GetGreenfield', 
                    'uint8_t', 
@@ -7952,11 +8177,31 @@
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLSigProtectionSupport() const [member function]
+    cls.add_method('GetLSigProtectionSupport', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
     cls.add_method('GetLdpc', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
+    cls.add_method('GetMaxAmsduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetRxHighestSupportedDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t * ns3::HtCapabilities::GetRxMcsBitmask() [member function]
     cls.add_method('GetRxMcsBitmask', 
                    'uint8_t *', 
@@ -7971,6 +8216,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval40() const [member function]
+    cls.add_method('GetShortGuardInterval40', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
     cls.add_method('GetSupportedChannelWidth', 
                    'uint8_t', 
@@ -7986,6 +8236,21 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
+    cls.add_method('GetTxBfCapabilities', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMaxNSpatialStreams() const [member function]
+    cls.add_method('GetTxMaxNSpatialStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMcsSetDefined() const [member function]
+    cls.add_method('GetTxMcsSetDefined', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) [member function]
     cls.add_method('IsSupportedMcs', 
                    'bool', 
@@ -8004,6 +8269,14 @@
     cls.add_method('SetAmpduParameters', 
                    'void', 
                    [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
+    cls.add_method('SetAntennaSelectionCapabilities', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
+    cls.add_method('SetExtendedHtCapabilities', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
     cls.add_method('SetGreenfield', 
                    'void', 
@@ -8016,10 +8289,26 @@
     cls.add_method('SetHtSupported', 
                    'void', 
                    [param('uint8_t', 'htsupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lsigprotection) [member function]
+    cls.add_method('SetLSigProtectionSupport', 
+                   'void', 
+                   [param('uint8_t', 'lsigprotection')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint8_t maxampdulength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxampdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint8_t maxamsdulength) [member function]
+    cls.add_method('SetMaxAmsduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxamsdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxsupportedrate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxsupportedrate')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
     cls.add_method('SetRxMcsBitmask', 
                    'void', 
@@ -8028,6 +8317,10 @@
     cls.add_method('SetShortGuardInterval20', 
                    'void', 
                    [param('uint8_t', 'shortguardinterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardInterval40', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedchannelwidth) [member function]
     cls.add_method('SetSupportedChannelWidth', 
                    'void', 
@@ -8036,6 +8329,18 @@
     cls.add_method('SetSupportedMcsSet', 
                    'void', 
                    [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
+    cls.add_method('SetTxBfCapabilities', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxtxspatialstreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxtxspatialstreams')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txmcssetdefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txmcssetdefined')])
     return
 
 def register_Ns3HtCapabilitiesChecker_methods(root_module, cls):
@@ -9845,11 +10150,6 @@
     cls.add_method('SetNode', 
                    'void', 
                    [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## tcp-l4-protocol.h (module 'internet'): int ns3::TcpL4Protocol::GetProtocolNumber() const [member function]
-    cls.add_method('GetProtocolNumber', 
-                   'int', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): ns3::Ptr<ns3::Socket> ns3::TcpL4Protocol::CreateSocket() [member function]
     cls.add_method('CreateSocket', 
                    'ns3::Ptr< ns3::Socket >', 
@@ -9898,6 +10198,19 @@
     cls.add_method('Allocate6', 
                    'ns3::Ipv6EndPoint *', 
                    [param('ns3::Ipv6Address', 'localAddress'), param('uint16_t', 'localPort'), param('ns3::Ipv6Address', 'peerAddress'), param('uint16_t', 'peerPort')])
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::SendPacket(ns3::Ptr<ns3::Packet> pkt, ns3::TcpHeader const & outgoing, ns3::Address const & saddr, ns3::Address const & daddr, ns3::Ptr<ns3::NetDevice> oif=0) const [member function]
+    cls.add_method('SendPacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'pkt'), param('ns3::TcpHeader const &', 'outgoing'), param('ns3::Address const &', 'saddr'), param('ns3::Address const &', 'daddr'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')], 
+                   is_const=True)
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::AddSocket(ns3::Ptr<ns3::TcpSocketBase> socket) [member function]
+    cls.add_method('AddSocket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketBase >', 'socket')])
+    ## tcp-l4-protocol.h (module 'internet'): bool ns3::TcpL4Protocol::RemoveSocket(ns3::Ptr<ns3::TcpSocketBase> socket) [member function]
+    cls.add_method('RemoveSocket', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::TcpSocketBase >', 'socket')])
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::DeAllocate(ns3::Ipv4EndPoint * endPoint) [member function]
     cls.add_method('DeAllocate', 
                    'void', 
@@ -9906,23 +10219,15 @@
     cls.add_method('DeAllocate', 
                    'void', 
                    [param('ns3::Ipv6EndPoint *', 'endPoint')])
-    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv4Address saddr, ns3::Ipv4Address daddr, uint16_t sport, uint16_t dport, ns3::Ptr<ns3::NetDevice> oif=0) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Address', 'saddr'), param('ns3::Ipv4Address', 'daddr'), param('uint16_t', 'sport'), param('uint16_t', 'dport'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')])
-    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Address saddr, ns3::Ipv6Address daddr, uint16_t sport, uint16_t dport, ns3::Ptr<ns3::NetDevice> oif=0) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Address', 'saddr'), param('ns3::Ipv6Address', 'daddr'), param('uint16_t', 'sport'), param('uint16_t', 'dport'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')])
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & header, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & incomingIpHeader, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'incomingIpHeader'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
                    is_virtual=True)
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & incomingIpHeader, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'incomingIpHeader'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::ReceiveIcmp(ns3::Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo, ns3::Ipv4Address payloadSource, ns3::Ipv4Address payloadDestination, uint8_t const * payload) [member function]
     cls.add_method('ReceiveIcmp', 
@@ -9944,6 +10249,11 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Ipv6Address, ns3::Ipv6Address, unsigned char, ns3::Ptr< ns3::Ipv6Route >, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
+    ## tcp-l4-protocol.h (module 'internet'): int ns3::TcpL4Protocol::GetProtocolNumber() const [member function]
+    cls.add_method('GetProtocolNumber', 
+                   'int', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::Ipv4Address, ns3::Ipv4Address, unsigned char, ns3::Ptr<ns3::Ipv4Route>, ns3::empty, ns3::empty, ns3::empty, ns3::empty> ns3::TcpL4Protocol::GetDownTarget() const [member function]
     cls.add_method('GetDownTarget', 
                    'ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Ipv4Address, ns3::Ipv4Address, unsigned char, ns3::Ptr< ns3::Ipv4Route >, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 
@@ -9964,6 +10274,16 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::PacketReceived(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader & incomingTcpHeader, ns3::Address const & source, ns3::Address const & destination) [member function]
+    cls.add_method('PacketReceived', 
+                   'ns3::IpL4Protocol::RxStatus', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader &', 'incomingTcpHeader'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'destination')], 
+                   visibility='protected')
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::NoEndPointsFound(ns3::TcpHeader const & incomingHeader, ns3::Address const & incomingSAddr, ns3::Address const & incomingDAddr) [member function]
+    cls.add_method('NoEndPointsFound', 
+                   'void', 
+                   [param('ns3::TcpHeader const &', 'incomingHeader'), param('ns3::Address const &', 'incomingSAddr'), param('ns3::Address const &', 'incomingDAddr')], 
+                   visibility='protected')
     return
 
 def register_Ns3TimeValue_methods(root_module, cls):
@@ -10211,6 +10531,237 @@
                    [param('uint64_t const &', 'value')])
     return
 
+def register_Ns3VhtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::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)
+    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxAmpduLengthExponent() const [member function]
+    cls.add_method('GetMaxAmpduLengthExponent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
+    cls.add_method('GetMaxMpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
+    cls.add_method('GetRxLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxMcsMap() const [member function]
+    cls.add_method('GetRxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
+    cls.add_method('GetRxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor160Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor160Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor80Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor80Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
+    cls.add_method('GetSupportedMcsAndNssSet', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetTxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxMcsMap() const [member function]
+    cls.add_method('GetTxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
+    cls.add_method('GetTxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
+    cls.add_method('GetVhtCapabilitiesInfo', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t Nss) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'Nss')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLengthExponent(uint8_t exponent) [member function]
+    cls.add_method('SetMaxAmpduLengthExponent', 
+                   'void', 
+                   [param('uint8_t', 'exponent')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint8_t length) [member function]
+    cls.add_method('SetMaxMpduLength', 
+                   'void', 
+                   [param('uint8_t', 'length')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetRxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxldpc) [member function]
+    cls.add_method('SetRxLdpc', 
+                   'void', 
+                   [param('uint8_t', 'rxldpc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxstbc) [member function]
+    cls.add_method('SetRxStbc', 
+                   'void', 
+                   [param('uint8_t', 'rxstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor160Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor80Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelwidthset) [member function]
+    cls.add_method('SetSupportedChannelWidthSet', 
+                   'void', 
+                   [param('uint8_t', 'channelwidthset')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNssSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetTxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txstbc) [member function]
+    cls.add_method('SetTxStbc', 
+                   'void', 
+                   [param('uint8_t', 'txstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
+    cls.add_method('SetVhtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtsupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtsupported')])
+    return
+
+def register_Ns3VhtCapabilitiesChecker_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker(ns3::VhtCapabilitiesChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesChecker const &', 'arg0')])
+    return
+
+def register_Ns3VhtCapabilitiesValue_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilitiesValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesValue const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilities const & value) [constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'value')])
+    ## vht-capabilities.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::VhtCapabilitiesValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilitiesValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities ns3::VhtCapabilitiesValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): std::string ns3::VhtCapabilitiesValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilitiesValue::Set(ns3::VhtCapabilities const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::VhtCapabilities const &', 'value')])
+    return
+
 def register_Ns3WifiModeChecker_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
     cls.add_constructor([])
@@ -13307,6 +13858,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_dsr(module.get_submodule('dsr'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
@@ -13321,6 +13873,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_dsr(module, root_module):
     return
 
diff -Naur ns-3.23/src/dsr/model/dsr-options.cc ns-3.24/src/dsr/model/dsr-options.cc
--- ns-3.23/src/dsr/model/dsr-options.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/dsr/model/dsr-options.cc	2015-09-15 11:18:44.000000000 -0700
@@ -84,7 +84,7 @@
     .AddTraceSource ("Rx",
                      "Receive DSR packet.",
                      MakeTraceSourceAccessor (&DsrOptions::m_rxPacketTrace),
-                     "ns3::Packet::TracedCallback")
+                     "ns3::dsr::DsrOptionSRHeader::TracedCallback")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/dsr/model/dsr-rcache.cc ns-3.24/src/dsr/model/dsr-rcache.cc
--- ns-3.23/src/dsr/model/dsr-rcache.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/dsr/model/dsr-rcache.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1222,7 +1222,7 @@
        i != m_arp.end (); ++i)
     {
       ArpCache::Entry * entry = (*i)->Lookup (addr);
-      if (entry != 0 && entry->IsAlive () && !entry->IsExpired ())
+      if (entry != 0 && (entry->IsAlive () || entry->IsPermanent ()) && !entry->IsExpired ())
         {
           hwaddr = Mac48Address::ConvertFrom (entry->GetMacAddress ());
           break;
diff -Naur ns-3.23/src/dsr/model/dsr-routing.cc ns-3.24/src/dsr/model/dsr-routing.cc
--- ns-3.23/src/dsr/model/dsr-routing.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/dsr/model/dsr-routing.cc	2015-09-15 11:18:44.000000000 -0700
@@ -343,7 +343,7 @@
     .AddTraceSource ("Tx",
                      "Send DSR packet.",
                      MakeTraceSourceAccessor (&DsrRouting::m_txPacketTrace),
-                     "ns3::DsrOptionSRHeader::TracedCallback")
+                     "ns3::dsr::DsrOptionSRHeader::TracedCallback")
     .AddTraceSource ("Drop",
                      "Drop DSR packet",
                      MakeTraceSourceAccessor (&DsrRouting::m_dropTrace),
@@ -416,7 +416,7 @@
             }
         }
     }
-  Object::NotifyNewAggregate ();
+  IpL4Protocol::NotifyNewAggregate ();
   Simulator::ScheduleNow (&DsrRouting::Start, this);
 }
 
diff -Naur ns-3.23/src/energy/bindings/callbacks_list.py ns-3.24/src/energy/bindings/callbacks_list.py
--- ns-3.23/src/energy/bindings/callbacks_list.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/bindings/callbacks_list.py	2015-09-15 11:18:44.000000000 -0700
@@ -1,6 +1,3 @@
 callback_classes = [
-    ['void', 'ns3::empty', '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', 'int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', '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'],
 ]
diff -Naur ns-3.23/src/energy/bindings/modulegen__gcc_ILP32.py ns-3.24/src/energy/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/energy/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -20,14 +20,6 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
-    ## wifi-phy-standard.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_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'], import_from_module='ns.wifi')
     ## address.h (module 'network'): ns3::Address [class]
     module.add_class('Address', import_from_module='ns.network')
     ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
@@ -36,20 +28,6 @@
     module.add_class('AttributeConstructionList', import_from_module='ns.core')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
     module.add_class('Item', import_from_module='ns.core', outer_class=root_module['ns3::AttributeConstructionList'])
-    ## buffer.h (module 'network'): ns3::Buffer [class]
-    module.add_class('Buffer', import_from_module='ns.network')
-    ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
-    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::Buffer'])
-    ## packet.h (module 'network'): ns3::ByteTagIterator [class]
-    module.add_class('ByteTagIterator', import_from_module='ns.network')
-    ## packet.h (module 'network'): ns3::ByteTagIterator::Item [class]
-    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagIterator'])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList [class]
-    module.add_class('ByteTagList', import_from_module='ns.network')
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator [class]
-    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList'])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item [struct]
-    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
     ## callback.h (module 'core'): ns3::CallbackBase [class]
     module.add_class('CallbackBase', import_from_module='ns.core')
     ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer [class]
@@ -86,30 +64,10 @@
     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')
-    ## 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]
-    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [enumeration]
-    module.add_enum('', ['PAYLOAD', 'HEADER', 'TRAILER'], outer_class=root_module['ns3::PacketMetadata::Item'], import_from_module='ns.network')
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator [class]
-    module.add_class('ItemIterator', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
-    ## packet.h (module 'network'): ns3::PacketTagIterator [class]
-    module.add_class('PacketTagIterator', import_from_module='ns.network')
-    ## packet.h (module 'network'): ns3::PacketTagIterator::Item [class]
-    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagIterator'])
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList [class]
-    module.add_class('PacketTagList', import_from_module='ns.network')
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData [struct]
-    module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
-    module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
     ## rv-battery-model-helper.h (module 'energy'): ns3::RvBatteryModelHelper [class]
     module.add_class('RvBatteryModelHelper', parent=root_module['ns3::EnergySourceHelper'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## tag.h (module 'network'): ns3::Tag [class]
-    module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
     module.add_class('TagBuffer', import_from_module='ns.network')
     ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
@@ -124,18 +82,6 @@
     module.add_class('AttributeInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation [struct]
     module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
-    module.add_class('WifiMode', import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
-    module.add_class('WifiModeFactory', import_from_module='ns.wifi')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener [class]
-    module.add_class('WifiPhyListener', allow_subclassing=True, import_from_module='ns.wifi')
-    ## wifi-radio-energy-model-helper.h (module 'energy'): ns3::WifiRadioEnergyModelHelper [class]
-    module.add_class('WifiRadioEnergyModelHelper', parent=root_module['ns3::DeviceEnergyModelHelper'])
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModelPhyListener [class]
-    module.add_class('WifiRadioEnergyModelPhyListener', parent=root_module['ns3::WifiPhyListener'])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
-    module.add_class('WifiTxVector', import_from_module='ns.wifi')
     ## empty.h (module 'core'): ns3::empty [class]
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t [class]
@@ -146,10 +92,6 @@
     module.add_class('BasicEnergyHarvesterHelper', parent=root_module['ns3::EnergyHarvesterHelper'])
     ## basic-energy-source-helper.h (module 'energy'): ns3::BasicEnergySourceHelper [class]
     module.add_class('BasicEnergySourceHelper', parent=root_module['ns3::EnergySourceHelper'])
-    ## chunk.h (module 'network'): ns3::Chunk [class]
-    module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
-    ## header.h (module 'network'): ns3::Header [class]
-    module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
     ## object.h (module 'core'): ns3::Object [class]
     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]
@@ -170,10 +112,6 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## nstime.h (module 'core'): ns3::Time [class]
@@ -188,20 +126,12 @@
     module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['ns3::Time'])
     ## traced-value.h (module 'core'): ns3::TracedValue<ns3::Time> [class]
     root_module['ns3::TracedValue< ns3::Time >'].implicitly_converts_to(root_module['ns3::Time'])
-    ## trailer.h (module 'network'): ns3::Trailer [class]
-    module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
     ## 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'])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy [class]
-    module.add_class('WifiPhy', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::State [enumeration]
-    module.add_enum('State', ['IDLE', 'CCA_BUSY', 'TX', 'RX', 'SWITCHING', 'SLEEP'], outer_class=root_module['ns3::WifiPhy'], import_from_module='ns.wifi')
-    ## wifi-tx-current-model.h (module 'energy'): ns3::WifiTxCurrentModel [class]
-    module.add_class('WifiTxCurrentModel', parent=root_module['ns3::Object'])
     ## 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]
@@ -274,16 +204,12 @@
     module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## li-ion-energy-source.h (module 'energy'): ns3::LiIonEnergySource [class]
     module.add_class('LiIonEnergySource', parent=root_module['ns3::EnergySource'])
-    ## wifi-tx-current-model.h (module 'energy'): ns3::LinearWifiTxCurrentModel [class]
-    module.add_class('LinearWifiTxCurrentModel', parent=root_module['ns3::WifiTxCurrentModel'])
     ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable [class]
     module.add_class('LogNormalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
     module.add_enum('PacketType', ['PACKET_HOST', 'NS3_PACKET_HOST', 'PACKET_BROADCAST', 'NS3_PACKET_BROADCAST', 'PACKET_MULTICAST', 'NS3_PACKET_MULTICAST', 'PACKET_OTHERHOST', 'NS3_PACKET_OTHERHOST'], outer_class=root_module['ns3::NetDevice'], import_from_module='ns.network')
-    ## nix-vector.h (module 'network'): ns3::NixVector [class]
-    module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     ## node.h (module 'network'): ns3::Node [class]
     module.add_class('Node', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable [class]
@@ -292,8 +218,6 @@
     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'])
-    ## packet.h (module 'network'): ns3::Packet [class]
-    module.add_class('Packet', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
     ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
     module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## rv-battery-model.h (module 'energy'): ns3::RvBatteryModel [class]
@@ -308,12 +232,6 @@
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## uinteger.h (module 'core'): ns3::UintegerValue [class]
     module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker [class]
-    module.add_class('WifiModeChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue [class]
-    module.add_class('WifiModeValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModel [class]
-    module.add_class('WifiRadioEnergyModel', parent=root_module['ns3::DeviceEnergyModel'])
     ## address.h (module 'network'): ns3::AddressChecker [class]
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
@@ -322,19 +240,6 @@
     module.add_class('BasicEnergyHarvester', parent=root_module['ns3::EnergyHarvester'])
     ## basic-energy-source.h (module 'energy'): ns3::BasicEnergySource [class]
     module.add_class('BasicEnergySource', parent=root_module['ns3::EnergySource'])
-    module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type=u'vector')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >', u'ns3::WifiMcsList')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >*', u'ns3::WifiMcsList*')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >&', u'ns3::WifiMcsList&')
-    typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >', u'ns3::WifiModeList')
-    typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >*', u'ns3::WifiModeList*')
-    typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >&', u'ns3::WifiModeList&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', u'ns3::WifiMcsListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', u'ns3::WifiMcsListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', u'ns3::WifiMcsListIterator&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -348,6 +253,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -388,6 +299,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -396,13 +338,6 @@
     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_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'])
-    register_Ns3ByteTagIteratorItem_methods(root_module, root_module['ns3::ByteTagIterator::Item'])
-    register_Ns3ByteTagList_methods(root_module, root_module['ns3::ByteTagList'])
-    register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
-    register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
     register_Ns3DeviceEnergyModelContainer_methods(root_module, root_module['ns3::DeviceEnergyModelContainer'])
     register_Ns3DeviceEnergyModelHelper_methods(root_module, root_module['ns3::DeviceEnergyModelHelper'])
@@ -419,34 +354,18 @@
     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_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'])
-    register_Ns3PacketTagIterator_methods(root_module, root_module['ns3::PacketTagIterator'])
-    register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
-    register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
-    register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
     register_Ns3RvBatteryModelHelper_methods(root_module, root_module['ns3::RvBatteryModelHelper'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
-    register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
     register_Ns3TracedValue__Double_methods(root_module, root_module['ns3::TracedValue< double >'])
     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'])
-    register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
-    register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
-    register_Ns3WifiPhyListener_methods(root_module, root_module['ns3::WifiPhyListener'])
-    register_Ns3WifiRadioEnergyModelHelper_methods(root_module, root_module['ns3::WifiRadioEnergyModelHelper'])
-    register_Ns3WifiRadioEnergyModelPhyListener_methods(root_module, root_module['ns3::WifiRadioEnergyModelPhyListener'])
-    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_Ns3BasicEnergyHarvesterHelper_methods(root_module, root_module['ns3::BasicEnergyHarvesterHelper'])
     register_Ns3BasicEnergySourceHelper_methods(root_module, root_module['ns3::BasicEnergySourceHelper'])
-    register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
-    register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     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'])
@@ -457,18 +376,13 @@
     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__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__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
     register_Ns3Time_methods(root_module, root_module['ns3::Time'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3TracedValue__Ns3Time_methods(root_module, root_module['ns3::TracedValue< ns3::Time >'])
-    register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
     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_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
-    register_Ns3WifiTxCurrentModel_methods(root_module, root_module['ns3::WifiTxCurrentModel'])
     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'])
@@ -505,15 +419,12 @@
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
     register_Ns3LiIonEnergySource_methods(root_module, root_module['ns3::LiIonEnergySource'])
-    register_Ns3LinearWifiTxCurrentModel_methods(root_module, root_module['ns3::LinearWifiTxCurrentModel'])
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     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_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
     register_Ns3RvBatteryModel_methods(root_module, root_module['ns3::RvBatteryModel'])
     register_Ns3SimpleDeviceEnergyModel_methods(root_module, root_module['ns3::SimpleDeviceEnergyModel'])
@@ -521,9 +432,6 @@
     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'])
-    register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
-    register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
-    register_Ns3WifiRadioEnergyModel_methods(root_module, root_module['ns3::WifiRadioEnergyModel'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3BasicEnergyHarvester_methods(root_module, root_module['ns3::BasicEnergyHarvester'])
@@ -644,363 +552,6 @@
     cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
     return
 
-def register_Ns3Buffer_methods(root_module, cls):
-    ## buffer.h (module 'network'): ns3::Buffer::Buffer() [constructor]
-    cls.add_constructor([])
-    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize) [constructor]
-    cls.add_constructor([param('uint32_t', 'dataSize')])
-    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize, bool initialize) [constructor]
-    cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
-    ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
-    cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
-    cls.add_method('AddAtEnd', 
-                   'bool', 
-                   [param('uint32_t', 'end')])
-    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
-    cls.add_method('AddAtEnd', 
-                   'void', 
-                   [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
-    cls.add_method('AddAtStart', 
-                   'bool', 
-                   [param('uint32_t', 'start')])
-    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
-    cls.add_method('Begin', 
-                   'ns3::Buffer::Iterator', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): void ns3::Buffer::CopyData(std::ostream * os, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'void', 
-                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::CopyData(uint8_t * buffer, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFragment(uint32_t start, uint32_t length) const [member function]
-    cls.add_method('CreateFragment', 
-                   'ns3::Buffer', 
-                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
-                   is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::End() const [member function]
-    cls.add_method('End', 
-                   'ns3::Buffer::Iterator', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint8_t const * ns3::Buffer::PeekData() const [member function]
-    cls.add_method('PeekData', 
-                   'uint8_t const *', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtEnd(uint32_t end) [member function]
-    cls.add_method('RemoveAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'end')])
-    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtStart(uint32_t start) [member function]
-    cls.add_method('RemoveAtStart', 
-                   'void', 
-                   [param('uint32_t', 'start')])
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
-                   is_const=True)
-    return
-
-def register_Ns3BufferIterator_methods(root_module, cls):
-    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator(ns3::Buffer::Iterator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Buffer::Iterator const &', 'arg0')])
-    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator() [constructor]
-    cls.add_constructor([])
-    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size) [member function]
-    cls.add_method('CalculateIpChecksum', 
-                   'uint16_t', 
-                   [param('uint16_t', 'size')])
-    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size, uint32_t initialChecksum) [member function]
-    cls.add_method('CalculateIpChecksum', 
-                   'uint16_t', 
-                   [param('uint16_t', 'size'), param('uint32_t', 'initialChecksum')])
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetDistanceFrom(ns3::Buffer::Iterator const & o) const [member function]
-    cls.add_method('GetDistanceFrom', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator const &', 'o')], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsEnd() const [member function]
-    cls.add_method('IsEnd', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsStart() const [member function]
-    cls.add_method('IsStart', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next() [member function]
-    cls.add_method('Next', 
-                   'void', 
-                   [])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next(uint32_t delta) [member function]
-    cls.add_method('Next', 
-                   'void', 
-                   [param('uint32_t', 'delta')])
-    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::PeekU8() [member function]
-    cls.add_method('PeekU8', 
-                   'uint8_t', 
-                   [])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev() [member function]
-    cls.add_method('Prev', 
-                   'void', 
-                   [])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev(uint32_t delta) [member function]
-    cls.add_method('Prev', 
-                   'void', 
-                   [param('uint32_t', 'delta')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(uint8_t * buffer, uint32_t size) [member function]
-    cls.add_method('Read', 
-                   'void', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(ns3::Buffer::Iterator start, uint32_t size) [member function]
-    cls.add_method('Read', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint32_t', 'size')])
-    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadLsbtohU16() [member function]
-    cls.add_method('ReadLsbtohU16', 
-                   'uint16_t', 
-                   [])
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadLsbtohU32() [member function]
-    cls.add_method('ReadLsbtohU32', 
-                   'uint32_t', 
-                   [])
-    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadLsbtohU64() [member function]
-    cls.add_method('ReadLsbtohU64', 
-                   'uint64_t', 
-                   [])
-    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadNtohU16() [member function]
-    cls.add_method('ReadNtohU16', 
-                   'uint16_t', 
-                   [])
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadNtohU32() [member function]
-    cls.add_method('ReadNtohU32', 
-                   'uint32_t', 
-                   [])
-    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadNtohU64() [member function]
-    cls.add_method('ReadNtohU64', 
-                   'uint64_t', 
-                   [])
-    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadU16() [member function]
-    cls.add_method('ReadU16', 
-                   'uint16_t', 
-                   [])
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadU32() [member function]
-    cls.add_method('ReadU32', 
-                   'uint32_t', 
-                   [])
-    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadU64() [member function]
-    cls.add_method('ReadU64', 
-                   'uint64_t', 
-                   [])
-    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::ReadU8() [member function]
-    cls.add_method('ReadU8', 
-                   'uint8_t', 
-                   [])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(uint8_t const * buffer, uint32_t size) [member function]
-    cls.add_method('Write', 
-                   'void', 
-                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
-    cls.add_method('Write', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('ns3::Buffer::Iterator', 'end')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU16(uint16_t data) [member function]
-    cls.add_method('WriteHtolsbU16', 
-                   'void', 
-                   [param('uint16_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU32(uint32_t data) [member function]
-    cls.add_method('WriteHtolsbU32', 
-                   'void', 
-                   [param('uint32_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU64(uint64_t data) [member function]
-    cls.add_method('WriteHtolsbU64', 
-                   'void', 
-                   [param('uint64_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU16(uint16_t data) [member function]
-    cls.add_method('WriteHtonU16', 
-                   'void', 
-                   [param('uint16_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU32(uint32_t data) [member function]
-    cls.add_method('WriteHtonU32', 
-                   'void', 
-                   [param('uint32_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU64(uint64_t data) [member function]
-    cls.add_method('WriteHtonU64', 
-                   'void', 
-                   [param('uint64_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU16(uint16_t data) [member function]
-    cls.add_method('WriteU16', 
-                   'void', 
-                   [param('uint16_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU32(uint32_t data) [member function]
-    cls.add_method('WriteU32', 
-                   'void', 
-                   [param('uint32_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU64(uint64_t data) [member function]
-    cls.add_method('WriteU64', 
-                   'void', 
-                   [param('uint64_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data) [member function]
-    cls.add_method('WriteU8', 
-                   'void', 
-                   [param('uint8_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data, uint32_t len) [member function]
-    cls.add_method('WriteU8', 
-                   'void', 
-                   [param('uint8_t', 'data'), param('uint32_t', 'len')])
-    return
-
-def register_Ns3ByteTagIterator_methods(root_module, cls):
-    ## packet.h (module 'network'): ns3::ByteTagIterator::ByteTagIterator(ns3::ByteTagIterator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ByteTagIterator const &', 'arg0')])
-    ## packet.h (module 'network'): bool ns3::ByteTagIterator::HasNext() const [member function]
-    cls.add_method('HasNext', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::ByteTagIterator::Item ns3::ByteTagIterator::Next() [member function]
-    cls.add_method('Next', 
-                   'ns3::ByteTagIterator::Item', 
-                   [])
-    return
-
-def register_Ns3ByteTagIteratorItem_methods(root_module, cls):
-    ## packet.h (module 'network'): ns3::ByteTagIterator::Item::Item(ns3::ByteTagIterator::Item const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ByteTagIterator::Item const &', 'arg0')])
-    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetEnd() const [member function]
-    cls.add_method('GetEnd', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetStart() const [member function]
-    cls.add_method('GetStart', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::ByteTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
-    cls.add_method('GetTag', 
-                   'void', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::TypeId ns3::ByteTagIterator::Item::GetTypeId() const [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True)
-    return
-
-def register_Ns3ByteTagList_methods(root_module, cls):
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList() [constructor]
-    cls.add_constructor([])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList(ns3::ByteTagList const & o) [copy constructor]
-    cls.add_constructor([param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): ns3::TagBuffer ns3::ByteTagList::Add(ns3::TypeId tid, uint32_t bufferSize, int32_t start, int32_t end) [member function]
-    cls.add_method('Add', 
-                   'ns3::TagBuffer', 
-                   [param('ns3::TypeId', 'tid'), param('uint32_t', 'bufferSize'), param('int32_t', 'start'), param('int32_t', 'end')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Add(ns3::ByteTagList const & o) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
-    cls.add_method('AddAtEnd', 
-                   'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
-    cls.add_method('AddAtStart', 
-                   'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
-    cls.add_method('Begin', 
-                   'ns3::ByteTagList::Iterator', 
-                   [param('int32_t', 'offsetStart'), param('int32_t', 'offsetEnd')], 
-                   is_const=True)
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::RemoveAll() [member function]
-    cls.add_method('RemoveAll', 
-                   'void', 
-                   [])
-    return
-
-def register_Ns3ByteTagListIterator_methods(root_module, cls):
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Iterator(ns3::ByteTagList::Iterator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ByteTagList::Iterator const &', 'arg0')])
-    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Iterator::GetOffsetStart() const [member function]
-    cls.add_method('GetOffsetStart', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## byte-tag-list.h (module 'network'): bool ns3::ByteTagList::Iterator::HasNext() const [member function]
-    cls.add_method('HasNext', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item ns3::ByteTagList::Iterator::Next() [member function]
-    cls.add_method('Next', 
-                   'ns3::ByteTagList::Iterator::Item', 
-                   [])
-    return
-
-def register_Ns3ByteTagListIteratorItem_methods(root_module, cls):
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::ByteTagList::Iterator::Item const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ByteTagList::Iterator::Item const &', 'arg0')])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::TagBuffer buf) [constructor]
-    cls.add_constructor([param('ns3::TagBuffer', 'buf')])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::buf [variable]
-    cls.add_instance_attribute('buf', 'ns3::TagBuffer', is_const=False)
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::end [variable]
-    cls.add_instance_attribute('end', 'int32_t', is_const=False)
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::size [variable]
-    cls.add_instance_attribute('size', 'uint32_t', is_const=False)
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::start [variable]
-    cls.add_instance_attribute('start', 'int32_t', is_const=False)
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::tid [variable]
-    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
-    return
-
 def register_Ns3CallbackBase_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::CallbackBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackBase const &', 'arg0')])
@@ -1014,11 +565,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DeviceEnergyModelContainer_methods(root_module, cls):
@@ -1886,197 +1432,6 @@
                    [param('std::string', 'tid')])
     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')])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(ns3::PacketMetadata const & o) [copy constructor]
-    cls.add_constructor([param('ns3::PacketMetadata const &', 'o')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddAtEnd(ns3::PacketMetadata const & o) [member function]
-    cls.add_method('AddAtEnd', 
-                   'void', 
-                   [param('ns3::PacketMetadata const &', 'o')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddHeader(ns3::Header const & header, uint32_t size) [member function]
-    cls.add_method('AddHeader', 
-                   'void', 
-                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddPaddingAtEnd(uint32_t end) [member function]
-    cls.add_method('AddPaddingAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'end')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
-    cls.add_method('AddTrailer', 
-                   'void', 
-                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::PacketMetadata::BeginItem(ns3::Buffer buffer) const [member function]
-    cls.add_method('BeginItem', 
-                   'ns3::PacketMetadata::ItemIterator', 
-                   [param('ns3::Buffer', 'buffer')], 
-                   is_const=True)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata ns3::PacketMetadata::CreateFragment(uint32_t start, uint32_t end) const [member function]
-    cls.add_method('CreateFragment', 
-                   'ns3::PacketMetadata', 
-                   [param('uint32_t', 'start'), param('uint32_t', 'end')], 
-                   is_const=True)
-    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::Enable() [member function]
-    cls.add_method('Enable', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::EnableChecking() [member function]
-    cls.add_method('EnableChecking', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet-metadata.h (module 'network'): uint64_t ns3::PacketMetadata::GetUid() const [member function]
-    cls.add_method('GetUid', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtEnd(uint32_t end) [member function]
-    cls.add_method('RemoveAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'end')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtStart(uint32_t start) [member function]
-    cls.add_method('RemoveAtStart', 
-                   'void', 
-                   [param('uint32_t', 'start')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveHeader(ns3::Header const & header, uint32_t size) [member function]
-    cls.add_method('RemoveHeader', 
-                   'void', 
-                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
-    cls.add_method('RemoveTrailer', 
-                   'void', 
-                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
-    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
-                   is_const=True)
-    return
-
-def register_Ns3PacketMetadataItem_methods(root_module, cls):
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item() [constructor]
-    cls.add_constructor([])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item(ns3::PacketMetadata::Item const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::PacketMetadata::Item const &', 'arg0')])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::current [variable]
-    cls.add_instance_attribute('current', 'ns3::Buffer::Iterator', is_const=False)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentSize [variable]
-    cls.add_instance_attribute('currentSize', 'uint32_t', is_const=False)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromEnd [variable]
-    cls.add_instance_attribute('currentTrimedFromEnd', 'uint32_t', is_const=False)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromStart [variable]
-    cls.add_instance_attribute('currentTrimedFromStart', 'uint32_t', is_const=False)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::isFragment [variable]
-    cls.add_instance_attribute('isFragment', 'bool', is_const=False)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::tid [variable]
-    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
-    return
-
-def register_Ns3PacketMetadataItemIterator_methods(root_module, cls):
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata::ItemIterator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::PacketMetadata::ItemIterator const &', 'arg0')])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata const * metadata, ns3::Buffer buffer) [constructor]
-    cls.add_constructor([param('ns3::PacketMetadata const *', 'metadata'), param('ns3::Buffer', 'buffer')])
-    ## packet-metadata.h (module 'network'): bool ns3::PacketMetadata::ItemIterator::HasNext() const [member function]
-    cls.add_method('HasNext', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item ns3::PacketMetadata::ItemIterator::Next() [member function]
-    cls.add_method('Next', 
-                   'ns3::PacketMetadata::Item', 
-                   [])
-    return
-
-def register_Ns3PacketTagIterator_methods(root_module, cls):
-    ## packet.h (module 'network'): ns3::PacketTagIterator::PacketTagIterator(ns3::PacketTagIterator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::PacketTagIterator const &', 'arg0')])
-    ## packet.h (module 'network'): bool ns3::PacketTagIterator::HasNext() const [member function]
-    cls.add_method('HasNext', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::PacketTagIterator::Item ns3::PacketTagIterator::Next() [member function]
-    cls.add_method('Next', 
-                   'ns3::PacketTagIterator::Item', 
-                   [])
-    return
-
-def register_Ns3PacketTagIteratorItem_methods(root_module, cls):
-    ## packet.h (module 'network'): ns3::PacketTagIterator::Item::Item(ns3::PacketTagIterator::Item const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::PacketTagIterator::Item const &', 'arg0')])
-    ## packet.h (module 'network'): void ns3::PacketTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
-    cls.add_method('GetTag', 
-                   'void', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::TypeId ns3::PacketTagIterator::Item::GetTypeId() const [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True)
-    return
-
-def register_Ns3PacketTagList_methods(root_module, cls):
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList() [constructor]
-    cls.add_constructor([])
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList(ns3::PacketTagList const & o) [copy constructor]
-    cls.add_constructor([param('ns3::PacketTagList const &', 'o')])
-    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::Add(ns3::Tag const & tag) const [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag')], 
-                   is_const=True)
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData const * ns3::PacketTagList::Head() const [member function]
-    cls.add_method('Head', 
-                   'ns3::PacketTagList::TagData const *', 
-                   [], 
-                   is_const=True)
-    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Peek(ns3::Tag & tag) const [member function]
-    cls.add_method('Peek', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Remove(ns3::Tag & tag) [member function]
-    cls.add_method('Remove', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::RemoveAll() [member function]
-    cls.add_method('RemoveAll', 
-                   'void', 
-                   [])
-    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Replace(ns3::Tag & tag) [member function]
-    cls.add_method('Replace', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    return
-
-def register_Ns3PacketTagListTagData_methods(root_module, cls):
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData() [constructor]
-    cls.add_constructor([])
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData(ns3::PacketTagList::TagData const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::PacketTagList::TagData const &', 'arg0')])
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
-    cls.add_instance_attribute('count', 'uint32_t', is_const=False)
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
-    cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
-    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
-    return
-
 def register_Ns3RvBatteryModelHelper_methods(root_module, cls):
     ## rv-battery-model-helper.h (module 'energy'): ns3::RvBatteryModelHelper::RvBatteryModelHelper(ns3::RvBatteryModelHelper const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::RvBatteryModelHelper const &', 'arg0')])
@@ -2106,45 +1461,13 @@
                    is_static=True)
     return
 
-def register_Ns3Tag_methods(root_module, cls):
-    ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
-    cls.add_constructor([])
-    ## tag.h (module 'network'): ns3::Tag::Tag(ns3::Tag const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Tag const &', 'arg0')])
-    ## tag.h (module 'network'): void ns3::Tag::Deserialize(ns3::TagBuffer i) [member function]
-    cls.add_method('Deserialize', 
-                   'void', 
-                   [param('ns3::TagBuffer', 'i')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## tag.h (module 'network'): uint32_t ns3::Tag::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## tag.h (module 'network'): static ns3::TypeId ns3::Tag::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## tag.h (module 'network'): void ns3::Tag::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## tag.h (module 'network'): void ns3::Tag::Serialize(ns3::TagBuffer i) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::TagBuffer', 'i')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    return
-
-def register_Ns3TagBuffer_methods(root_module, cls):
-    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(ns3::TagBuffer const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::TagBuffer const &', 'arg0')])
-    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(uint8_t * start, uint8_t * end) [constructor]
-    cls.add_constructor([param('uint8_t *', 'start'), param('uint8_t *', 'end')])
-    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::CopyFrom(ns3::TagBuffer o) [member function]
-    cls.add_method('CopyFrom', 
+def register_Ns3TagBuffer_methods(root_module, cls):
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(ns3::TagBuffer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TagBuffer const &', 'arg0')])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(uint8_t * start, uint8_t * end) [constructor]
+    cls.add_constructor([param('uint8_t *', 'start'), param('uint8_t *', 'end')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::CopyFrom(ns3::TagBuffer o) [member function]
+    cls.add_method('CopyFrom', 
                    'void', 
                    [param('ns3::TagBuffer', 'o')])
     ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Read(uint8_t * buffer, uint32_t size) [member function]
@@ -2448,276 +1771,6 @@
     cls.add_instance_attribute('name', 'std::string', is_const=False)
     return
 
-def register_Ns3WifiMode_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiMode const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode() [constructor]
-    cls.add_constructor([])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
-    cls.add_constructor([param('std::string', 'name')])
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
-    cls.add_method('GetCodeRate', 
-                   'ns3::WifiCodeRate', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
-    cls.add_method('GetConstellationSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
-    cls.add_method('GetDataRate', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
-    cls.add_method('GetModulationClass', 
-                   'ns3::WifiModulationClass', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
-    cls.add_method('GetPhyRate', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
-    cls.add_method('GetUid', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiMode::GetUniqueName() const [member function]
-    cls.add_method('GetUniqueName', 
-                   'std::string', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsMandatory() const [member function]
-    cls.add_method('IsMandatory', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    return
-
-def register_Ns3WifiModeFactory_methods(root_module, cls):
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
-    cls.add_method('CreateWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
-                   is_static=True)
-    return
-
-def register_Ns3WifiPhyListener_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener::WifiPhyListener() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener::WifiPhyListener(ns3::WifiPhyListener const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiPhyListener const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyMaybeCcaBusyStart(ns3::Time duration) [member function]
-    cls.add_method('NotifyMaybeCcaBusyStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxEndError() [member function]
-    cls.add_method('NotifyRxEndError', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxEndOk() [member function]
-    cls.add_method('NotifyRxEndOk', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxStart(ns3::Time duration) [member function]
-    cls.add_method('NotifyRxStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifySleep() [member function]
-    cls.add_method('NotifySleep', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifySwitchingStart(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyTxStart(ns3::Time duration, double txPowerDbm) [member function]
-    cls.add_method('NotifyTxStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration'), param('double', 'txPowerDbm')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyWakeup() [member function]
-    cls.add_method('NotifyWakeup', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3WifiRadioEnergyModelHelper_methods(root_module, cls):
-    ## wifi-radio-energy-model-helper.h (module 'energy'): ns3::WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper(ns3::WifiRadioEnergyModelHelper const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiRadioEnergyModelHelper const &', 'arg0')])
-    ## wifi-radio-energy-model-helper.h (module 'energy'): ns3::WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper() [constructor]
-    cls.add_constructor([])
-    ## wifi-radio-energy-model-helper.h (module 'energy'): void ns3::WifiRadioEnergyModelHelper::Set(std::string name, ns3::AttributeValue const & v) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'v')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model-helper.h (module 'energy'): void ns3::WifiRadioEnergyModelHelper::SetDepletionCallback(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('SetDepletionCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model-helper.h (module 'energy'): void ns3::WifiRadioEnergyModelHelper::SetRechargedCallback(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('SetRechargedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model-helper.h (module 'energy'): void ns3::WifiRadioEnergyModelHelper::SetTxCurrentModel(std::string name, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetTxCurrentModel', 
-                   'void', 
-                   [param('std::string', 'name'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
-    ## wifi-radio-energy-model-helper.h (module 'energy'): ns3::Ptr<ns3::DeviceEnergyModel> ns3::WifiRadioEnergyModelHelper::DoInstall(ns3::Ptr<ns3::NetDevice> device, ns3::Ptr<ns3::EnergySource> source) const [member function]
-    cls.add_method('DoInstall', 
-                   'ns3::Ptr< ns3::DeviceEnergyModel >', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::Ptr< ns3::EnergySource >', 'source')], 
-                   is_const=True, visibility='private', is_virtual=True)
-    return
-
-def register_Ns3WifiRadioEnergyModelPhyListener_methods(root_module, cls):
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModelPhyListener::WifiRadioEnergyModelPhyListener(ns3::WifiRadioEnergyModelPhyListener const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiRadioEnergyModelPhyListener const &', 'arg0')])
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModelPhyListener::WifiRadioEnergyModelPhyListener() [constructor]
-    cls.add_constructor([])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyMaybeCcaBusyStart(ns3::Time duration) [member function]
-    cls.add_method('NotifyMaybeCcaBusyStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxEndError() [member function]
-    cls.add_method('NotifyRxEndError', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxEndOk() [member function]
-    cls.add_method('NotifyRxEndOk', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxStart(ns3::Time duration) [member function]
-    cls.add_method('NotifyRxStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifySleep() [member function]
-    cls.add_method('NotifySleep', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifySwitchingStart(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyTxStart(ns3::Time duration, double txPowerDbm) [member function]
-    cls.add_method('NotifyTxStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration'), param('double', 'txPowerDbm')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyWakeup() [member function]
-    cls.add_method('NotifyWakeup', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::SetChangeStateCallback(ns3::Callback<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetChangeStateCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::SetUpdateTxCurrentCallback(ns3::Callback<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetUpdateTxCurrentCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    return
-
-def register_Ns3WifiTxVector_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
-    ## 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, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   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() const [member function]
-    cls.add_method('GetNss', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetRetries() const [member function]
-    cls.add_method('GetRetries', 
-                   'uint8_t', 
-                   [], 
-                   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::IsShortGuardInterval() const [member function]
-    cls.add_method('IsShortGuardInterval', 
-                   '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'): 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::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::SetRetries(uint8_t retries) [member function]
-    cls.add_method('SetRetries', 
-                   'void', 
-                   [param('uint8_t', 'retries')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetShortGuardInterval(bool guardinterval) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'guardinterval')])
-    ## 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([])
@@ -2826,61 +1879,6 @@
                    is_const=True, visibility='private', is_virtual=True)
     return
 
-def register_Ns3Chunk_methods(root_module, cls):
-    ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
-    cls.add_constructor([])
-    ## chunk.h (module 'network'): ns3::Chunk::Chunk(ns3::Chunk const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Chunk const &', 'arg0')])
-    ## chunk.h (module 'network'): uint32_t ns3::Chunk::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## chunk.h (module 'network'): static ns3::TypeId ns3::Chunk::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## chunk.h (module 'network'): void ns3::Chunk::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    return
-
-def register_Ns3Header_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## header.h (module 'network'): ns3::Header::Header() [constructor]
-    cls.add_constructor([])
-    ## header.h (module 'network'): ns3::Header::Header(ns3::Header const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Header const &', 'arg0')])
-    ## header.h (module 'network'): uint32_t ns3::Header::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## header.h (module 'network'): uint32_t ns3::Header::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## header.h (module 'network'): static ns3::TypeId ns3::Header::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## header.h (module 'network'): void ns3::Header::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## header.h (module 'network'): void ns3::Header::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    return
-
 def register_Ns3Object_methods(root_module, cls):
     ## object.h (module 'core'): ns3::Object::Object() [constructor]
     cls.add_constructor([])
@@ -3102,30 +2100,6 @@
                    is_static=True)
     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]
-    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) [copy constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
-    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::Cleanup() [member function]
-    cls.add_method('Cleanup', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    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]
-    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) [copy constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
-    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::Cleanup() [member function]
-    cls.add_method('Cleanup', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    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]
     cls.add_constructor([])
@@ -3397,39 +2371,6 @@
                    [param('ns3::Time const &', 'v')])
     return
 
-def register_Ns3Trailer_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## trailer.h (module 'network'): ns3::Trailer::Trailer() [constructor]
-    cls.add_constructor([])
-    ## trailer.h (module 'network'): ns3::Trailer::Trailer(ns3::Trailer const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Trailer const &', 'arg0')])
-    ## trailer.h (module 'network'): uint32_t ns3::Trailer::Deserialize(ns3::Buffer::Iterator end) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'end')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## trailer.h (module 'network'): uint32_t ns3::Trailer::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## trailer.h (module 'network'): static ns3::TypeId ns3::Trailer::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## trailer.h (module 'network'): void ns3::Trailer::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## trailer.h (module 'network'): void ns3::Trailer::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    return
-
 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', 
@@ -3507,764 +2448,51 @@
     ## random-variable-stream.h (module 'core'): uint32_t ns3::UniformRandomVariable::GetInteger() [member function]
     cls.add_method('GetInteger', 
                    'uint32_t', 
-                   [], 
-                   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_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_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetShape() const [member function]
-    cls.add_method('GetShape', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
-                   'double', 
-                   [], 
-                   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_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [], 
-                   is_virtual=True)
-    return
-
-def register_Ns3WifiPhy_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): int64_t ns3::WifiPhy::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuration(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('CalculatePlcpDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
-    cls.add_method('CalculateSnr', 
-                   'double', 
-                   [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
-    cls.add_method('CalculateTxDuration', 
-                   'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetBssMembershipSelector(uint32_t selector) const [member function]
-    cls.add_method('GetBssMembershipSelector', 
-                   'uint32_t', 
-                   [param('uint32_t', 'selector')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiChannel> ns3::WifiPhy::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::WifiChannel >', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
-    cls.add_method('GetChannelNumber', 
-                   'uint16_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetChannelSwitchDelay() const [member function]
-    cls.add_method('GetChannelSwitchDelay', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
-    cls.add_method('GetDelayUntilIdle', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate11Mbps() [member function]
-    cls.add_method('GetDsssRate11Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate1Mbps() [member function]
-    cls.add_method('GetDsssRate1Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate2Mbps() [member function]
-    cls.add_method('GetDsssRate2Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate5_5Mbps() [member function]
-    cls.add_method('GetDsssRate5_5Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate12Mbps() [member function]
-    cls.add_method('GetErpOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate18Mbps() [member function]
-    cls.add_method('GetErpOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate24Mbps() [member function]
-    cls.add_method('GetErpOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate36Mbps() [member function]
-    cls.add_method('GetErpOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate48Mbps() [member function]
-    cls.add_method('GetErpOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate54Mbps() [member function]
-    cls.add_method('GetErpOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate6Mbps() [member function]
-    cls.add_method('GetErpOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate9Mbps() [member function]
-    cls.add_method('GetErpOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetFrequency() const [member function]
-    cls.add_method('GetFrequency', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetMFPlcpHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
-    cls.add_method('GetMembershipSelectorModes', 
-                   'ns3::WifiModeList', 
-                   [param('uint32_t', 'selector')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [param('uint32_t', 'mode')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
-    cls.add_method('GetNumberOfReceiveAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
-    cls.add_method('GetNumberOfTransmitAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
-    cls.add_method('GetOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
-    cls.add_method('GetPayloadDuration', 
-                   'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPlcpHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPlcpHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPlcpHtSigHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
-    cls.add_method('GetPlcpHtTrainingSymbolDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPlcpPreambleDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
-    cls.add_method('GetStateDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetStbc() const [member function]
-    cls.add_method('GetStbc', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
-    cls.add_method('GetTxPowerEnd', 
-                   'double', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
-    cls.add_method('GetTxPowerStart', 
-                   'double', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
-    cls.add_method('IsModeSupported', 
-                   'bool', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateBusy() [member function]
-    cls.add_method('IsStateBusy', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateCcaBusy() [member function]
-    cls.add_method('IsStateCcaBusy', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateIdle() [member function]
-    cls.add_method('IsStateIdle', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateRx() [member function]
-    cls.add_method('IsStateRx', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSleep() [member function]
-    cls.add_method('IsStateSleep', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSwitching() [member function]
-    cls.add_method('IsStateSwitching', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateTx() [member function]
-    cls.add_method('IsStateTx', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::Packet> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
-    cls.add_method('NotifyMonitorSniffRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<const ns3::Packet> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
-    cls.add_method('NotifyMonitorSniffTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxBegin', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxEnd', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyTxBegin', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyTxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyTxEnd', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('RegisterListener', 
-                   'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResumeFromSleep() [member function]
-    cls.add_method('ResumeFromSleep', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<const ns3::Packet> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
-    cls.add_method('SendPacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint16_t', 'id')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint32_t', 'freq')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGreenfield(bool greenfield) [member function]
-    cls.add_method('SetGreenfield', 
-                   'void', 
-                   [param('bool', 'greenfield')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
-    cls.add_method('SetGuardInterval', 
-                   'void', 
-                   [param('bool', 'guardInterval')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
-    cls.add_method('SetLdpc', 
-                   'void', 
-                   [param('bool', 'ldpc')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
-    cls.add_method('SetNumberOfReceiveAntennas', 
-                   'void', 
-                   [param('uint32_t', 'rx')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfTransmitAntennas(uint32_t tx) [member function]
-    cls.add_method('SetNumberOfTransmitAntennas', 
-                   'void', 
-                   [param('uint32_t', 'tx')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::Callback<void,ns3::Ptr<const ns3::Packet>,double,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
-    cls.add_method('SetReceiveErrorCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiTxVector,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
-    cls.add_method('SetReceiveOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member function]
-    cls.add_method('SetSleepMode', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetStbc(bool stbc) [member function]
-    cls.add_method('SetStbc', 
-                   'void', 
-                   [param('bool', 'stbc')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('UnregisterListener', 
-                   'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [], 
+                   is_virtual=True)
     return
 
-def register_Ns3WifiTxCurrentModel_methods(root_module, cls):
-    ## wifi-tx-current-model.h (module 'energy'): ns3::WifiTxCurrentModel::WifiTxCurrentModel(ns3::WifiTxCurrentModel const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiTxCurrentModel const &', 'arg0')])
-    ## wifi-tx-current-model.h (module 'energy'): ns3::WifiTxCurrentModel::WifiTxCurrentModel() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-current-model.h (module 'energy'): double ns3::WifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
-    cls.add_method('CalcTxCurrent', 
-                   'double', 
-                   [param('double', 'txPowerDbm')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-tx-current-model.h (module 'energy'): static double ns3::WifiTxCurrentModel::DbmToW(double dbm) [member function]
-    cls.add_method('DbmToW', 
-                   'double', 
-                   [param('double', 'dbm')], 
-                   is_static=True)
-    ## wifi-tx-current-model.h (module 'energy'): static ns3::TypeId ns3::WifiTxCurrentModel::GetTypeId() [member function]
+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_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_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   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_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
 def register_Ns3ZetaRandomVariable_methods(root_module, cls):
@@ -4482,11 +2710,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4676,10 +2914,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5457,50 +3695,6 @@
                    visibility='private', is_virtual=True)
     return
 
-def register_Ns3LinearWifiTxCurrentModel_methods(root_module, cls):
-    ## wifi-tx-current-model.h (module 'energy'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel(ns3::LinearWifiTxCurrentModel const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::LinearWifiTxCurrentModel const &', 'arg0')])
-    ## wifi-tx-current-model.h (module 'energy'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-current-model.h (module 'energy'): double ns3::LinearWifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
-    cls.add_method('CalcTxCurrent', 
-                   'double', 
-                   [param('double', 'txPowerDbm')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-tx-current-model.h (module 'energy'): double ns3::LinearWifiTxCurrentModel::GetEta() const [member function]
-    cls.add_method('GetEta', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-current-model.h (module 'energy'): double ns3::LinearWifiTxCurrentModel::GetIdleCurrent() const [member function]
-    cls.add_method('GetIdleCurrent', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-current-model.h (module 'energy'): static ns3::TypeId ns3::LinearWifiTxCurrentModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-tx-current-model.h (module 'energy'): double ns3::LinearWifiTxCurrentModel::GetVoltage() const [member function]
-    cls.add_method('GetVoltage', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-current-model.h (module 'energy'): void ns3::LinearWifiTxCurrentModel::SetEta(double eta) [member function]
-    cls.add_method('SetEta', 
-                   'void', 
-                   [param('double', 'eta')])
-    ## wifi-tx-current-model.h (module 'energy'): void ns3::LinearWifiTxCurrentModel::SetIdleCurrent(double idleCurrent) [member function]
-    cls.add_method('SetIdleCurrent', 
-                   'void', 
-                   [param('double', 'idleCurrent')])
-    ## wifi-tx-current-model.h (module 'energy'): void ns3::LinearWifiTxCurrentModel::SetVoltage(double voltage) [member function]
-    cls.add_method('SetVoltage', 
-                   'void', 
-                   [param('double', 'voltage')])
-    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', 
@@ -5544,7 +3738,7 @@
     cls.add_constructor([])
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
-    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(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('AddLinkChangeCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
@@ -5671,50 +3865,6 @@
                    is_pure_virtual=True, is_const=True, is_virtual=True)
     return
 
-def register_Ns3NixVector_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
-    cls.add_constructor([])
-    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [copy constructor]
-    cls.add_constructor([param('ns3::NixVector const &', 'o')])
-    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
-    cls.add_method('AddNeighborIndex', 
-                   'void', 
-                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
-    cls.add_method('BitCount', 
-                   'uint32_t', 
-                   [param('uint32_t', 'numberOfNeighbors')], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::NixVector >', 
-                   [], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
-    cls.add_method('ExtractNeighborIndex', 
-                   'uint32_t', 
-                   [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
-    cls.add_method('GetRemainingBits', 
-                   'uint32_t', 
-                   [])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
-                   is_const=True)
-    return
-
 def register_Ns3Node_methods(root_module, cls):
     ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Node const &', 'arg0')])
@@ -5883,191 +4033,6 @@
                    [param('ns3::ObjectFactory const &', 'value')])
     return
 
-def register_Ns3Packet_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
-    cls.add_constructor([])
-    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [copy constructor]
-    cls.add_constructor([param('ns3::Packet const &', 'o')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
-    cls.add_constructor([param('uint32_t', 'size')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
-    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
-    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('AddAtEnd', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
-    cls.add_method('AddByteTag', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
-    cls.add_method('AddHeader', 
-                   'void', 
-                   [param('ns3::Header const &', 'header')])
-    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
-    cls.add_method('AddPacketTag', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
-    cls.add_method('AddPaddingAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
-    cls.add_method('AddTrailer', 
-                   'void', 
-                   [param('ns3::Trailer const &', 'trailer')])
-    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
-    cls.add_method('BeginItem', 
-                   'ns3::PacketMetadata::ItemIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'void', 
-                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
-    cls.add_method('CreateFragment', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
-                   is_const=True)
-    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
-    cls.add_method('EnableChecking', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
-    cls.add_method('EnablePrinting', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
-    cls.add_method('FindFirstMatchingByteTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
-    cls.add_method('GetByteTagIterator', 
-                   'ns3::ByteTagIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
-    cls.add_method('GetNixVector', 
-                   'ns3::Ptr< ns3::NixVector >', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
-    cls.add_method('GetPacketTagIterator', 
-                   'ns3::PacketTagIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
-    cls.add_method('GetUid', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
-    cls.add_method('PeekHeader', 
-                   'uint32_t', 
-                   [param('ns3::Header &', 'header')], 
-                   is_const=True)
-    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
-    cls.add_method('PeekPacketTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
-    cls.add_method('PeekTrailer', 
-                   'uint32_t', 
-                   [param('ns3::Trailer &', 'trailer')])
-    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
-    cls.add_method('PrintByteTags', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
-    cls.add_method('PrintPacketTags', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
-    cls.add_method('RemoveAllByteTags', 
-                   'void', 
-                   [])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
-    cls.add_method('RemoveAllPacketTags', 
-                   'void', 
-                   [])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
-    cls.add_method('RemoveAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
-    cls.add_method('RemoveAtStart', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
-    cls.add_method('RemoveHeader', 
-                   'uint32_t', 
-                   [param('ns3::Header &', 'header')])
-    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
-    cls.add_method('RemovePacketTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
-    cls.add_method('RemoveTrailer', 
-                   'uint32_t', 
-                   [param('ns3::Trailer &', 'trailer')])
-    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
-    cls.add_method('ReplacePacketTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   '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]
-    cls.add_method('SetNixVector', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
-    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
-    cls.add_method('ToString', 
-                   'std::string', 
-                   [], 
-                   is_const=True)
-    return
-
 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', 
@@ -6388,172 +4353,6 @@
                    [param('uint64_t const &', 'value')])
     return
 
-def register_Ns3WifiModeChecker_methods(root_module, cls):
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
-    cls.add_constructor([])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker(ns3::WifiModeChecker const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiModeChecker const &', 'arg0')])
-    return
-
-def register_Ns3WifiModeValue_methods(root_module, cls):
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue() [constructor]
-    cls.add_constructor([])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiModeValue const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiModeValue const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiMode const & value) [constructor]
-    cls.add_constructor([param('ns3::WifiMode const &', 'value')])
-    ## wifi-mode.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::WifiModeValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): bool ns3::WifiModeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode ns3::WifiModeValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiModeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): void ns3::WifiModeValue::Set(ns3::WifiMode const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::WifiMode const &', 'value')])
-    return
-
-def register_Ns3WifiRadioEnergyModel_methods(root_module, cls):
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel(ns3::WifiRadioEnergyModel const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiRadioEnergyModel const &', 'arg0')])
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel() [constructor]
-    cls.add_constructor([])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::ChangeState(int newState) [member function]
-    cls.add_method('ChangeState', 
-                   'void', 
-                   [param('int', 'newState')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetCcaBusyCurrentA() const [member function]
-    cls.add_method('GetCcaBusyCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiPhy::State ns3::WifiRadioEnergyModel::GetCurrentState() const [member function]
-    cls.add_method('GetCurrentState', 
-                   'ns3::WifiPhy::State', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetIdleCurrentA() const [member function]
-    cls.add_method('GetIdleCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModelPhyListener * ns3::WifiRadioEnergyModel::GetPhyListener() [member function]
-    cls.add_method('GetPhyListener', 
-                   'ns3::WifiRadioEnergyModelPhyListener *', 
-                   [])
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetRxCurrentA() const [member function]
-    cls.add_method('GetRxCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetSleepCurrentA() const [member function]
-    cls.add_method('GetSleepCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetSwitchingCurrentA() const [member function]
-    cls.add_method('GetSwitchingCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetTotalEnergyConsumption() const [member function]
-    cls.add_method('GetTotalEnergyConsumption', 
-                   'double', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetTxCurrentA() const [member function]
-    cls.add_method('GetTxCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): static ns3::TypeId ns3::WifiRadioEnergyModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::HandleEnergyDepletion() [member function]
-    cls.add_method('HandleEnergyDepletion', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::HandleEnergyRecharged() [member function]
-    cls.add_method('HandleEnergyRecharged', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetCcaBusyCurrentA(double ccaBusyCurrentA) [member function]
-    cls.add_method('SetCcaBusyCurrentA', 
-                   'void', 
-                   [param('double', 'ccaBusyCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetEnergyDepletionCallback(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('SetEnergyDepletionCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetEnergyRechargedCallback(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('SetEnergyRechargedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
-    cls.add_method('SetEnergySource', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::EnergySource >', 'source')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetIdleCurrentA(double idleCurrentA) [member function]
-    cls.add_method('SetIdleCurrentA', 
-                   'void', 
-                   [param('double', 'idleCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetRxCurrentA(double rxCurrentA) [member function]
-    cls.add_method('SetRxCurrentA', 
-                   'void', 
-                   [param('double', 'rxCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetSleepCurrentA(double sleepCurrentA) [member function]
-    cls.add_method('SetSleepCurrentA', 
-                   'void', 
-                   [param('double', 'sleepCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetSwitchingCurrentA(double switchingCurrentA) [member function]
-    cls.add_method('SetSwitchingCurrentA', 
-                   'void', 
-                   [param('double', 'switchingCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetTxCurrentA(double txCurrentA) [member function]
-    cls.add_method('SetTxCurrentA', 
-                   'void', 
-                   [param('double', 'txCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetTxCurrentFromModel(double txPowerDbm) [member function]
-    cls.add_method('SetTxCurrentFromModel', 
-                   'void', 
-                   [param('double', 'txPowerDbm')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetTxCurrentModel(ns3::Ptr<ns3::WifiTxCurrentModel> model) [member function]
-    cls.add_method('SetTxCurrentModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiTxCurrentModel >', 'model')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   visibility='private', is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::DoGetCurrentA() const [member function]
-    cls.add_method('DoGetCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True, visibility='private', is_virtual=True)
-    return
-
 def register_Ns3AddressChecker_methods(root_module, cls):
     ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
     cls.add_constructor([])
@@ -6809,6 +4608,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -6822,6 +4622,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/energy/bindings/modulegen__gcc_LP64.py ns-3.24/src/energy/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/energy/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -20,14 +20,6 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
-    ## wifi-phy-standard.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_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'], import_from_module='ns.wifi')
     ## address.h (module 'network'): ns3::Address [class]
     module.add_class('Address', import_from_module='ns.network')
     ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
@@ -36,20 +28,6 @@
     module.add_class('AttributeConstructionList', import_from_module='ns.core')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
     module.add_class('Item', import_from_module='ns.core', outer_class=root_module['ns3::AttributeConstructionList'])
-    ## buffer.h (module 'network'): ns3::Buffer [class]
-    module.add_class('Buffer', import_from_module='ns.network')
-    ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
-    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::Buffer'])
-    ## packet.h (module 'network'): ns3::ByteTagIterator [class]
-    module.add_class('ByteTagIterator', import_from_module='ns.network')
-    ## packet.h (module 'network'): ns3::ByteTagIterator::Item [class]
-    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagIterator'])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList [class]
-    module.add_class('ByteTagList', import_from_module='ns.network')
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator [class]
-    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList'])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item [struct]
-    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
     ## callback.h (module 'core'): ns3::CallbackBase [class]
     module.add_class('CallbackBase', import_from_module='ns.core')
     ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer [class]
@@ -86,30 +64,10 @@
     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')
-    ## 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]
-    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [enumeration]
-    module.add_enum('', ['PAYLOAD', 'HEADER', 'TRAILER'], outer_class=root_module['ns3::PacketMetadata::Item'], import_from_module='ns.network')
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator [class]
-    module.add_class('ItemIterator', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
-    ## packet.h (module 'network'): ns3::PacketTagIterator [class]
-    module.add_class('PacketTagIterator', import_from_module='ns.network')
-    ## packet.h (module 'network'): ns3::PacketTagIterator::Item [class]
-    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagIterator'])
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList [class]
-    module.add_class('PacketTagList', import_from_module='ns.network')
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData [struct]
-    module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
-    module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
     ## rv-battery-model-helper.h (module 'energy'): ns3::RvBatteryModelHelper [class]
     module.add_class('RvBatteryModelHelper', parent=root_module['ns3::EnergySourceHelper'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## tag.h (module 'network'): ns3::Tag [class]
-    module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
     module.add_class('TagBuffer', import_from_module='ns.network')
     ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
@@ -124,18 +82,6 @@
     module.add_class('AttributeInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation [struct]
     module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
-    module.add_class('WifiMode', import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
-    module.add_class('WifiModeFactory', import_from_module='ns.wifi')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener [class]
-    module.add_class('WifiPhyListener', allow_subclassing=True, import_from_module='ns.wifi')
-    ## wifi-radio-energy-model-helper.h (module 'energy'): ns3::WifiRadioEnergyModelHelper [class]
-    module.add_class('WifiRadioEnergyModelHelper', parent=root_module['ns3::DeviceEnergyModelHelper'])
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModelPhyListener [class]
-    module.add_class('WifiRadioEnergyModelPhyListener', parent=root_module['ns3::WifiPhyListener'])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
-    module.add_class('WifiTxVector', import_from_module='ns.wifi')
     ## empty.h (module 'core'): ns3::empty [class]
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t [class]
@@ -146,10 +92,6 @@
     module.add_class('BasicEnergyHarvesterHelper', parent=root_module['ns3::EnergyHarvesterHelper'])
     ## basic-energy-source-helper.h (module 'energy'): ns3::BasicEnergySourceHelper [class]
     module.add_class('BasicEnergySourceHelper', parent=root_module['ns3::EnergySourceHelper'])
-    ## chunk.h (module 'network'): ns3::Chunk [class]
-    module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
-    ## header.h (module 'network'): ns3::Header [class]
-    module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
     ## object.h (module 'core'): ns3::Object [class]
     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]
@@ -170,10 +112,6 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## nstime.h (module 'core'): ns3::Time [class]
@@ -188,20 +126,12 @@
     module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['ns3::Time'])
     ## traced-value.h (module 'core'): ns3::TracedValue<ns3::Time> [class]
     root_module['ns3::TracedValue< ns3::Time >'].implicitly_converts_to(root_module['ns3::Time'])
-    ## trailer.h (module 'network'): ns3::Trailer [class]
-    module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
     ## 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'])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy [class]
-    module.add_class('WifiPhy', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::State [enumeration]
-    module.add_enum('State', ['IDLE', 'CCA_BUSY', 'TX', 'RX', 'SWITCHING', 'SLEEP'], outer_class=root_module['ns3::WifiPhy'], import_from_module='ns.wifi')
-    ## wifi-tx-current-model.h (module 'energy'): ns3::WifiTxCurrentModel [class]
-    module.add_class('WifiTxCurrentModel', parent=root_module['ns3::Object'])
     ## 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]
@@ -274,16 +204,12 @@
     module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## li-ion-energy-source.h (module 'energy'): ns3::LiIonEnergySource [class]
     module.add_class('LiIonEnergySource', parent=root_module['ns3::EnergySource'])
-    ## wifi-tx-current-model.h (module 'energy'): ns3::LinearWifiTxCurrentModel [class]
-    module.add_class('LinearWifiTxCurrentModel', parent=root_module['ns3::WifiTxCurrentModel'])
     ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable [class]
     module.add_class('LogNormalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
     module.add_enum('PacketType', ['PACKET_HOST', 'NS3_PACKET_HOST', 'PACKET_BROADCAST', 'NS3_PACKET_BROADCAST', 'PACKET_MULTICAST', 'NS3_PACKET_MULTICAST', 'PACKET_OTHERHOST', 'NS3_PACKET_OTHERHOST'], outer_class=root_module['ns3::NetDevice'], import_from_module='ns.network')
-    ## nix-vector.h (module 'network'): ns3::NixVector [class]
-    module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     ## node.h (module 'network'): ns3::Node [class]
     module.add_class('Node', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable [class]
@@ -292,8 +218,6 @@
     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'])
-    ## packet.h (module 'network'): ns3::Packet [class]
-    module.add_class('Packet', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
     ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
     module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## rv-battery-model.h (module 'energy'): ns3::RvBatteryModel [class]
@@ -308,12 +232,6 @@
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## uinteger.h (module 'core'): ns3::UintegerValue [class]
     module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker [class]
-    module.add_class('WifiModeChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue [class]
-    module.add_class('WifiModeValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModel [class]
-    module.add_class('WifiRadioEnergyModel', parent=root_module['ns3::DeviceEnergyModel'])
     ## address.h (module 'network'): ns3::AddressChecker [class]
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
@@ -322,19 +240,6 @@
     module.add_class('BasicEnergyHarvester', parent=root_module['ns3::EnergyHarvester'])
     ## basic-energy-source.h (module 'energy'): ns3::BasicEnergySource [class]
     module.add_class('BasicEnergySource', parent=root_module['ns3::EnergySource'])
-    module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type=u'vector')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >', u'ns3::WifiMcsList')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >*', u'ns3::WifiMcsList*')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >&', u'ns3::WifiMcsList&')
-    typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >', u'ns3::WifiModeList')
-    typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >*', u'ns3::WifiModeList*')
-    typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >&', u'ns3::WifiModeList&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', u'ns3::WifiMcsListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', u'ns3::WifiMcsListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', u'ns3::WifiMcsListIterator&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -348,6 +253,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -388,6 +299,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -396,13 +338,6 @@
     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_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'])
-    register_Ns3ByteTagIteratorItem_methods(root_module, root_module['ns3::ByteTagIterator::Item'])
-    register_Ns3ByteTagList_methods(root_module, root_module['ns3::ByteTagList'])
-    register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
-    register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
     register_Ns3DeviceEnergyModelContainer_methods(root_module, root_module['ns3::DeviceEnergyModelContainer'])
     register_Ns3DeviceEnergyModelHelper_methods(root_module, root_module['ns3::DeviceEnergyModelHelper'])
@@ -419,34 +354,18 @@
     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_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'])
-    register_Ns3PacketTagIterator_methods(root_module, root_module['ns3::PacketTagIterator'])
-    register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
-    register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
-    register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
     register_Ns3RvBatteryModelHelper_methods(root_module, root_module['ns3::RvBatteryModelHelper'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
-    register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
     register_Ns3TracedValue__Double_methods(root_module, root_module['ns3::TracedValue< double >'])
     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'])
-    register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
-    register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
-    register_Ns3WifiPhyListener_methods(root_module, root_module['ns3::WifiPhyListener'])
-    register_Ns3WifiRadioEnergyModelHelper_methods(root_module, root_module['ns3::WifiRadioEnergyModelHelper'])
-    register_Ns3WifiRadioEnergyModelPhyListener_methods(root_module, root_module['ns3::WifiRadioEnergyModelPhyListener'])
-    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_Ns3BasicEnergyHarvesterHelper_methods(root_module, root_module['ns3::BasicEnergyHarvesterHelper'])
     register_Ns3BasicEnergySourceHelper_methods(root_module, root_module['ns3::BasicEnergySourceHelper'])
-    register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
-    register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     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'])
@@ -457,18 +376,13 @@
     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__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__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
     register_Ns3Time_methods(root_module, root_module['ns3::Time'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3TracedValue__Ns3Time_methods(root_module, root_module['ns3::TracedValue< ns3::Time >'])
-    register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
     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_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
-    register_Ns3WifiTxCurrentModel_methods(root_module, root_module['ns3::WifiTxCurrentModel'])
     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'])
@@ -505,15 +419,12 @@
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
     register_Ns3LiIonEnergySource_methods(root_module, root_module['ns3::LiIonEnergySource'])
-    register_Ns3LinearWifiTxCurrentModel_methods(root_module, root_module['ns3::LinearWifiTxCurrentModel'])
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     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_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
     register_Ns3RvBatteryModel_methods(root_module, root_module['ns3::RvBatteryModel'])
     register_Ns3SimpleDeviceEnergyModel_methods(root_module, root_module['ns3::SimpleDeviceEnergyModel'])
@@ -521,9 +432,6 @@
     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'])
-    register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
-    register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
-    register_Ns3WifiRadioEnergyModel_methods(root_module, root_module['ns3::WifiRadioEnergyModel'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3BasicEnergyHarvester_methods(root_module, root_module['ns3::BasicEnergyHarvester'])
@@ -644,363 +552,6 @@
     cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
     return
 
-def register_Ns3Buffer_methods(root_module, cls):
-    ## buffer.h (module 'network'): ns3::Buffer::Buffer() [constructor]
-    cls.add_constructor([])
-    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize) [constructor]
-    cls.add_constructor([param('uint32_t', 'dataSize')])
-    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize, bool initialize) [constructor]
-    cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
-    ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
-    cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
-    cls.add_method('AddAtEnd', 
-                   'bool', 
-                   [param('uint32_t', 'end')])
-    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
-    cls.add_method('AddAtEnd', 
-                   'void', 
-                   [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
-    cls.add_method('AddAtStart', 
-                   'bool', 
-                   [param('uint32_t', 'start')])
-    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
-    cls.add_method('Begin', 
-                   'ns3::Buffer::Iterator', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): void ns3::Buffer::CopyData(std::ostream * os, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'void', 
-                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::CopyData(uint8_t * buffer, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFragment(uint32_t start, uint32_t length) const [member function]
-    cls.add_method('CreateFragment', 
-                   'ns3::Buffer', 
-                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
-                   is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::End() const [member function]
-    cls.add_method('End', 
-                   'ns3::Buffer::Iterator', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint8_t const * ns3::Buffer::PeekData() const [member function]
-    cls.add_method('PeekData', 
-                   'uint8_t const *', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtEnd(uint32_t end) [member function]
-    cls.add_method('RemoveAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'end')])
-    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtStart(uint32_t start) [member function]
-    cls.add_method('RemoveAtStart', 
-                   'void', 
-                   [param('uint32_t', 'start')])
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
-                   is_const=True)
-    return
-
-def register_Ns3BufferIterator_methods(root_module, cls):
-    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator(ns3::Buffer::Iterator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Buffer::Iterator const &', 'arg0')])
-    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator() [constructor]
-    cls.add_constructor([])
-    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size) [member function]
-    cls.add_method('CalculateIpChecksum', 
-                   'uint16_t', 
-                   [param('uint16_t', 'size')])
-    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size, uint32_t initialChecksum) [member function]
-    cls.add_method('CalculateIpChecksum', 
-                   'uint16_t', 
-                   [param('uint16_t', 'size'), param('uint32_t', 'initialChecksum')])
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetDistanceFrom(ns3::Buffer::Iterator const & o) const [member function]
-    cls.add_method('GetDistanceFrom', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator const &', 'o')], 
-                   is_const=True)
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsEnd() const [member function]
-    cls.add_method('IsEnd', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsStart() const [member function]
-    cls.add_method('IsStart', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next() [member function]
-    cls.add_method('Next', 
-                   'void', 
-                   [])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next(uint32_t delta) [member function]
-    cls.add_method('Next', 
-                   'void', 
-                   [param('uint32_t', 'delta')])
-    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::PeekU8() [member function]
-    cls.add_method('PeekU8', 
-                   'uint8_t', 
-                   [])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev() [member function]
-    cls.add_method('Prev', 
-                   'void', 
-                   [])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev(uint32_t delta) [member function]
-    cls.add_method('Prev', 
-                   'void', 
-                   [param('uint32_t', 'delta')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(uint8_t * buffer, uint32_t size) [member function]
-    cls.add_method('Read', 
-                   'void', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(ns3::Buffer::Iterator start, uint32_t size) [member function]
-    cls.add_method('Read', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint32_t', 'size')])
-    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadLsbtohU16() [member function]
-    cls.add_method('ReadLsbtohU16', 
-                   'uint16_t', 
-                   [])
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadLsbtohU32() [member function]
-    cls.add_method('ReadLsbtohU32', 
-                   'uint32_t', 
-                   [])
-    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadLsbtohU64() [member function]
-    cls.add_method('ReadLsbtohU64', 
-                   'uint64_t', 
-                   [])
-    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadNtohU16() [member function]
-    cls.add_method('ReadNtohU16', 
-                   'uint16_t', 
-                   [])
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadNtohU32() [member function]
-    cls.add_method('ReadNtohU32', 
-                   'uint32_t', 
-                   [])
-    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadNtohU64() [member function]
-    cls.add_method('ReadNtohU64', 
-                   'uint64_t', 
-                   [])
-    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadU16() [member function]
-    cls.add_method('ReadU16', 
-                   'uint16_t', 
-                   [])
-    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadU32() [member function]
-    cls.add_method('ReadU32', 
-                   'uint32_t', 
-                   [])
-    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadU64() [member function]
-    cls.add_method('ReadU64', 
-                   'uint64_t', 
-                   [])
-    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::ReadU8() [member function]
-    cls.add_method('ReadU8', 
-                   'uint8_t', 
-                   [])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(uint8_t const * buffer, uint32_t size) [member function]
-    cls.add_method('Write', 
-                   'void', 
-                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
-    cls.add_method('Write', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('ns3::Buffer::Iterator', 'end')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU16(uint16_t data) [member function]
-    cls.add_method('WriteHtolsbU16', 
-                   'void', 
-                   [param('uint16_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU32(uint32_t data) [member function]
-    cls.add_method('WriteHtolsbU32', 
-                   'void', 
-                   [param('uint32_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU64(uint64_t data) [member function]
-    cls.add_method('WriteHtolsbU64', 
-                   'void', 
-                   [param('uint64_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU16(uint16_t data) [member function]
-    cls.add_method('WriteHtonU16', 
-                   'void', 
-                   [param('uint16_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU32(uint32_t data) [member function]
-    cls.add_method('WriteHtonU32', 
-                   'void', 
-                   [param('uint32_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU64(uint64_t data) [member function]
-    cls.add_method('WriteHtonU64', 
-                   'void', 
-                   [param('uint64_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU16(uint16_t data) [member function]
-    cls.add_method('WriteU16', 
-                   'void', 
-                   [param('uint16_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU32(uint32_t data) [member function]
-    cls.add_method('WriteU32', 
-                   'void', 
-                   [param('uint32_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU64(uint64_t data) [member function]
-    cls.add_method('WriteU64', 
-                   'void', 
-                   [param('uint64_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data) [member function]
-    cls.add_method('WriteU8', 
-                   'void', 
-                   [param('uint8_t', 'data')])
-    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data, uint32_t len) [member function]
-    cls.add_method('WriteU8', 
-                   'void', 
-                   [param('uint8_t', 'data'), param('uint32_t', 'len')])
-    return
-
-def register_Ns3ByteTagIterator_methods(root_module, cls):
-    ## packet.h (module 'network'): ns3::ByteTagIterator::ByteTagIterator(ns3::ByteTagIterator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ByteTagIterator const &', 'arg0')])
-    ## packet.h (module 'network'): bool ns3::ByteTagIterator::HasNext() const [member function]
-    cls.add_method('HasNext', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::ByteTagIterator::Item ns3::ByteTagIterator::Next() [member function]
-    cls.add_method('Next', 
-                   'ns3::ByteTagIterator::Item', 
-                   [])
-    return
-
-def register_Ns3ByteTagIteratorItem_methods(root_module, cls):
-    ## packet.h (module 'network'): ns3::ByteTagIterator::Item::Item(ns3::ByteTagIterator::Item const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ByteTagIterator::Item const &', 'arg0')])
-    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetEnd() const [member function]
-    cls.add_method('GetEnd', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetStart() const [member function]
-    cls.add_method('GetStart', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::ByteTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
-    cls.add_method('GetTag', 
-                   'void', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::TypeId ns3::ByteTagIterator::Item::GetTypeId() const [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True)
-    return
-
-def register_Ns3ByteTagList_methods(root_module, cls):
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList() [constructor]
-    cls.add_constructor([])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList(ns3::ByteTagList const & o) [copy constructor]
-    cls.add_constructor([param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): ns3::TagBuffer ns3::ByteTagList::Add(ns3::TypeId tid, uint32_t bufferSize, int32_t start, int32_t end) [member function]
-    cls.add_method('Add', 
-                   'ns3::TagBuffer', 
-                   [param('ns3::TypeId', 'tid'), param('uint32_t', 'bufferSize'), param('int32_t', 'start'), param('int32_t', 'end')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Add(ns3::ByteTagList const & o) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
-    cls.add_method('AddAtEnd', 
-                   'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
-    cls.add_method('AddAtStart', 
-                   'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
-    cls.add_method('Begin', 
-                   'ns3::ByteTagList::Iterator', 
-                   [param('int32_t', 'offsetStart'), param('int32_t', 'offsetEnd')], 
-                   is_const=True)
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::RemoveAll() [member function]
-    cls.add_method('RemoveAll', 
-                   'void', 
-                   [])
-    return
-
-def register_Ns3ByteTagListIterator_methods(root_module, cls):
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Iterator(ns3::ByteTagList::Iterator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ByteTagList::Iterator const &', 'arg0')])
-    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Iterator::GetOffsetStart() const [member function]
-    cls.add_method('GetOffsetStart', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## byte-tag-list.h (module 'network'): bool ns3::ByteTagList::Iterator::HasNext() const [member function]
-    cls.add_method('HasNext', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item ns3::ByteTagList::Iterator::Next() [member function]
-    cls.add_method('Next', 
-                   'ns3::ByteTagList::Iterator::Item', 
-                   [])
-    return
-
-def register_Ns3ByteTagListIteratorItem_methods(root_module, cls):
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::ByteTagList::Iterator::Item const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ByteTagList::Iterator::Item const &', 'arg0')])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::TagBuffer buf) [constructor]
-    cls.add_constructor([param('ns3::TagBuffer', 'buf')])
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::buf [variable]
-    cls.add_instance_attribute('buf', 'ns3::TagBuffer', is_const=False)
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::end [variable]
-    cls.add_instance_attribute('end', 'int32_t', is_const=False)
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::size [variable]
-    cls.add_instance_attribute('size', 'uint32_t', is_const=False)
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::start [variable]
-    cls.add_instance_attribute('start', 'int32_t', is_const=False)
-    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::tid [variable]
-    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
-    return
-
 def register_Ns3CallbackBase_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::CallbackBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackBase const &', 'arg0')])
@@ -1014,11 +565,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DeviceEnergyModelContainer_methods(root_module, cls):
@@ -1886,197 +1432,6 @@
                    [param('std::string', 'tid')])
     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')])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(ns3::PacketMetadata const & o) [copy constructor]
-    cls.add_constructor([param('ns3::PacketMetadata const &', 'o')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddAtEnd(ns3::PacketMetadata const & o) [member function]
-    cls.add_method('AddAtEnd', 
-                   'void', 
-                   [param('ns3::PacketMetadata const &', 'o')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddHeader(ns3::Header const & header, uint32_t size) [member function]
-    cls.add_method('AddHeader', 
-                   'void', 
-                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddPaddingAtEnd(uint32_t end) [member function]
-    cls.add_method('AddPaddingAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'end')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
-    cls.add_method('AddTrailer', 
-                   'void', 
-                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::PacketMetadata::BeginItem(ns3::Buffer buffer) const [member function]
-    cls.add_method('BeginItem', 
-                   'ns3::PacketMetadata::ItemIterator', 
-                   [param('ns3::Buffer', 'buffer')], 
-                   is_const=True)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata ns3::PacketMetadata::CreateFragment(uint32_t start, uint32_t end) const [member function]
-    cls.add_method('CreateFragment', 
-                   'ns3::PacketMetadata', 
-                   [param('uint32_t', 'start'), param('uint32_t', 'end')], 
-                   is_const=True)
-    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::Enable() [member function]
-    cls.add_method('Enable', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::EnableChecking() [member function]
-    cls.add_method('EnableChecking', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet-metadata.h (module 'network'): uint64_t ns3::PacketMetadata::GetUid() const [member function]
-    cls.add_method('GetUid', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtEnd(uint32_t end) [member function]
-    cls.add_method('RemoveAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'end')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtStart(uint32_t start) [member function]
-    cls.add_method('RemoveAtStart', 
-                   'void', 
-                   [param('uint32_t', 'start')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveHeader(ns3::Header const & header, uint32_t size) [member function]
-    cls.add_method('RemoveHeader', 
-                   'void', 
-                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
-    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
-    cls.add_method('RemoveTrailer', 
-                   'void', 
-                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
-    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
-                   is_const=True)
-    return
-
-def register_Ns3PacketMetadataItem_methods(root_module, cls):
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item() [constructor]
-    cls.add_constructor([])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item(ns3::PacketMetadata::Item const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::PacketMetadata::Item const &', 'arg0')])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::current [variable]
-    cls.add_instance_attribute('current', 'ns3::Buffer::Iterator', is_const=False)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentSize [variable]
-    cls.add_instance_attribute('currentSize', 'uint32_t', is_const=False)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromEnd [variable]
-    cls.add_instance_attribute('currentTrimedFromEnd', 'uint32_t', is_const=False)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromStart [variable]
-    cls.add_instance_attribute('currentTrimedFromStart', 'uint32_t', is_const=False)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::isFragment [variable]
-    cls.add_instance_attribute('isFragment', 'bool', is_const=False)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::tid [variable]
-    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
-    return
-
-def register_Ns3PacketMetadataItemIterator_methods(root_module, cls):
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata::ItemIterator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::PacketMetadata::ItemIterator const &', 'arg0')])
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata const * metadata, ns3::Buffer buffer) [constructor]
-    cls.add_constructor([param('ns3::PacketMetadata const *', 'metadata'), param('ns3::Buffer', 'buffer')])
-    ## packet-metadata.h (module 'network'): bool ns3::PacketMetadata::ItemIterator::HasNext() const [member function]
-    cls.add_method('HasNext', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item ns3::PacketMetadata::ItemIterator::Next() [member function]
-    cls.add_method('Next', 
-                   'ns3::PacketMetadata::Item', 
-                   [])
-    return
-
-def register_Ns3PacketTagIterator_methods(root_module, cls):
-    ## packet.h (module 'network'): ns3::PacketTagIterator::PacketTagIterator(ns3::PacketTagIterator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::PacketTagIterator const &', 'arg0')])
-    ## packet.h (module 'network'): bool ns3::PacketTagIterator::HasNext() const [member function]
-    cls.add_method('HasNext', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::PacketTagIterator::Item ns3::PacketTagIterator::Next() [member function]
-    cls.add_method('Next', 
-                   'ns3::PacketTagIterator::Item', 
-                   [])
-    return
-
-def register_Ns3PacketTagIteratorItem_methods(root_module, cls):
-    ## packet.h (module 'network'): ns3::PacketTagIterator::Item::Item(ns3::PacketTagIterator::Item const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::PacketTagIterator::Item const &', 'arg0')])
-    ## packet.h (module 'network'): void ns3::PacketTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
-    cls.add_method('GetTag', 
-                   'void', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::TypeId ns3::PacketTagIterator::Item::GetTypeId() const [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True)
-    return
-
-def register_Ns3PacketTagList_methods(root_module, cls):
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList() [constructor]
-    cls.add_constructor([])
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList(ns3::PacketTagList const & o) [copy constructor]
-    cls.add_constructor([param('ns3::PacketTagList const &', 'o')])
-    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::Add(ns3::Tag const & tag) const [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag')], 
-                   is_const=True)
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData const * ns3::PacketTagList::Head() const [member function]
-    cls.add_method('Head', 
-                   'ns3::PacketTagList::TagData const *', 
-                   [], 
-                   is_const=True)
-    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Peek(ns3::Tag & tag) const [member function]
-    cls.add_method('Peek', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Remove(ns3::Tag & tag) [member function]
-    cls.add_method('Remove', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::RemoveAll() [member function]
-    cls.add_method('RemoveAll', 
-                   'void', 
-                   [])
-    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Replace(ns3::Tag & tag) [member function]
-    cls.add_method('Replace', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    return
-
-def register_Ns3PacketTagListTagData_methods(root_module, cls):
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData() [constructor]
-    cls.add_constructor([])
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData(ns3::PacketTagList::TagData const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::PacketTagList::TagData const &', 'arg0')])
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
-    cls.add_instance_attribute('count', 'uint32_t', is_const=False)
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
-    cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
-    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
-    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
-    return
-
 def register_Ns3RvBatteryModelHelper_methods(root_module, cls):
     ## rv-battery-model-helper.h (module 'energy'): ns3::RvBatteryModelHelper::RvBatteryModelHelper(ns3::RvBatteryModelHelper const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::RvBatteryModelHelper const &', 'arg0')])
@@ -2106,45 +1461,13 @@
                    is_static=True)
     return
 
-def register_Ns3Tag_methods(root_module, cls):
-    ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
-    cls.add_constructor([])
-    ## tag.h (module 'network'): ns3::Tag::Tag(ns3::Tag const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Tag const &', 'arg0')])
-    ## tag.h (module 'network'): void ns3::Tag::Deserialize(ns3::TagBuffer i) [member function]
-    cls.add_method('Deserialize', 
-                   'void', 
-                   [param('ns3::TagBuffer', 'i')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## tag.h (module 'network'): uint32_t ns3::Tag::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## tag.h (module 'network'): static ns3::TypeId ns3::Tag::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## tag.h (module 'network'): void ns3::Tag::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## tag.h (module 'network'): void ns3::Tag::Serialize(ns3::TagBuffer i) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::TagBuffer', 'i')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    return
-
-def register_Ns3TagBuffer_methods(root_module, cls):
-    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(ns3::TagBuffer const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::TagBuffer const &', 'arg0')])
-    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(uint8_t * start, uint8_t * end) [constructor]
-    cls.add_constructor([param('uint8_t *', 'start'), param('uint8_t *', 'end')])
-    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::CopyFrom(ns3::TagBuffer o) [member function]
-    cls.add_method('CopyFrom', 
+def register_Ns3TagBuffer_methods(root_module, cls):
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(ns3::TagBuffer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TagBuffer const &', 'arg0')])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(uint8_t * start, uint8_t * end) [constructor]
+    cls.add_constructor([param('uint8_t *', 'start'), param('uint8_t *', 'end')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::CopyFrom(ns3::TagBuffer o) [member function]
+    cls.add_method('CopyFrom', 
                    'void', 
                    [param('ns3::TagBuffer', 'o')])
     ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Read(uint8_t * buffer, uint32_t size) [member function]
@@ -2448,276 +1771,6 @@
     cls.add_instance_attribute('name', 'std::string', is_const=False)
     return
 
-def register_Ns3WifiMode_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    cls.add_binary_comparison_operator('==')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiMode const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode() [constructor]
-    cls.add_constructor([])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
-    cls.add_constructor([param('std::string', 'name')])
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
-    cls.add_method('GetCodeRate', 
-                   'ns3::WifiCodeRate', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
-    cls.add_method('GetConstellationSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
-    cls.add_method('GetDataRate', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
-    cls.add_method('GetModulationClass', 
-                   'ns3::WifiModulationClass', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
-    cls.add_method('GetPhyRate', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
-    cls.add_method('GetUid', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiMode::GetUniqueName() const [member function]
-    cls.add_method('GetUniqueName', 
-                   'std::string', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsMandatory() const [member function]
-    cls.add_method('IsMandatory', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    return
-
-def register_Ns3WifiModeFactory_methods(root_module, cls):
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
-    cls.add_method('CreateWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
-                   is_static=True)
-    return
-
-def register_Ns3WifiPhyListener_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener::WifiPhyListener() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener::WifiPhyListener(ns3::WifiPhyListener const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiPhyListener const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyMaybeCcaBusyStart(ns3::Time duration) [member function]
-    cls.add_method('NotifyMaybeCcaBusyStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxEndError() [member function]
-    cls.add_method('NotifyRxEndError', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxEndOk() [member function]
-    cls.add_method('NotifyRxEndOk', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxStart(ns3::Time duration) [member function]
-    cls.add_method('NotifyRxStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifySleep() [member function]
-    cls.add_method('NotifySleep', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifySwitchingStart(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyTxStart(ns3::Time duration, double txPowerDbm) [member function]
-    cls.add_method('NotifyTxStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration'), param('double', 'txPowerDbm')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyWakeup() [member function]
-    cls.add_method('NotifyWakeup', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3WifiRadioEnergyModelHelper_methods(root_module, cls):
-    ## wifi-radio-energy-model-helper.h (module 'energy'): ns3::WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper(ns3::WifiRadioEnergyModelHelper const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiRadioEnergyModelHelper const &', 'arg0')])
-    ## wifi-radio-energy-model-helper.h (module 'energy'): ns3::WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper() [constructor]
-    cls.add_constructor([])
-    ## wifi-radio-energy-model-helper.h (module 'energy'): void ns3::WifiRadioEnergyModelHelper::Set(std::string name, ns3::AttributeValue const & v) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'v')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model-helper.h (module 'energy'): void ns3::WifiRadioEnergyModelHelper::SetDepletionCallback(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('SetDepletionCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model-helper.h (module 'energy'): void ns3::WifiRadioEnergyModelHelper::SetRechargedCallback(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('SetRechargedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model-helper.h (module 'energy'): void ns3::WifiRadioEnergyModelHelper::SetTxCurrentModel(std::string name, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetTxCurrentModel', 
-                   'void', 
-                   [param('std::string', 'name'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
-    ## wifi-radio-energy-model-helper.h (module 'energy'): ns3::Ptr<ns3::DeviceEnergyModel> ns3::WifiRadioEnergyModelHelper::DoInstall(ns3::Ptr<ns3::NetDevice> device, ns3::Ptr<ns3::EnergySource> source) const [member function]
-    cls.add_method('DoInstall', 
-                   'ns3::Ptr< ns3::DeviceEnergyModel >', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::Ptr< ns3::EnergySource >', 'source')], 
-                   is_const=True, visibility='private', is_virtual=True)
-    return
-
-def register_Ns3WifiRadioEnergyModelPhyListener_methods(root_module, cls):
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModelPhyListener::WifiRadioEnergyModelPhyListener(ns3::WifiRadioEnergyModelPhyListener const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiRadioEnergyModelPhyListener const &', 'arg0')])
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModelPhyListener::WifiRadioEnergyModelPhyListener() [constructor]
-    cls.add_constructor([])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyMaybeCcaBusyStart(ns3::Time duration) [member function]
-    cls.add_method('NotifyMaybeCcaBusyStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxEndError() [member function]
-    cls.add_method('NotifyRxEndError', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxEndOk() [member function]
-    cls.add_method('NotifyRxEndOk', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxStart(ns3::Time duration) [member function]
-    cls.add_method('NotifyRxStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifySleep() [member function]
-    cls.add_method('NotifySleep', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifySwitchingStart(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyTxStart(ns3::Time duration, double txPowerDbm) [member function]
-    cls.add_method('NotifyTxStart', 
-                   'void', 
-                   [param('ns3::Time', 'duration'), param('double', 'txPowerDbm')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::NotifyWakeup() [member function]
-    cls.add_method('NotifyWakeup', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::SetChangeStateCallback(ns3::Callback<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetChangeStateCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModelPhyListener::SetUpdateTxCurrentCallback(ns3::Callback<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetUpdateTxCurrentCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    return
-
-def register_Ns3WifiTxVector_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
-    ## 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, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   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() const [member function]
-    cls.add_method('GetNss', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetRetries() const [member function]
-    cls.add_method('GetRetries', 
-                   'uint8_t', 
-                   [], 
-                   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::IsShortGuardInterval() const [member function]
-    cls.add_method('IsShortGuardInterval', 
-                   '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'): 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::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::SetRetries(uint8_t retries) [member function]
-    cls.add_method('SetRetries', 
-                   'void', 
-                   [param('uint8_t', 'retries')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetShortGuardInterval(bool guardinterval) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'guardinterval')])
-    ## 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([])
@@ -2826,61 +1879,6 @@
                    is_const=True, visibility='private', is_virtual=True)
     return
 
-def register_Ns3Chunk_methods(root_module, cls):
-    ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
-    cls.add_constructor([])
-    ## chunk.h (module 'network'): ns3::Chunk::Chunk(ns3::Chunk const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Chunk const &', 'arg0')])
-    ## chunk.h (module 'network'): uint32_t ns3::Chunk::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## chunk.h (module 'network'): static ns3::TypeId ns3::Chunk::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## chunk.h (module 'network'): void ns3::Chunk::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    return
-
-def register_Ns3Header_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## header.h (module 'network'): ns3::Header::Header() [constructor]
-    cls.add_constructor([])
-    ## header.h (module 'network'): ns3::Header::Header(ns3::Header const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Header const &', 'arg0')])
-    ## header.h (module 'network'): uint32_t ns3::Header::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## header.h (module 'network'): uint32_t ns3::Header::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## header.h (module 'network'): static ns3::TypeId ns3::Header::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## header.h (module 'network'): void ns3::Header::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## header.h (module 'network'): void ns3::Header::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    return
-
 def register_Ns3Object_methods(root_module, cls):
     ## object.h (module 'core'): ns3::Object::Object() [constructor]
     cls.add_constructor([])
@@ -3102,30 +2100,6 @@
                    is_static=True)
     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]
-    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) [copy constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
-    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::Cleanup() [member function]
-    cls.add_method('Cleanup', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    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]
-    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) [copy constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
-    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::Cleanup() [member function]
-    cls.add_method('Cleanup', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    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]
     cls.add_constructor([])
@@ -3397,39 +2371,6 @@
                    [param('ns3::Time const &', 'v')])
     return
 
-def register_Ns3Trailer_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## trailer.h (module 'network'): ns3::Trailer::Trailer() [constructor]
-    cls.add_constructor([])
-    ## trailer.h (module 'network'): ns3::Trailer::Trailer(ns3::Trailer const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Trailer const &', 'arg0')])
-    ## trailer.h (module 'network'): uint32_t ns3::Trailer::Deserialize(ns3::Buffer::Iterator end) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'end')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## trailer.h (module 'network'): uint32_t ns3::Trailer::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## trailer.h (module 'network'): static ns3::TypeId ns3::Trailer::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## trailer.h (module 'network'): void ns3::Trailer::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## trailer.h (module 'network'): void ns3::Trailer::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    return
-
 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', 
@@ -3507,764 +2448,51 @@
     ## random-variable-stream.h (module 'core'): uint32_t ns3::UniformRandomVariable::GetInteger() [member function]
     cls.add_method('GetInteger', 
                    'uint32_t', 
-                   [], 
-                   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_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_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetShape() const [member function]
-    cls.add_method('GetShape', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
-                   'double', 
-                   [], 
-                   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_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [], 
-                   is_virtual=True)
-    return
-
-def register_Ns3WifiPhy_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): int64_t ns3::WifiPhy::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuration(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('CalculatePlcpDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
-    cls.add_method('CalculateSnr', 
-                   'double', 
-                   [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
-    cls.add_method('CalculateTxDuration', 
-                   'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetBssMembershipSelector(uint32_t selector) const [member function]
-    cls.add_method('GetBssMembershipSelector', 
-                   'uint32_t', 
-                   [param('uint32_t', 'selector')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiChannel> ns3::WifiPhy::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::WifiChannel >', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
-    cls.add_method('GetChannelNumber', 
-                   'uint16_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetChannelSwitchDelay() const [member function]
-    cls.add_method('GetChannelSwitchDelay', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
-    cls.add_method('GetDelayUntilIdle', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate11Mbps() [member function]
-    cls.add_method('GetDsssRate11Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate1Mbps() [member function]
-    cls.add_method('GetDsssRate1Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate2Mbps() [member function]
-    cls.add_method('GetDsssRate2Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate5_5Mbps() [member function]
-    cls.add_method('GetDsssRate5_5Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate12Mbps() [member function]
-    cls.add_method('GetErpOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate18Mbps() [member function]
-    cls.add_method('GetErpOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate24Mbps() [member function]
-    cls.add_method('GetErpOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate36Mbps() [member function]
-    cls.add_method('GetErpOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate48Mbps() [member function]
-    cls.add_method('GetErpOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate54Mbps() [member function]
-    cls.add_method('GetErpOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate6Mbps() [member function]
-    cls.add_method('GetErpOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate9Mbps() [member function]
-    cls.add_method('GetErpOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetFrequency() const [member function]
-    cls.add_method('GetFrequency', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetMFPlcpHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
-    cls.add_method('GetMembershipSelectorModes', 
-                   'ns3::WifiModeList', 
-                   [param('uint32_t', 'selector')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [param('uint32_t', 'mode')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
-    cls.add_method('GetNumberOfReceiveAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
-    cls.add_method('GetNumberOfTransmitAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
-    cls.add_method('GetOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
-    cls.add_method('GetPayloadDuration', 
-                   'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPlcpHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPlcpHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPlcpHtSigHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
-    cls.add_method('GetPlcpHtTrainingSymbolDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPlcpPreambleDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
-    cls.add_method('GetStateDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetStbc() const [member function]
-    cls.add_method('GetStbc', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
-    cls.add_method('GetTxPowerEnd', 
-                   'double', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
-    cls.add_method('GetTxPowerStart', 
-                   'double', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
-    cls.add_method('IsModeSupported', 
-                   'bool', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateBusy() [member function]
-    cls.add_method('IsStateBusy', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateCcaBusy() [member function]
-    cls.add_method('IsStateCcaBusy', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateIdle() [member function]
-    cls.add_method('IsStateIdle', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateRx() [member function]
-    cls.add_method('IsStateRx', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSleep() [member function]
-    cls.add_method('IsStateSleep', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSwitching() [member function]
-    cls.add_method('IsStateSwitching', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateTx() [member function]
-    cls.add_method('IsStateTx', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::Packet> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
-    cls.add_method('NotifyMonitorSniffRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<const ns3::Packet> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
-    cls.add_method('NotifyMonitorSniffTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxBegin', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyRxEnd', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyTxBegin', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyTxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NotifyTxEnd', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('RegisterListener', 
-                   'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResumeFromSleep() [member function]
-    cls.add_method('ResumeFromSleep', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<const ns3::Packet> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
-    cls.add_method('SendPacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint16_t', 'id')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint32_t', 'freq')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGreenfield(bool greenfield) [member function]
-    cls.add_method('SetGreenfield', 
-                   'void', 
-                   [param('bool', 'greenfield')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
-    cls.add_method('SetGuardInterval', 
-                   'void', 
-                   [param('bool', 'guardInterval')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
-    cls.add_method('SetLdpc', 
-                   'void', 
-                   [param('bool', 'ldpc')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
-    cls.add_method('SetNumberOfReceiveAntennas', 
-                   'void', 
-                   [param('uint32_t', 'rx')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfTransmitAntennas(uint32_t tx) [member function]
-    cls.add_method('SetNumberOfTransmitAntennas', 
-                   'void', 
-                   [param('uint32_t', 'tx')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::Callback<void,ns3::Ptr<const ns3::Packet>,double,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
-    cls.add_method('SetReceiveErrorCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiTxVector,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
-    cls.add_method('SetReceiveOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member function]
-    cls.add_method('SetSleepMode', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetStbc(bool stbc) [member function]
-    cls.add_method('SetStbc', 
-                   'void', 
-                   [param('bool', 'stbc')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('UnregisterListener', 
-                   'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [], 
+                   is_virtual=True)
     return
 
-def register_Ns3WifiTxCurrentModel_methods(root_module, cls):
-    ## wifi-tx-current-model.h (module 'energy'): ns3::WifiTxCurrentModel::WifiTxCurrentModel(ns3::WifiTxCurrentModel const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiTxCurrentModel const &', 'arg0')])
-    ## wifi-tx-current-model.h (module 'energy'): ns3::WifiTxCurrentModel::WifiTxCurrentModel() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-current-model.h (module 'energy'): double ns3::WifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
-    cls.add_method('CalcTxCurrent', 
-                   'double', 
-                   [param('double', 'txPowerDbm')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-tx-current-model.h (module 'energy'): static double ns3::WifiTxCurrentModel::DbmToW(double dbm) [member function]
-    cls.add_method('DbmToW', 
-                   'double', 
-                   [param('double', 'dbm')], 
-                   is_static=True)
-    ## wifi-tx-current-model.h (module 'energy'): static ns3::TypeId ns3::WifiTxCurrentModel::GetTypeId() [member function]
+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_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_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   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_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
 def register_Ns3ZetaRandomVariable_methods(root_module, cls):
@@ -4482,11 +2710,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4676,10 +2914,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5457,50 +3695,6 @@
                    visibility='private', is_virtual=True)
     return
 
-def register_Ns3LinearWifiTxCurrentModel_methods(root_module, cls):
-    ## wifi-tx-current-model.h (module 'energy'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel(ns3::LinearWifiTxCurrentModel const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::LinearWifiTxCurrentModel const &', 'arg0')])
-    ## wifi-tx-current-model.h (module 'energy'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-current-model.h (module 'energy'): double ns3::LinearWifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
-    cls.add_method('CalcTxCurrent', 
-                   'double', 
-                   [param('double', 'txPowerDbm')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-tx-current-model.h (module 'energy'): double ns3::LinearWifiTxCurrentModel::GetEta() const [member function]
-    cls.add_method('GetEta', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-current-model.h (module 'energy'): double ns3::LinearWifiTxCurrentModel::GetIdleCurrent() const [member function]
-    cls.add_method('GetIdleCurrent', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-current-model.h (module 'energy'): static ns3::TypeId ns3::LinearWifiTxCurrentModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-tx-current-model.h (module 'energy'): double ns3::LinearWifiTxCurrentModel::GetVoltage() const [member function]
-    cls.add_method('GetVoltage', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-tx-current-model.h (module 'energy'): void ns3::LinearWifiTxCurrentModel::SetEta(double eta) [member function]
-    cls.add_method('SetEta', 
-                   'void', 
-                   [param('double', 'eta')])
-    ## wifi-tx-current-model.h (module 'energy'): void ns3::LinearWifiTxCurrentModel::SetIdleCurrent(double idleCurrent) [member function]
-    cls.add_method('SetIdleCurrent', 
-                   'void', 
-                   [param('double', 'idleCurrent')])
-    ## wifi-tx-current-model.h (module 'energy'): void ns3::LinearWifiTxCurrentModel::SetVoltage(double voltage) [member function]
-    cls.add_method('SetVoltage', 
-                   'void', 
-                   [param('double', 'voltage')])
-    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', 
@@ -5544,7 +3738,7 @@
     cls.add_constructor([])
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
-    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(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('AddLinkChangeCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
@@ -5671,50 +3865,6 @@
                    is_pure_virtual=True, is_const=True, is_virtual=True)
     return
 
-def register_Ns3NixVector_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
-    cls.add_constructor([])
-    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [copy constructor]
-    cls.add_constructor([param('ns3::NixVector const &', 'o')])
-    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
-    cls.add_method('AddNeighborIndex', 
-                   'void', 
-                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
-    cls.add_method('BitCount', 
-                   'uint32_t', 
-                   [param('uint32_t', 'numberOfNeighbors')], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::NixVector >', 
-                   [], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
-    cls.add_method('ExtractNeighborIndex', 
-                   'uint32_t', 
-                   [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
-    cls.add_method('GetRemainingBits', 
-                   'uint32_t', 
-                   [])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
-                   is_const=True)
-    return
-
 def register_Ns3Node_methods(root_module, cls):
     ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Node const &', 'arg0')])
@@ -5883,191 +4033,6 @@
                    [param('ns3::ObjectFactory const &', 'value')])
     return
 
-def register_Ns3Packet_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
-    cls.add_constructor([])
-    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [copy constructor]
-    cls.add_constructor([param('ns3::Packet const &', 'o')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
-    cls.add_constructor([param('uint32_t', 'size')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
-    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
-    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('AddAtEnd', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
-    cls.add_method('AddByteTag', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
-    cls.add_method('AddHeader', 
-                   'void', 
-                   [param('ns3::Header const &', 'header')])
-    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
-    cls.add_method('AddPacketTag', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
-    cls.add_method('AddPaddingAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
-    cls.add_method('AddTrailer', 
-                   'void', 
-                   [param('ns3::Trailer const &', 'trailer')])
-    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
-    cls.add_method('BeginItem', 
-                   'ns3::PacketMetadata::ItemIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'void', 
-                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
-    cls.add_method('CreateFragment', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
-                   is_const=True)
-    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
-    cls.add_method('EnableChecking', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
-    cls.add_method('EnablePrinting', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
-    cls.add_method('FindFirstMatchingByteTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
-    cls.add_method('GetByteTagIterator', 
-                   'ns3::ByteTagIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
-    cls.add_method('GetNixVector', 
-                   'ns3::Ptr< ns3::NixVector >', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
-    cls.add_method('GetPacketTagIterator', 
-                   'ns3::PacketTagIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
-    cls.add_method('GetUid', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
-    cls.add_method('PeekHeader', 
-                   'uint32_t', 
-                   [param('ns3::Header &', 'header')], 
-                   is_const=True)
-    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
-    cls.add_method('PeekPacketTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
-    cls.add_method('PeekTrailer', 
-                   'uint32_t', 
-                   [param('ns3::Trailer &', 'trailer')])
-    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
-    cls.add_method('PrintByteTags', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
-    cls.add_method('PrintPacketTags', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
-    cls.add_method('RemoveAllByteTags', 
-                   'void', 
-                   [])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
-    cls.add_method('RemoveAllPacketTags', 
-                   'void', 
-                   [])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
-    cls.add_method('RemoveAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
-    cls.add_method('RemoveAtStart', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
-    cls.add_method('RemoveHeader', 
-                   'uint32_t', 
-                   [param('ns3::Header &', 'header')])
-    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
-    cls.add_method('RemovePacketTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
-    cls.add_method('RemoveTrailer', 
-                   'uint32_t', 
-                   [param('ns3::Trailer &', 'trailer')])
-    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
-    cls.add_method('ReplacePacketTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   '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]
-    cls.add_method('SetNixVector', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
-    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
-    cls.add_method('ToString', 
-                   'std::string', 
-                   [], 
-                   is_const=True)
-    return
-
 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', 
@@ -6388,172 +4353,6 @@
                    [param('uint64_t const &', 'value')])
     return
 
-def register_Ns3WifiModeChecker_methods(root_module, cls):
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
-    cls.add_constructor([])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker(ns3::WifiModeChecker const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiModeChecker const &', 'arg0')])
-    return
-
-def register_Ns3WifiModeValue_methods(root_module, cls):
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue() [constructor]
-    cls.add_constructor([])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiModeValue const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiModeValue const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiMode const & value) [constructor]
-    cls.add_constructor([param('ns3::WifiMode const &', 'value')])
-    ## wifi-mode.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::WifiModeValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): bool ns3::WifiModeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode ns3::WifiModeValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiModeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): void ns3::WifiModeValue::Set(ns3::WifiMode const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::WifiMode const &', 'value')])
-    return
-
-def register_Ns3WifiRadioEnergyModel_methods(root_module, cls):
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel(ns3::WifiRadioEnergyModel const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::WifiRadioEnergyModel const &', 'arg0')])
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel() [constructor]
-    cls.add_constructor([])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::ChangeState(int newState) [member function]
-    cls.add_method('ChangeState', 
-                   'void', 
-                   [param('int', 'newState')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetCcaBusyCurrentA() const [member function]
-    cls.add_method('GetCcaBusyCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiPhy::State ns3::WifiRadioEnergyModel::GetCurrentState() const [member function]
-    cls.add_method('GetCurrentState', 
-                   'ns3::WifiPhy::State', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetIdleCurrentA() const [member function]
-    cls.add_method('GetIdleCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): ns3::WifiRadioEnergyModelPhyListener * ns3::WifiRadioEnergyModel::GetPhyListener() [member function]
-    cls.add_method('GetPhyListener', 
-                   'ns3::WifiRadioEnergyModelPhyListener *', 
-                   [])
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetRxCurrentA() const [member function]
-    cls.add_method('GetRxCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetSleepCurrentA() const [member function]
-    cls.add_method('GetSleepCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetSwitchingCurrentA() const [member function]
-    cls.add_method('GetSwitchingCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetTotalEnergyConsumption() const [member function]
-    cls.add_method('GetTotalEnergyConsumption', 
-                   'double', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::GetTxCurrentA() const [member function]
-    cls.add_method('GetTxCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'energy'): static ns3::TypeId ns3::WifiRadioEnergyModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::HandleEnergyDepletion() [member function]
-    cls.add_method('HandleEnergyDepletion', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::HandleEnergyRecharged() [member function]
-    cls.add_method('HandleEnergyRecharged', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetCcaBusyCurrentA(double ccaBusyCurrentA) [member function]
-    cls.add_method('SetCcaBusyCurrentA', 
-                   'void', 
-                   [param('double', 'ccaBusyCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetEnergyDepletionCallback(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('SetEnergyDepletionCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetEnergyRechargedCallback(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('SetEnergyRechargedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
-    cls.add_method('SetEnergySource', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::EnergySource >', 'source')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetIdleCurrentA(double idleCurrentA) [member function]
-    cls.add_method('SetIdleCurrentA', 
-                   'void', 
-                   [param('double', 'idleCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetRxCurrentA(double rxCurrentA) [member function]
-    cls.add_method('SetRxCurrentA', 
-                   'void', 
-                   [param('double', 'rxCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetSleepCurrentA(double sleepCurrentA) [member function]
-    cls.add_method('SetSleepCurrentA', 
-                   'void', 
-                   [param('double', 'sleepCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetSwitchingCurrentA(double switchingCurrentA) [member function]
-    cls.add_method('SetSwitchingCurrentA', 
-                   'void', 
-                   [param('double', 'switchingCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetTxCurrentA(double txCurrentA) [member function]
-    cls.add_method('SetTxCurrentA', 
-                   'void', 
-                   [param('double', 'txCurrentA')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetTxCurrentFromModel(double txPowerDbm) [member function]
-    cls.add_method('SetTxCurrentFromModel', 
-                   'void', 
-                   [param('double', 'txPowerDbm')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::SetTxCurrentModel(ns3::Ptr<ns3::WifiTxCurrentModel> model) [member function]
-    cls.add_method('SetTxCurrentModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiTxCurrentModel >', 'model')])
-    ## wifi-radio-energy-model.h (module 'energy'): void ns3::WifiRadioEnergyModel::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   visibility='private', is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'energy'): double ns3::WifiRadioEnergyModel::DoGetCurrentA() const [member function]
-    cls.add_method('DoGetCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True, visibility='private', is_virtual=True)
-    return
-
 def register_Ns3AddressChecker_methods(root_module, cls):
     ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
     cls.add_constructor([])
@@ -6809,6 +4608,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -6822,6 +4622,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/energy/examples/basic-energy-model-test.cc ns-3.24/src/energy/examples/basic-energy-model-test.cc
--- ns-3.23/src/energy/examples/basic-energy-model-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/energy/examples/basic-energy-model-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,449 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
+ *
+ * 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: He Wu <mdzz@u.washington.edu>
+ */
+
+#include "ns3/basic-energy-source.h"
+#include "ns3/wifi-radio-energy-model.h"
+#include "ns3/basic-energy-source-helper.h"
+#include "ns3/wifi-radio-energy-model-helper.h"
+#include "ns3/energy-source-container.h"
+#include "ns3/device-energy-model-container.h"
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/simulator.h"
+#include "ns3/double.h"
+#include "ns3/config.h"
+#include "ns3/string.h"
+#include "ns3/yans-wifi-helper.h"
+#include "ns3/nqos-wifi-mac-helper.h"
+#include <cmath>
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("BasicEnergyModelTestSuite");
+
+/**
+ * Test case of update remaining energy for BasicEnergySource and
+ * WifiRadioEnergyModel.
+ */
+class BasicEnergyUpdateTest
+{
+public:
+  BasicEnergyUpdateTest ();
+  virtual ~BasicEnergyUpdateTest ();
+
+  /**
+   * Performs some tests involving state updates and the relative energy consumption
+   * \return true is some error happened.
+   */
+  bool DoRun (void);
+
+private:
+  /**
+   * \param state Radio state to switch to.
+   * \return False if no error occurs.
+   *
+   * Runs simulation for a while, check if final state & remaining energy is
+   * correctly updated.
+   */
+  bool StateSwitchTest (WifiPhy::State state);
+
+private:
+  double m_timeS;     // in seconds
+  double m_tolerance; // tolerance for power estimation
+
+  ObjectFactory m_energySource;
+  ObjectFactory m_deviceEnergyModel;
+};
+
+BasicEnergyUpdateTest::BasicEnergyUpdateTest ()
+{
+  m_timeS = 15.5; // idle for 15 seconds before changing state
+  m_tolerance = 1.0e-13;  //
+}
+
+BasicEnergyUpdateTest::~BasicEnergyUpdateTest ()
+{
+}
+
+bool
+BasicEnergyUpdateTest::DoRun (void)
+{
+  // set types
+  m_energySource.SetTypeId ("ns3::BasicEnergySource");
+  m_deviceEnergyModel.SetTypeId ("ns3::WifiRadioEnergyModel");
+
+  uint8_t ret = 0;
+
+  // run state switch tests
+  if (StateSwitchTest (WifiPhy::IDLE))
+    {
+      ret = 1;
+      std::cerr << "Problem with state switch test (WifiPhy idle)." << std::endl;
+    }
+  if (StateSwitchTest (WifiPhy::CCA_BUSY))
+    {
+      ret = 1;
+      std::cerr << "Problem with state switch test (WifiPhy cca busy)." << std::endl;
+    }
+  if (StateSwitchTest (WifiPhy::TX))
+    {
+      ret = 1;
+      std::cerr << "Problem with state switch test (WifiPhy tx)." << std::endl;
+    }
+  if (StateSwitchTest (WifiPhy::RX))
+    {
+      ret = 1;
+      std::cerr << "Problem with state switch test (WifiPhy rx)." << std::endl;
+    }
+  if (StateSwitchTest (WifiPhy::SWITCHING))
+    {
+      ret = 1;
+      std::cerr << "Problem with state switch test (WifiPhy switching)." << std::endl;
+    }
+  if (StateSwitchTest (WifiPhy::SLEEP))
+    {
+      ret = 1;
+      std::cerr << "Problem with state switch test (WifiPhy sleep)." << std::endl;
+    }
+  return ret;
+}
+
+bool
+BasicEnergyUpdateTest::StateSwitchTest (WifiPhy::State state)
+{
+  // create node
+  Ptr<Node> node = CreateObject<Node> ();
+
+  // create energy source
+  Ptr<BasicEnergySource> source = m_energySource.Create<BasicEnergySource> ();
+  // aggregate energy source to node
+  node->AggregateObject (source);
+
+  // create device energy model
+  Ptr<WifiRadioEnergyModel> model =
+    m_deviceEnergyModel.Create<WifiRadioEnergyModel> ();
+  // set energy source pointer
+  model->SetEnergySource (source);
+  // add device energy model to model list in energy source
+  source->AppendDeviceEnergyModel (model);
+
+  // retrieve device energy model from energy source
+  DeviceEnergyModelContainer models =
+    source->FindDeviceEnergyModels ("ns3::WifiRadioEnergyModel");
+  // check list
+  if ((models.GetN () == 0))
+    {
+      std::cerr << "Model list is empty!." << std::endl;
+      return true;
+    }
+  // get pointer
+  Ptr<WifiRadioEnergyModel> devModel =
+    DynamicCast<WifiRadioEnergyModel> (models.Get (0));
+  // check pointer
+  if ((devModel == 0))
+    {
+      std::cerr << "NULL pointer to device model!." << std::endl;
+      return true;
+    }
+
+  /*
+   * The radio will stay IDLE for m_timeS seconds. Then it will switch into a
+   * different state.
+   */
+
+  // schedule change of state
+  Simulator::Schedule (Seconds (m_timeS),
+                       &WifiRadioEnergyModel::ChangeState, devModel, state);
+
+  // Calculate remaining energy at simulation stop time
+  Simulator::Schedule (Seconds (m_timeS * 2), 
+                       &BasicEnergySource::UpdateEnergySource, source);
+
+  double timeDelta = 0.000000001; // 1 nanosecond
+  // run simulation; stop just after last scheduled event
+  Simulator::Stop (Seconds (m_timeS * 2 + timeDelta));
+  Simulator::Run ();
+
+  // energy = current * voltage * time
+
+  // calculate idle power consumption
+  double estRemainingEnergy = source->GetInitialEnergy ();
+  double voltage = source->GetSupplyVoltage ();
+  estRemainingEnergy -= devModel->GetIdleCurrentA () * voltage * m_timeS;
+
+  /*
+   * Manually calculate the number of periodic updates performed by the source.
+   * This is to check if the periodic updates are performed correctly.
+   */
+  double actualTime = m_timeS;
+  actualTime /= source->GetEnergyUpdateInterval ().GetSeconds ();
+  actualTime = floor (actualTime); // rounding for update interval
+  actualTime *= source->GetEnergyUpdateInterval ().GetSeconds ();
+
+  // calculate new state power consumption
+  double current = 0.0;
+  switch (state)
+    {
+    case WifiPhy::IDLE:
+      current = devModel->GetIdleCurrentA ();
+      break;
+    case WifiPhy::CCA_BUSY:
+      current = devModel->GetCcaBusyCurrentA ();
+      break;
+    case WifiPhy::TX:
+      current = devModel->GetTxCurrentA ();
+      break;
+    case WifiPhy::RX:
+      current = devModel->GetRxCurrentA ();
+      break;
+    case WifiPhy::SWITCHING:
+      current = devModel->GetSwitchingCurrentA ();
+      break;
+    case WifiPhy::SLEEP:
+      current = devModel->GetSleepCurrentA ();
+      break;
+    default:
+      NS_FATAL_ERROR ("Undefined radio state: " << state);
+      break;
+    }
+  estRemainingEnergy -= current * voltage * m_timeS;
+
+  // obtain remaining energy from source
+  double remainingEnergy = source->GetRemainingEnergy ();
+  NS_LOG_DEBUG ("Remaining energy is " << remainingEnergy);
+  NS_LOG_DEBUG ("Estimated remaining energy is " << estRemainingEnergy);
+  NS_LOG_DEBUG ("Difference is " << estRemainingEnergy - remainingEnergy);
+
+  // check remaining energy
+  if ((remainingEnergy > (estRemainingEnergy + m_tolerance)) ||
+      (remainingEnergy < (estRemainingEnergy - m_tolerance)))
+    {
+      std::cerr << "Incorrect remaining energy!" << std::endl;
+      return true;
+    }
+
+  // obtain radio state
+  WifiPhy::State endState = devModel->GetCurrentState ();
+  NS_LOG_DEBUG ("Radio state is " << endState);
+  // check end state
+  if (endState != state)
+    {
+      std::cerr << "Incorrect end state!" << std::endl;
+      return true;
+    }
+  Simulator::Destroy ();
+
+  return false; // no error
+}
+
+// -------------------------------------------------------------------------- //
+
+/**
+ * Test case of energy depletion handling for BasicEnergySource and
+ * WifiRadioEnergyModel.
+ */
+class BasicEnergyDepletionTest
+{
+public:
+  BasicEnergyDepletionTest ();
+  virtual ~BasicEnergyDepletionTest ();
+
+  /**
+   * Performs some tests involving energy depletion
+   * \return true is some error happened.
+   */
+  bool DoRun (void);
+
+private:
+  /**
+   * Callback invoked when energy is drained from source.
+   */
+  void DepletionHandler (void);
+
+  /**
+   * \param simTimeS Simulation time, in seconds.
+   * \param updateIntervalS Device model update interval, in seconds.
+   * \return False if all is good.
+   *
+   * Runs simulation with specified simulation time and update interval.
+   */
+  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
+
+};
+
+BasicEnergyDepletionTest::BasicEnergyDepletionTest ()
+{
+  m_numOfNodes = 10;
+  m_callbackCount = 0;
+  m_simTimeS = 4.5;
+  m_timeStepS = 0.5;
+  m_updateIntervalS = 1.5;
+}
+
+BasicEnergyDepletionTest::~BasicEnergyDepletionTest ()
+{
+}
+
+bool
+BasicEnergyDepletionTest::DoRun (void)
+{
+  /*
+   * Run simulation with different simulation time and update interval.
+   */
+  uint8_t ret = 0;
+
+  for (double simTimeS = 0.0; simTimeS <= m_simTimeS; simTimeS += m_timeStepS)
+    {
+      for (double updateIntervalS = 0.5; updateIntervalS <= m_updateIntervalS;
+           updateIntervalS += m_timeStepS)
+        {
+          if (DepletionTestCase (simTimeS, updateIntervalS))
+            {
+              ret = 1;
+              std::cerr << "Depletion test case problem." << std::endl;
+            }
+          // reset callback count
+          m_callbackCount = 0;
+        }
+    }
+  return ret;
+}
+
+void
+BasicEnergyDepletionTest::DepletionHandler (void)
+{
+  m_callbackCount++;
+}
+
+bool
+BasicEnergyDepletionTest::DepletionTestCase (double simTimeS,
+                                             double updateIntervalS)
+{
+  // create node
+  NodeContainer c;
+  c.Create (m_numOfNodes);
+
+  std::string phyMode ("DsssRate1Mbps");
+
+  // disable fragmentation for frames below 2200 bytes
+  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold",
+                      StringValue ("2200"));
+  // turn off RTS/CTS for frames below 2200 bytes
+  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold",
+                      StringValue ("2200"));
+  // Fix non-unicast data rate to be the same as that of unicast
+  Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode",
+                      StringValue (phyMode));
+
+  // install YansWifiPhy
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
+
+  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
+  /*
+   * This is one parameter that matters when using FixedRssLossModel, set it to
+   * zero; otherwise, gain will be added.
+   */
+  wifiPhy.Set ("RxGain", DoubleValue (0));
+  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
+  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
+
+  YansWifiChannelHelper wifiChannel;
+  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
+  wifiPhy.SetChannel (wifiChannel.Create ());
+
+  // Add a non-QoS upper MAC, and disable rate control
+  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                "DataMode", StringValue (phyMode),
+                                "ControlMode", StringValue (phyMode));
+  // Set it to ad-hoc mode
+  wifiMac.SetType ("ns3::AdhocWifiMac");
+  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
+
+  /*
+   * Create and install energy source and a single basic radio energy model on
+   * the node using helpers.
+   */
+  // source helper
+  BasicEnergySourceHelper basicSourceHelper;
+  // set energy to 0 so that we deplete energy at the beginning of simulation
+  basicSourceHelper.Set ("BasicEnergySourceInitialEnergyJ", DoubleValue (0.0));
+  // set update interval
+  basicSourceHelper.Set ("PeriodicEnergyUpdateInterval",
+                         TimeValue (Seconds (updateIntervalS)));
+  // install source
+  EnergySourceContainer sources = basicSourceHelper.Install (c);
+
+  // device energy model helper
+  WifiRadioEnergyModelHelper radioEnergyHelper;
+  // set energy depletion callback
+  WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback =
+    MakeCallback (&BasicEnergyDepletionTest::DepletionHandler, this);
+  radioEnergyHelper.SetDepletionCallback (callback);
+  // install on node
+  DeviceEnergyModelContainer deviceModels = radioEnergyHelper.Install (devices, sources);
+
+  // run simulation
+  Simulator::Stop (Seconds (simTimeS));
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+  NS_LOG_DEBUG ("Simulation time = " << simTimeS << "s");
+  NS_LOG_DEBUG ("Update interval = " << updateIntervalS << "s");
+  NS_LOG_DEBUG ("Expected callback count is " << m_numOfNodes);
+  NS_LOG_DEBUG ("Actual callback count is " << m_callbackCount);
+
+  // check result, call back should only be invoked once
+  if (m_numOfNodes != m_callbackCount)
+    {
+      std::cerr << "Not all callbacks are invoked!" << std::endl;
+      return true;
+    }
+
+  return false;
+}
+
+// -------------------------------------------------------------------------- //
+
+int
+main (int argc, char **argv)
+{
+  BasicEnergyUpdateTest testEnergyUpdate;
+  if (testEnergyUpdate.DoRun ())
+    {
+      return 1;
+    }
+
+  BasicEnergyDepletionTest testEnergyDepletion;
+  if (testEnergyDepletion.DoRun ())
+    {
+      return 1;
+    }
+
+  return 0;
+}
diff -Naur ns-3.23/src/energy/examples/rv-battery-model-test.cc ns-3.24/src/energy/examples/rv-battery-model-test.cc
--- ns-3.23/src/energy/examples/rv-battery-model-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/energy/examples/rv-battery-model-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,892 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
+ *
+ * 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: He Wu <mdzz@u.washington.edu>
+ */
+
+#include "ns3/rv-battery-model.h"
+#include "ns3/wifi-radio-energy-model.h"
+#include "ns3/rv-battery-model-helper.h"
+#include "ns3/wifi-radio-energy-model-helper.h"
+#include "ns3/energy-source-container.h"
+#include "ns3/device-energy-model-container.h"
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/simulator.h"
+#include "ns3/double.h"
+#include "ns3/config.h"
+#include "ns3/string.h"
+#include "ns3/yans-wifi-helper.h"
+#include "ns3/nqos-wifi-mac-helper.h"
+#include <cmath>
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("RvBatteryModelTestSuite");
+
+/**
+ * This example was originally devised as a test, then it was converted
+ * to an example.
+ *
+ * The script tests the remaining energy for RvBatteryModel and
+ * WifiRadioEnergyModel updates. It does so by
+ * mimicking the procedure and results published in
+ * D. Rakhmatov, S. Vrudhula, D.A. Wallach, "Battery lifetime prediction for energy-aware computing,"
+ * Proceedings of the 2002 International Symposium on Low Power Electronics and Design, 2002. ISLPED '02.
+ * doi: 10.1109/LPE.2002.146729
+ */
+class BatteryLifetimeTest
+{
+public:
+  BatteryLifetimeTest ();
+  virtual ~BatteryLifetimeTest ();
+
+  /**
+   * Creates load profiles according to
+   * D. Rakhmatov, S. Vrudhula, D.A. Wallach, "Battery lifetime prediction for energy-aware computing,"
+   * Proceedings of the 2002 International Symposium on Low Power Electronics and Design, 2002. ISLPED '02.
+   * doi: 10.1109/LPE.2002.146729
+   */
+  void CreateLoadProfiles (void);
+
+  /**
+   * \param load Load value, in Amperes (A).
+   * \param expLifetime Expected lifetime.
+   * \return False if no error occurs.
+   *
+   * Runs simulation with constant load and checks the battery lifetime with
+   * known results.
+   */
+  bool ConstantLoadTest (double load, Time expLifetime);
+
+  /**
+   * \param loads Load profile.
+   * \param timeStamps Time stamps.
+   * \param expLifetime Expected lifetime.
+   * \returns False if no error occurs.
+   *
+   * Runs simulation with variable load and checks the battery lifetime with
+   * known results.
+   */
+  bool VariableLoadTest (std::vector<double> loads,
+                         std::vector<Time> timeStamps,
+                         Time expLifetime);
+
+  typedef struct LoadProfile
+  {
+    std::vector<double> loads;
+    std::vector<Time> timeStamps;
+    Time itsyLifetime;
+    Time dualFoilLifeTime;
+  } LoadProfile;
+
+  std::vector<LoadProfile> m_loadProfiles;
+  double m_alpha;
+  double m_beta;
+};
+
+BatteryLifetimeTest::BatteryLifetimeTest ()
+{
+  // Itsy battery
+  m_alpha = 35220;
+  m_beta = 0.637;
+}
+
+BatteryLifetimeTest::~BatteryLifetimeTest ()
+{
+}
+
+void
+BatteryLifetimeTest::CreateLoadProfiles (void)
+{
+  // create set of load profiles
+  LoadProfile profile;
+
+  std::vector<double> loads;
+  std::vector<Time> timeStamps;
+
+  // C1
+  loads.push_back (0.628);
+  loads.push_back (0);
+  loads.push_back (0.628);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (19.5 * 60));
+  timeStamps.push_back (Seconds (26.0 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (55.0 * 60);     // 55.0 minutes
+  profile.dualFoilLifeTime = Seconds (36.2 * 60); // 36.2 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C2
+  loads.push_back (0.4947);
+  loads.push_back (0);
+  loads.push_back (0.4947);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (31.0 * 60));
+  timeStamps.push_back (Seconds (41.3 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (73.9 * 60);     // 73.9 minutes
+  profile.dualFoilLifeTime = Seconds (55.8 * 60); // 55.8 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C3
+  loads.push_back (0.4256);
+  loads.push_back (0);
+  loads.push_back (0.4256);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (41.0 * 60));
+  timeStamps.push_back (Seconds (54.6 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (88.8 * 60);     // 88.8 minutes
+  profile.dualFoilLifeTime = Seconds (71.8 * 60); // 71.8 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C4
+  loads.push_back (0.2923);
+  loads.push_back (0);
+  loads.push_back (0.2923);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (74.6 * 60));
+  timeStamps.push_back (Seconds (99.5 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (137.8 * 60);      // 137.8 minutes
+  profile.dualFoilLifeTime = Seconds (124.9 * 60);  // 124.9 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C5
+  loads.push_back (0.2227);
+  loads.push_back (0);
+  loads.push_back (0.2227);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (105.7 * 60));
+  timeStamps.push_back (Seconds (140.9 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (185.8 * 60);      // 185.8 minutes
+  profile.dualFoilLifeTime = Seconds (176.7 * 60);  // 176.7 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C6
+  loads.push_back (0.628);
+  loads.push_back (0);
+  loads.push_back (0.628);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (19.5 * 60));
+  timeStamps.push_back (Seconds (29.9 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (58.9 * 60);     // 58.9 minutes
+  profile.dualFoilLifeTime = Seconds (41.0 * 60); // 41.0 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C7
+  loads.push_back (0.628);
+  loads.push_back (0);
+  loads.push_back (0.628);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (19.5 * 60));
+  timeStamps.push_back (Seconds (22.1 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (51.1 * 60);     // 51.1 minutes
+  profile.dualFoilLifeTime = Seconds (30.8 * 60); // 30.8 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C8
+  loads.push_back (0.628);
+  loads.push_back (0);
+  loads.push_back (0.628);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (23.4 * 60));
+  timeStamps.push_back (Seconds (29.9 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (55.0 * 60);     // 55.0 minutes
+  profile.dualFoilLifeTime = Seconds (37.4 * 60); // 37.4 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C9
+  loads.push_back (0.628);
+  loads.push_back (0);
+  loads.push_back (0.628);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (15.6 * 60));
+  timeStamps.push_back (Seconds (22.1 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (55.0 * 60);     // 55.0 minutes
+  profile.dualFoilLifeTime = Seconds (35.2 * 60); // 35.2 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C10
+  loads.push_back (0.300);
+  loads.push_back (0.628);
+  loads.push_back (0.4947);
+  loads.push_back (0.2523);
+  loads.push_back (0.2341);
+  loads.push_back (0.1379);
+  loads.push_back (0.1139);
+  loads.push_back (0.2656);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (0.5 * 60));
+  timeStamps.push_back (Seconds (5.5 * 60));
+  timeStamps.push_back (Seconds (10.5 * 60));
+  timeStamps.push_back (Seconds (35.5 * 60));
+  timeStamps.push_back (Seconds (60.5 * 60));
+  timeStamps.push_back (Seconds (85.5 * 60));
+  timeStamps.push_back (Seconds (110.5 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (144.3 * 60);      // 144.3 minutes
+  profile.dualFoilLifeTime = Seconds (132.6 * 60);  // 132.6 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C11
+  loads.push_back (0.300);
+  loads.push_back (0.1139);
+  loads.push_back (0.1379);
+  loads.push_back (0.2341);
+  loads.push_back (0.2523);
+  loads.push_back (0.4947);
+  loads.push_back (0.628);
+  loads.push_back (0.2656);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (0.5 * 60));
+  timeStamps.push_back (Seconds (25.5 * 60));
+  timeStamps.push_back (Seconds (50.5 * 60));
+  timeStamps.push_back (Seconds (75.5 * 60));
+  timeStamps.push_back (Seconds (100.5 * 60));
+  timeStamps.push_back (Seconds (105.5 * 60));
+  timeStamps.push_back (Seconds (110.5 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (144.3 * 60);      // 144.3 minutes
+  profile.dualFoilLifeTime = Seconds (107.4 * 60);  // 107.4 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C12
+  loads.push_back (0.300);
+  loads.push_back (0.1139);
+  loads.push_back (0.1379);
+  loads.push_back (0.2341);
+  loads.push_back (0.2523);
+  loads.push_back (0.4947);
+  loads.push_back (0.0);
+  loads.push_back (0.300);
+  loads.push_back (0.628);
+  loads.push_back (0.2656);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (0.5 * 60));
+  timeStamps.push_back (Seconds (25.5 * 60));
+  timeStamps.push_back (Seconds (50.5 * 60));
+  timeStamps.push_back (Seconds (75.5 * 60));
+  timeStamps.push_back (Seconds (100.5 * 60));
+  timeStamps.push_back (Seconds (105.5 * 60));
+  timeStamps.push_back (Seconds (130.5 * 60));
+  timeStamps.push_back (Seconds (131.0 * 60));
+  timeStamps.push_back (Seconds (136.0 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (169.3 * 60);      // 169.3 minutes
+  profile.dualFoilLifeTime = Seconds (155.4 * 60);  // 155.4 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C13
+  loads.push_back (0.300);
+  timeStamps.push_back (Seconds (0));
+
+  for (int i = 0; i < 5; i++)
+    {
+      loads.push_back (0.628);
+      loads.push_back (0.4947);
+      loads.push_back (0.2523);
+      loads.push_back (0.2341);
+      loads.push_back (0.1379);
+      loads.push_back (0.1139);
+
+      timeStamps.push_back (Seconds ((0.5 + i * 22.5) * 60));
+      timeStamps.push_back (Seconds ((1.5 + i * 22.5) * 60));
+      timeStamps.push_back (Seconds ((2.5 + i * 22.5) * 60));
+      timeStamps.push_back (Seconds ((7.5 + i * 22.5) * 60));
+      timeStamps.push_back (Seconds ((12.5 + i * 22.5) * 60));
+      timeStamps.push_back (Seconds ((17.5 + i * 22.5) * 60));
+    }
+
+  loads.push_back (0.2656);
+  timeStamps.push_back (Seconds (110.5 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (144.3 * 60);      // 144.3 minutes
+  profile.dualFoilLifeTime = Seconds (131.7 * 60);  // 131.7 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C14, time stamp calculation in paper is off, using our own estimated value
+  loads.push_back (0.300);
+  timeStamps.push_back (Seconds (0));
+
+  for (int i = 0; i < 5; i++)
+    {
+      loads.push_back (0.1139);
+      loads.push_back (0.1379);
+      loads.push_back (0.2341);
+      loads.push_back (0.2523);
+      loads.push_back (0.4947);
+      loads.push_back (0.628);
+
+      timeStamps.push_back (Seconds ((0.5 + i * 22.5) * 60));
+      timeStamps.push_back (Seconds ((5.5 + i * 22.5) * 60));
+      timeStamps.push_back (Seconds ((10.5 + i * 22.5) * 60));
+      timeStamps.push_back (Seconds ((15.5 + i * 22.5) * 60));
+      timeStamps.push_back (Seconds ((20.5 + i * 22.5) * 60));
+      timeStamps.push_back (Seconds ((21.5 + i * 22.5) * 60));
+    }
+
+  loads.push_back (0.2656);
+  timeStamps.push_back (Seconds (112.5 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (141.5 * 60);      // 141.5 minutes
+  profile.dualFoilLifeTime = Seconds (126.3 * 60);  // 126.3 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C15
+  loads.push_back (0.2227);
+  loads.push_back (0.2045);
+  loads.push_back (0.1083);
+  loads.push_back (0.0843);
+  loads.push_back (0.2227);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (50.0 * 60));
+  timeStamps.push_back (Seconds (100.0 * 60));
+  timeStamps.push_back (Seconds (150.0 * 60));
+  timeStamps.push_back (Seconds (200.0 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (211.4 * 60);      // 211.4 minutes
+  profile.dualFoilLifeTime = Seconds (209.2 * 60);  // 209.2 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C16
+  loads.push_back (0.0843);
+  loads.push_back (0.1083);
+  loads.push_back (0.2045);
+  loads.push_back (0.2227);
+  loads.push_back (0.2227);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (50.0 * 60));
+  timeStamps.push_back (Seconds (100.0 * 60));
+  timeStamps.push_back (Seconds (150.0 * 60));
+  timeStamps.push_back (Seconds (200.0 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (211.4 * 60);      // 211.4 minutes
+  profile.dualFoilLifeTime = Seconds (200.7 * 60);  // 200.7 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C17
+  loads.push_back (0.0843);
+  loads.push_back (0.1083);
+  loads.push_back (0.2045);
+  loads.push_back (0.0);
+  loads.push_back (0.2227);
+  loads.push_back (0.2227);
+
+  timeStamps.push_back (Seconds (0));
+  timeStamps.push_back (Seconds (50.0 * 60));
+  timeStamps.push_back (Seconds (100.0 * 60));
+  timeStamps.push_back (Seconds (150.0 * 60));
+  timeStamps.push_back (Seconds (200.0 * 60));
+  timeStamps.push_back (Seconds (250.0 * 60));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (261.4 * 60);      // 261.4 minutes
+  profile.dualFoilLifeTime = Seconds (251.2 * 60);  // 251.2 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C18
+  for (int i = 0; i < 10; i++)
+    {
+      loads.push_back (0.0843);
+      loads.push_back (0.1083);
+      loads.push_back (0.2045);
+      loads.push_back (0.2227);
+
+      timeStamps.push_back (Seconds ((0.0 + i * 20.0) * 60));
+      timeStamps.push_back (Seconds ((5.0 + i * 20.0) * 60));
+      timeStamps.push_back (Seconds ((10.0 + i * 20.0) * 60));
+      timeStamps.push_back (Seconds ((15.0 + i * 20.0) * 60));
+    }
+
+  loads.push_back (0.2227);
+  timeStamps.push_back (Seconds (200.0));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (211.4 * 60);      // 211.4 minutes
+  profile.dualFoilLifeTime = Seconds (204.6 * 60);  // 204.6 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C19
+  for (int i = 0; i < 10; i++)
+    {
+      loads.push_back (0.0755);
+      loads.push_back (0.0949);
+      loads.push_back (0.2045);
+      loads.push_back (0.2227);
+
+      timeStamps.push_back (Seconds ((0.0 + i * 20.0) * 60));
+      timeStamps.push_back (Seconds ((5.0 + i * 20.0) * 60));
+      timeStamps.push_back (Seconds ((10.0 + i * 20.0) * 60));
+      timeStamps.push_back (Seconds ((15.0 + i * 20.0) * 60));
+    }
+
+  loads.push_back (0.2227);
+  timeStamps.push_back (Seconds (200.0));
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (216.4 * 60);      // 216.4 minutes
+  profile.dualFoilLifeTime = Seconds (208.7 * 60);  // 208.7 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C20
+  for (int i = 0; i < 50; i++)
+    {
+      loads.push_back (0.4947);
+      loads.push_back (0.628);
+
+      timeStamps.push_back (Seconds ((0.0 + i * 2.0) * 60));
+      timeStamps.push_back (Seconds ((1.0 + i * 2.0) * 60));
+    }
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (55.3 * 60);       // 55.3 minutes
+  profile.dualFoilLifeTime = Seconds (33.2 * 60);   // 33.2 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C21
+  for (int i = 0; i < 50; i++)
+    {
+      loads.push_back (0.4947);
+      loads.push_back (0.628);
+      loads.push_back (0.0576);
+
+      timeStamps.push_back (Seconds ((0.0 + i * 3.0) * 60));
+      timeStamps.push_back (Seconds ((1.0 + i * 3.0) * 60));
+      timeStamps.push_back (Seconds ((2.0 + i * 3.0) * 60));
+    }
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (79.6 * 60);       // 79.6 minutes
+  profile.dualFoilLifeTime = Seconds (55.9 * 60);   // 55.9 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+
+  // C22
+  for (int i = 0; i < 150; i++)
+    {
+      loads.push_back (0.005 + 0.005 * i);
+      timeStamps.push_back (Seconds ((0.0 + i * 1.0) * 60));
+    }
+
+  profile.loads = loads;
+  profile.timeStamps = timeStamps;
+  profile.itsyLifetime = Seconds (112.2 * 60);      // 112.2 minutes
+  profile.dualFoilLifeTime = Seconds (94.5 * 60);   // 94.5 minutes
+
+  m_loadProfiles.push_back (profile);
+
+  loads.clear ();
+  timeStamps.clear ();
+}
+
+int
+main (int argc, char **argv)
+{
+  NS_LOG_DEBUG ("Constant load run.");
+
+  BatteryLifetimeTest test;
+  int ret = 0;
+
+  if (test.ConstantLoadTest (0.640, Seconds (2844.0)))
+    {
+      ret = 1;
+      std::cerr << "Problems with constant load test (640mA)." << std::endl;
+    }
+  if (test.ConstantLoadTest (0.320, Seconds (6146.0)))
+    {
+      ret = 1;
+      std::cerr << "Problems with constant load test (320mA)." << std::endl;
+    }
+  if (test.ConstantLoadTest (0.128, Seconds (16052.0)))
+    {
+      ret = 1;
+      std::cerr << "Problems with constant load test (128mA)." << std::endl;
+    }
+  if (test.ConstantLoadTest (0.064, Seconds (32561.0)))
+    {
+      ret = 1;
+      std::cerr << "Problems with constant load test (64mA)." << std::endl;
+    }
+  if (test.ConstantLoadTest (0.032, Seconds (65580.0)))
+    {
+      ret = 1;
+      std::cerr << "Problems with constant load test (32mA)." << std::endl;
+    }
+
+  // create load profiles for variable load test
+  test.CreateLoadProfiles ();
+
+  // variable load with Itsy battery
+  NS_LOG_DEBUG ("\n\nItsy");
+  test.m_alpha = 35220;
+  test.m_beta = 0.637;
+  for (uint32_t i = 0; i < test.m_loadProfiles.size (); i++)
+    {
+      NS_LOG_DEBUG ("========");
+      NS_LOG_DEBUG ("Variable load profile C" << i + 1);
+      if (test.VariableLoadTest (test.m_loadProfiles[i].loads,
+                                 test.m_loadProfiles[i].timeStamps,
+                                 test.m_loadProfiles[i].itsyLifetime))
+        {
+          ret = 1;
+          std::cerr << "Problems with variable load test (Itsy)." << std::endl;
+        }
+    }
+
+  // variable load with DUALFOIL battery
+  NS_LOG_DEBUG ("\n\nDUALFOIL");
+  test.m_alpha = 40027;
+  test.m_beta = 0.276;
+  for (uint32_t i = 0; i < test.m_loadProfiles.size (); i++)
+    {
+      NS_LOG_DEBUG ("========");
+      NS_LOG_DEBUG ("Variable load profile C" << i + 1);
+      if (test.VariableLoadTest (test.m_loadProfiles[i].loads,
+                                 test.m_loadProfiles[i].timeStamps,
+                                 test.m_loadProfiles[i].dualFoilLifeTime))
+        {
+          ret = 1;
+          std::cerr << "Problems with variable load test (DUALFOIL)." << std::endl;
+        }
+    }
+
+  return ret;
+}
+
+bool
+BatteryLifetimeTest::ConstantLoadTest (double load, Time expLifetime)
+{
+  // create single node
+  NodeContainer c;
+  c.Create (1);
+
+  std::string phyMode ("DsssRate1Mbps");
+
+  // disable fragmentation for frames below 2200 bytes
+  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold",
+                      StringValue ("2200"));
+  // turn off RTS/CTS for frames below 2200 bytes
+  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold",
+                      StringValue ("2200"));
+  // Fix non-unicast data rate to be the same as that of unicast
+  Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode",
+                      StringValue (phyMode));
+
+  // install YansWifiPhy
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
+
+  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
+  /*
+   * This is one parameter that matters when using FixedRssLossModel, set it to
+   * zero; otherwise, gain will be added.
+   */
+  wifiPhy.Set ("RxGain", DoubleValue (0));
+  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
+  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
+
+  YansWifiChannelHelper wifiChannel;
+  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
+  wifiPhy.SetChannel (wifiChannel.Create ());
+
+  // Add a non-QoS upper MAC, and disable rate control
+  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                "DataMode", StringValue (phyMode),
+                                "ControlMode", StringValue (phyMode));
+  // Set it to ad-hoc mode
+  wifiMac.SetType ("ns3::AdhocWifiMac");
+  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
+
+  // Create and install battery model and device models
+  // RV battery model
+  RvBatteryModelHelper rvModelHelper;
+  // Set alpha & beta values
+  rvModelHelper.Set ("RvBatteryModelAlphaValue", DoubleValue (m_alpha));
+  rvModelHelper.Set ("RvBatteryModelBetaValue", DoubleValue (m_beta));
+  rvModelHelper.Set ("RvBatteryModelLowBatteryThreshold", DoubleValue (0.0));
+  // install source
+  EnergySourceContainer sources = rvModelHelper.Install (c);
+  // device energy model
+  WifiRadioEnergyModelHelper radioEnergyHelper;
+  // set VariableLoadTestIDLE current, which will be the constant load
+  radioEnergyHelper.Set ("IdleCurrentA", DoubleValue (load));
+  // install on node
+  DeviceEnergyModelContainer deviceModels = radioEnergyHelper.Install (devices, sources);
+
+  // run simulation
+  Simulator::Stop (Seconds (70000.0));
+  Simulator::Run ();
+
+  Time actualLifetime;
+  Ptr<RvBatteryModel> srcPtr = DynamicCast<RvBatteryModel> (sources.Get (0));
+  actualLifetime = srcPtr->GetLifetime ();
+
+  NS_LOG_DEBUG ("Expected lifetime = " << expLifetime.GetSeconds () << "s");
+  NS_LOG_DEBUG ("Actual lifetime = " << actualLifetime.GetSeconds () << "s");
+
+  Simulator::Destroy ();
+
+  if (actualLifetime != expLifetime)
+    {
+      std::cerr << "ConstantLoadTest: Incorrect lifetime for load " << load << std::endl;
+      return true;
+    }
+
+  return false; // error free
+}
+
+bool
+BatteryLifetimeTest::VariableLoadTest (std::vector<double> loads,
+                                       std::vector<Time> timeStamps,
+                                       Time expLifetime)
+{
+  NS_ASSERT (loads.size () == timeStamps.size ());
+
+  // create single node
+  NodeContainer c;
+  c.Create (1);
+
+  std::string phyMode ("DsssRate1Mbps");
+
+  // disable fragmentation for frames below 2200 bytes
+  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold",
+                      StringValue ("2200"));
+  // turn off RTS/CTS for frames below 2200 bytes
+  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold",
+                      StringValue ("2200"));
+  // Fix non-unicast data rate to be the same as that of unicast
+  Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode",
+                      StringValue (phyMode));
+
+  // install YansWifiPhy
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
+
+  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
+  /*
+   * This is one parameter that matters when using FixedRssLossModel, set it to
+   * zero; otherwise, gain will be added.
+   */
+  wifiPhy.Set ("RxGain", DoubleValue (0));
+  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
+  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
+
+  YansWifiChannelHelper wifiChannel;
+  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
+  wifiPhy.SetChannel (wifiChannel.Create ());
+
+  // Add a non-QoS upper MAC, and disable rate control
+  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                "DataMode", StringValue (phyMode),
+                                "ControlMode", StringValue (phyMode));
+  // Set it to ad-hoc mode
+  wifiMac.SetType ("ns3::AdhocWifiMac");
+  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
+
+  // Create and install battery model and device models
+  // RV battery model
+  RvBatteryModelHelper rvModelHelper;
+  // Set alpha & beta values
+  rvModelHelper.Set ("RvBatteryModelAlphaValue", DoubleValue (m_alpha));
+  rvModelHelper.Set ("RvBatteryModelBetaValue", DoubleValue (m_beta));
+  rvModelHelper.Set ("RvBatteryModelLowBatteryThreshold", DoubleValue (0.0));
+  // install source
+  EnergySourceContainer sources = rvModelHelper.Install (c);
+  // device energy model
+  WifiRadioEnergyModelHelper radioEnergyHelper;
+  // set VariableLoadTestIDLE current, which will be the constant load
+  radioEnergyHelper.Set ("IdleCurrentA", DoubleValue (loads[0]));
+  // install on node
+  DeviceEnergyModelContainer deviceModels = radioEnergyHelper.Install (devices, sources);
+
+
+  Ptr<WifiRadioEnergyModel> wifiDevicePtr = DynamicCast<WifiRadioEnergyModel> (deviceModels.Get (0));
+  // schedule load change events
+  for (uint32_t i = 1; i < loads.size (); i++)
+    {
+      Simulator::Schedule (timeStamps[i], &WifiRadioEnergyModel::SetIdleCurrentA,
+                           wifiDevicePtr, loads[i]);
+    }
+
+  // run simulation
+  Simulator::Stop (Seconds (70000.0));
+  Simulator::Run ();
+
+  Time actualLifetime;
+  Ptr<RvBatteryModel> srcPtr = DynamicCast<RvBatteryModel> (sources.Get (0));
+  actualLifetime = srcPtr->GetLifetime ();
+
+  NS_LOG_DEBUG ("Expected lifetime = " << expLifetime.GetSeconds () << "s");
+  NS_LOG_DEBUG ("Actual lifetime = " << actualLifetime.GetSeconds () << "s");
+  NS_LOG_DEBUG ("Difference = " << expLifetime.GetSeconds () - actualLifetime.GetSeconds () << "s");
+
+  Simulator::Destroy ();
+
+  // error tolerance = 120s
+  if ((actualLifetime.GetSeconds ()) > (expLifetime.GetSeconds ()) + (120) ||
+      (actualLifetime.GetSeconds ()) < (expLifetime.GetSeconds ()) - (120))
+    {
+      std::cerr << "VariableLoadTest: Incorrect lifetime." << std::endl;
+      return true;
+    }
+
+  return false;   // error free
+}
+
diff -Naur ns-3.23/src/energy/examples/wscript ns-3.24/src/energy/examples/wscript
--- ns-3.23/src/energy/examples/wscript	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/examples/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -6,3 +6,9 @@
 
     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 ns-3.23/src/energy/helper/wifi-radio-energy-model-helper.cc ns-3.24/src/energy/helper/wifi-radio-energy-model-helper.cc
--- ns-3.23/src/energy/helper/wifi-radio-energy-model-helper.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/helper/wifi-radio-energy-model-helper.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,143 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
- *
- * 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: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
- */
-
-#include "wifi-radio-energy-model-helper.h"
-#include "basic-energy-source-helper.h"
-#include "ns3/wifi-phy.h"
-#include "ns3/wifi-net-device.h"
-#include "ns3/config.h"
-#include "ns3/names.h"
-#include "ns3/wifi-tx-current-model.h"
-
-namespace ns3 {
-
-WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper ()
-{
-  m_radioEnergy.SetTypeId ("ns3::WifiRadioEnergyModel");
-  m_depletionCallback.Nullify ();
-  m_rechargedCallback.Nullify ();
-}
-
-WifiRadioEnergyModelHelper::~WifiRadioEnergyModelHelper ()
-{
-}
-
-void
-WifiRadioEnergyModelHelper::Set (std::string name, const AttributeValue &v)
-{
-  m_radioEnergy.Set (name, v);
-}
-
-void
-WifiRadioEnergyModelHelper::SetDepletionCallback (
-  WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback)
-{
-  m_depletionCallback = callback;
-}
-
-void
-WifiRadioEnergyModelHelper::SetRechargedCallback (
-  WifiRadioEnergyModel::WifiRadioEnergyRechargedCallback callback)
-{
-  m_rechargedCallback = callback;
-}
-
-void
-WifiRadioEnergyModelHelper::SetTxCurrentModel (std::string name,
-                                               std::string n0, const AttributeValue& v0,
-                                               std::string n1, const AttributeValue& v1,
-                                               std::string n2, const AttributeValue& v2,
-                                               std::string n3, const AttributeValue& v3,
-                                               std::string n4, const AttributeValue& v4,
-                                               std::string n5, const AttributeValue& v5,
-                                               std::string n6, const AttributeValue& v6,
-                                               std::string n7, const AttributeValue& v7)
-{
-  ObjectFactory factory;
-  factory.SetTypeId (name);
-  factory.Set (n0, v0);
-  factory.Set (n1, v1);
-  factory.Set (n2, v2);
-  factory.Set (n3, v3);
-  factory.Set (n4, v4);
-  factory.Set (n5, v5);
-  factory.Set (n6, v6);
-  factory.Set (n7, v7);
-  m_txCurrentModel = factory;
-}
-
-
-/*
- * Private function starts here.
- */
-
-Ptr<DeviceEnergyModel>
-WifiRadioEnergyModelHelper::DoInstall (Ptr<NetDevice> device,
-                                       Ptr<EnergySource> source) const
-{
-  NS_ASSERT (device != NULL);
-  NS_ASSERT (source != NULL);
-  // check if device is WifiNetDevice
-  std::string deviceName = device->GetInstanceTypeId ().GetName ();
-  if (deviceName.compare ("ns3::WifiNetDevice") != 0)
-    {
-      NS_FATAL_ERROR ("NetDevice type is not WifiNetDevice!");
-    }
-  Ptr<Node> node = device->GetNode ();
-  Ptr<WifiRadioEnergyModel> model = m_radioEnergy.Create ()->GetObject<WifiRadioEnergyModel> ();
-  NS_ASSERT (model != NULL);
-  // set energy source pointer
-  model->SetEnergySource (source);
-  // set energy depletion callback
-  // if none is specified, make a callback to WifiPhy::SetSleepMode
-  Ptr<WifiNetDevice> wifiDevice = DynamicCast<WifiNetDevice> (device);
-  Ptr<WifiPhy> wifiPhy = wifiDevice->GetPhy ();
-  if (m_depletionCallback.IsNull ())
-    {
-      model->SetEnergyDepletionCallback (MakeCallback (&WifiPhy::SetSleepMode, wifiPhy));
-    }
-  else
-    {
-      model->SetEnergyDepletionCallback (m_depletionCallback);
-    }
-  // set energy recharged callback
-  // if none is specified, make a callback to WifiPhy::ResumeFromSleep
-  if (m_rechargedCallback.IsNull ())
-    {
-      model->SetEnergyRechargedCallback (MakeCallback (&WifiPhy::ResumeFromSleep, wifiPhy));
-    }
-  else
-    {
-      model->SetEnergyRechargedCallback (m_rechargedCallback);
-    }
-  // add model to device model list in energy source
-  source->AppendDeviceEnergyModel (model);
-  // create and register energy model phy listener
-  wifiPhy->RegisterListener (model->GetPhyListener ());
-  //
-  if (m_txCurrentModel.GetTypeId ().GetUid ())
-    {
-      Ptr<WifiTxCurrentModel> txcurrent = m_txCurrentModel.Create<WifiTxCurrentModel> ();
-      model->SetTxCurrentModel (txcurrent);
-    }
-  return model;
-}
-
-} // namespace ns3
diff -Naur ns-3.23/src/energy/helper/wifi-radio-energy-model-helper.h ns-3.24/src/energy/helper/wifi-radio-energy-model-helper.h
--- ns-3.23/src/energy/helper/wifi-radio-energy-model-helper.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/helper/wifi-radio-energy-model-helper.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,124 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
-* Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
-*
-* 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: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
-*/
-
-#ifndef WIFI_RADIO_ENERGY_MODEL_HELPER_H
-#define WIFI_RADIO_ENERGY_MODEL_HELPER_H
-
-#include "energy-model-helper.h"
-#include "ns3/wifi-radio-energy-model.h"
-
-namespace ns3 {
-
-/**
- * \ingroup energy
- * \brief Assign WifiRadioEnergyModel to wifi devices.
- *
- * This installer installs WifiRadioEnergyModel for only WifiNetDevice objects.
- *
- */
-class WifiRadioEnergyModelHelper : public DeviceEnergyModelHelper
-{
-public:
-  /**
-   * Construct a helper which is used to add a radio energy model to a node
-   */
-  WifiRadioEnergyModelHelper ();
-
-  /**
-   * Destroy a RadioEnergy Helper
-   */
-  ~WifiRadioEnergyModelHelper ();
-
-  /**
-   * \param name the name of the attribute to set
-   * \param v the value of the attribute
-   *
-   * Sets an attribute of the underlying PHY object.
-   */
-  void Set (std::string name, const AttributeValue &v);
-
-  /**
-   * \param callback Callback function for energy depletion handling.
-   *
-   * Sets the callback to be invoked when energy is depleted.
-   */
-  void SetDepletionCallback (
-    WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback);
-
-  /**
-   * \param callback Callback function for energy recharged handling.
-   *
-   * Sets the callback to be invoked when energy is recharged.
-   */
-  void SetRechargedCallback (
-    WifiRadioEnergyModel::WifiRadioEnergyRechargedCallback callback);
-
-  /**
-   * \param name the name of the model to set
-   * \param n0 the name of the attribute to set
-   * \param v0 the value of the attribute to set
-   * \param n1 the name of the attribute to set
-   * \param v1 the value of the attribute to set
-   * \param n2 the name of the attribute to set
-   * \param v2 the value of the attribute to set
-   * \param n3 the name of the attribute to set
-   * \param v3 the value of the attribute to set
-   * \param n4 the name of the attribute to set
-   * \param v4 the value of the attribute to set
-   * \param n5 the name of the attribute to set
-   * \param v5 the value of the attribute to set
-   * \param n6 the name of the attribute to set
-   * \param v6 the value of the attribute to set
-   * \param n7 the name of the attribute to set
-   * \param v7 the value of the attribute to set
-   *
-   * Configure a propagation delay for this channel.
-   */
-  void SetTxCurrentModel (std::string name,
-                          std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
-                          std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
-                          std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
-                          std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue (),
-                          std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
-                          std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
-                          std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
-                          std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
-
-private:
-  /**
-   * \param device Pointer to the NetDevice to install DeviceEnergyModel.
-   * \param source Pointer to EnergySource to install.
-   *
-   * Implements DeviceEnergyModel::Install.
-   */
-  virtual Ptr<DeviceEnergyModel> DoInstall (Ptr<NetDevice> device,
-                                            Ptr<EnergySource> source) const;
-
-private:
-  ObjectFactory m_radioEnergy;
-  WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback m_depletionCallback;
-  WifiRadioEnergyModel::WifiRadioEnergyRechargedCallback m_rechargedCallback;
-  ObjectFactory m_txCurrentModel;
-
-};
-
-} // namespace ns3
-
-#endif /* WIFI_RADIO_ENERGY_MODEL_HELPER_H */
diff -Naur ns-3.23/src/energy/model/basic-energy-harvester.cc ns-3.24/src/energy/model/basic-energy-harvester.cc
--- ns-3.23/src/energy/model/basic-energy-harvester.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/model/basic-energy-harvester.cc	2015-09-15 11:18:44.000000000 -0700
@@ -55,11 +55,11 @@
   .AddTraceSource ("HarvestedPower",
                    "Harvested power by the BasicEnergyHarvester.",
                    MakeTraceSourceAccessor (&BasicEnergyHarvester::m_harvestedPower),
-                   "ns3::TracedValue::DoubleCallback")
+                   "ns3::TracedValueCallback::Double")
   .AddTraceSource ("TotalEnergyHarvested",
                    "Total energy harvested by the harvester.",
                    MakeTraceSourceAccessor (&BasicEnergyHarvester::m_totalEnergyHarvestedJ),
-                   "ns3::TracedValue::DoubleCallback")
+                   "ns3::TracedValueCallback::Double")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/energy/model/basic-energy-source.cc ns-3.24/src/energy/model/basic-energy-source.cc
--- ns-3.23/src/energy/model/basic-energy-source.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/model/basic-energy-source.cc	2015-09-15 11:18:44.000000000 -0700
@@ -69,7 +69,7 @@
     .AddTraceSource ("RemainingEnergy",
                      "Remaining energy at BasicEnergySource.",
                      MakeTraceSourceAccessor (&BasicEnergySource::m_remainingEnergyJ),
-                     "ns3::TracedValue::DoubleCallback")
+                     "ns3::TracedValueCallback::Double")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/energy/model/li-ion-energy-source.cc ns-3.24/src/energy/model/li-ion-energy-source.cc
--- ns-3.23/src/energy/model/li-ion-energy-source.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/model/li-ion-energy-source.cc	2015-09-15 11:18:44.000000000 -0700
@@ -106,7 +106,7 @@
     .AddTraceSource ("RemainingEnergy",
                      "Remaining energy at BasicEnergySource.",
                      MakeTraceSourceAccessor (&LiIonEnergySource::m_remainingEnergyJ),
-                     "ns3::TracedValue::DoubleCallback")
+                     "ns3::TracedValueCallback::Double")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/energy/model/rv-battery-model.cc ns-3.24/src/energy/model/rv-battery-model.cc
--- ns-3.23/src/energy/model/rv-battery-model.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/model/rv-battery-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -83,7 +83,7 @@
     .AddTraceSource ("RvBatteryModelBatteryLevel",
                      "RV battery model battery level.",
                      MakeTraceSourceAccessor (&RvBatteryModel::m_batteryLevel),
-                     "ns3::TracedValue::DoubleCallback")
+                     "ns3::TracedValueCallback::Double")
     .AddTraceSource ("RvBatteryModelBatteryLifetime",
                      "RV battery model battery lifetime.",
                      MakeTraceSourceAccessor (&RvBatteryModel::m_lifetime),
diff -Naur ns-3.23/src/energy/model/simple-device-energy-model.cc ns-3.24/src/energy/model/simple-device-energy-model.cc
--- ns-3.23/src/energy/model/simple-device-energy-model.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/model/simple-device-energy-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -40,7 +40,7 @@
     .AddTraceSource ("TotalEnergyConsumption",
                      "Total energy consumption of the radio device.",
                      MakeTraceSourceAccessor (&SimpleDeviceEnergyModel::m_totalEnergyConsumption),
-                     "ns3::TracedValue::DoubleCallback")
+                     "ns3::TracedValueCallback::Double")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/energy/model/wifi-radio-energy-model.cc ns-3.24/src/energy/model/wifi-radio-energy-model.cc
--- ns-3.23/src/energy/model/wifi-radio-energy-model.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/model/wifi-radio-energy-model.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,572 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
- *
- * 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: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
- */
-
-#include "ns3/log.h"
-#include "ns3/double.h"
-#include "ns3/simulator.h"
-#include "ns3/trace-source-accessor.h"
-#include "ns3/pointer.h"
-#include "energy-source.h"
-#include "wifi-radio-energy-model.h"
-#include "wifi-tx-current-model.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("WifiRadioEnergyModel");
-
-NS_OBJECT_ENSURE_REGISTERED (WifiRadioEnergyModel);
-
-TypeId
-WifiRadioEnergyModel::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::WifiRadioEnergyModel")
-    .SetParent<DeviceEnergyModel> ()
-    .SetGroupName ("Energy")
-    .AddConstructor<WifiRadioEnergyModel> ()
-    .AddAttribute ("IdleCurrentA",
-                   "The default radio Idle current in Ampere.",
-                   DoubleValue (0.273),  // idle mode = 273mA
-                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetIdleCurrentA,
-                                       &WifiRadioEnergyModel::GetIdleCurrentA),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("CcaBusyCurrentA",
-                   "The default radio CCA Busy State current in Ampere.",
-                   DoubleValue (0.273),  // default to be the same as idle mode
-                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetCcaBusyCurrentA,
-                                       &WifiRadioEnergyModel::GetCcaBusyCurrentA),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("TxCurrentA",
-                   "The radio Tx current in Ampere.",
-                   DoubleValue (0.380),    // transmit at 0dBm = 380mA
-                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetTxCurrentA,
-                                       &WifiRadioEnergyModel::GetTxCurrentA),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("RxCurrentA",
-                   "The radio Rx current in Ampere.",
-                   DoubleValue (0.313),    // receive mode = 313mA
-                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetRxCurrentA,
-                                       &WifiRadioEnergyModel::GetRxCurrentA),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("SwitchingCurrentA",
-                   "The default radio Channel Switch current in Ampere.",
-                   DoubleValue (0.273),  // default to be the same as idle mode
-                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetSwitchingCurrentA,
-                                       &WifiRadioEnergyModel::GetSwitchingCurrentA),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("SleepCurrentA",
-                   "The radio Sleep current in Ampere.",
-                   DoubleValue (0.033),  // sleep mode = 33mA
-                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetSleepCurrentA,
-                                       &WifiRadioEnergyModel::GetSleepCurrentA),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("TxCurrentModel", "A pointer to the attached tx current model.",
-                   PointerValue (),
-                   MakePointerAccessor (&WifiRadioEnergyModel::m_txCurrentModel),
-                   MakePointerChecker<WifiTxCurrentModel> ())
-    .AddTraceSource ("TotalEnergyConsumption",
-                     "Total energy consumption of the radio device.",
-                     MakeTraceSourceAccessor (&WifiRadioEnergyModel::m_totalEnergyConsumption),
-                     "ns3::TracedValue::DoubleCallback")
-  ; 
-  return tid;
-}
-
-WifiRadioEnergyModel::WifiRadioEnergyModel ()
-{
-  NS_LOG_FUNCTION (this);
-  m_currentState = WifiPhy::IDLE;  // initially IDLE
-  m_lastUpdateTime = Seconds (0.0);
-  m_nPendingChangeState = 0;
-  m_isSupersededChangeState = false;
-  m_energyDepletionCallback.Nullify ();
-  m_source = NULL;
-  // set callback for WifiPhy listener
-  m_listener = new WifiRadioEnergyModelPhyListener;
-  m_listener->SetChangeStateCallback (MakeCallback (&DeviceEnergyModel::ChangeState, this));
-  // set callback for updating the tx current
-  m_listener->SetUpdateTxCurrentCallback (MakeCallback (&WifiRadioEnergyModel::SetTxCurrentFromModel, this));
-}
-
-WifiRadioEnergyModel::~WifiRadioEnergyModel ()
-{
-  NS_LOG_FUNCTION (this);
-  delete m_listener;
-}
-
-void
-WifiRadioEnergyModel::SetEnergySource (Ptr<EnergySource> source)
-{
-  NS_LOG_FUNCTION (this << source);
-  NS_ASSERT (source != NULL);
-  m_source = source;
-}
-
-double
-WifiRadioEnergyModel::GetTotalEnergyConsumption (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_totalEnergyConsumption;
-}
-
-double
-WifiRadioEnergyModel::GetIdleCurrentA (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_idleCurrentA;
-}
-
-void
-WifiRadioEnergyModel::SetIdleCurrentA (double idleCurrentA)
-{
-  NS_LOG_FUNCTION (this << idleCurrentA);
-  m_idleCurrentA = idleCurrentA;
-}
-
-double
-WifiRadioEnergyModel::GetCcaBusyCurrentA (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_ccaBusyCurrentA;
-}
-
-void
-WifiRadioEnergyModel::SetCcaBusyCurrentA (double CcaBusyCurrentA)
-{
-  NS_LOG_FUNCTION (this << CcaBusyCurrentA);
-  m_ccaBusyCurrentA = CcaBusyCurrentA;
-}
-
-double
-WifiRadioEnergyModel::GetTxCurrentA (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_txCurrentA;
-}
-
-void
-WifiRadioEnergyModel::SetTxCurrentA (double txCurrentA)
-{
-  NS_LOG_FUNCTION (this << txCurrentA);
-  m_txCurrentA = txCurrentA;
-}
-
-double
-WifiRadioEnergyModel::GetRxCurrentA (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_rxCurrentA;
-}
-
-void
-WifiRadioEnergyModel::SetRxCurrentA (double rxCurrentA)
-{
-  NS_LOG_FUNCTION (this << rxCurrentA);
-  m_rxCurrentA = rxCurrentA;
-}
-
-double
-WifiRadioEnergyModel::GetSwitchingCurrentA (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_switchingCurrentA;
-}
-
-void
-WifiRadioEnergyModel::SetSwitchingCurrentA (double switchingCurrentA)
-{
-  NS_LOG_FUNCTION (this << switchingCurrentA);
-  m_switchingCurrentA = switchingCurrentA;
-}
-
-double
-WifiRadioEnergyModel::GetSleepCurrentA (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_sleepCurrentA;
-}
-
-void
-WifiRadioEnergyModel::SetSleepCurrentA (double sleepCurrentA)
-{
-  NS_LOG_FUNCTION (this << sleepCurrentA);
-  m_sleepCurrentA = sleepCurrentA;
-}
-
-WifiPhy::State
-WifiRadioEnergyModel::GetCurrentState (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_currentState;
-}
-
-void
-WifiRadioEnergyModel::SetEnergyDepletionCallback (
-  WifiRadioEnergyDepletionCallback callback)
-{
-  NS_LOG_FUNCTION (this);
-  if (callback.IsNull ())
-    {
-      NS_LOG_DEBUG ("WifiRadioEnergyModel:Setting NULL energy depletion callback!");
-    }
-  m_energyDepletionCallback = callback;
-}
-
-void
-WifiRadioEnergyModel::SetEnergyRechargedCallback (
-  WifiRadioEnergyRechargedCallback callback)
-{
-  NS_LOG_FUNCTION (this);
-  if (callback.IsNull ())
-    {
-      NS_LOG_DEBUG ("WifiRadioEnergyModel:Setting NULL energy recharged callback!");
-    }
-  m_energyRechargedCallback = callback;
-}
-
-void
-WifiRadioEnergyModel::SetTxCurrentModel (Ptr<WifiTxCurrentModel> model)
-{
-  m_txCurrentModel = model;
-}
-
-void
-WifiRadioEnergyModel::SetTxCurrentFromModel (double txPowerDbm)
-{
-  if (m_txCurrentModel)
-    {
-      m_txCurrentA = m_txCurrentModel->CalcTxCurrent (txPowerDbm);
-    }
-}
-
-void
-WifiRadioEnergyModel::ChangeState (int newState)
-{
-  NS_LOG_FUNCTION (this << newState);
-
-  Time duration = Simulator::Now () - m_lastUpdateTime;
-  NS_ASSERT (duration.GetNanoSeconds () >= 0); // check if duration is valid
-
-  // energy to decrease = current * voltage * time
-  double energyToDecrease = 0.0;
-  double supplyVoltage = m_source->GetSupplyVoltage ();
-  switch (m_currentState)
-    {
-    case WifiPhy::IDLE:
-      energyToDecrease = duration.GetSeconds () * m_idleCurrentA * supplyVoltage;
-      break;
-    case WifiPhy::CCA_BUSY:
-      energyToDecrease = duration.GetSeconds () * m_ccaBusyCurrentA * supplyVoltage;
-      break;
-    case WifiPhy::TX:
-      energyToDecrease = duration.GetSeconds () * m_txCurrentA * supplyVoltage;
-      break;
-    case WifiPhy::RX:
-      energyToDecrease = duration.GetSeconds () * m_rxCurrentA * supplyVoltage;
-      break;
-    case WifiPhy::SWITCHING:
-      energyToDecrease = duration.GetSeconds () * m_switchingCurrentA * supplyVoltage;
-      break;
-    case WifiPhy::SLEEP:
-      energyToDecrease = duration.GetSeconds () * m_sleepCurrentA * supplyVoltage;
-      break;
-    default:
-      NS_FATAL_ERROR ("WifiRadioEnergyModel:Undefined radio state: " << m_currentState);
-    }
-
-  // update total energy consumption
-  m_totalEnergyConsumption += energyToDecrease;
-
-  // update last update time stamp
-  m_lastUpdateTime = Simulator::Now ();
-
-  m_nPendingChangeState++;
-
-  // notify energy source
-  m_source->UpdateEnergySource ();
-
-  // in case the energy source is found to be depleted during the last update, a callback might be
-  // invoked that might cause a change in the Wifi PHY state (e.g., the PHY is put into SLEEP mode).
-  // This in turn causes a new call to this member function, with the consequence that the previous
-  // instance is resumed after the termination of the new instance. In particular, the state set
-  // by the previous instance is erroneously the final state stored in m_currentState. The check below
-  // ensures that previous instances do not change m_currentState.
-
-  if (!m_isSupersededChangeState)
-    {
-      // update current state & last update time stamp
-      SetWifiRadioState ((WifiPhy::State) newState);
-
-      // some debug message
-      NS_LOG_DEBUG ("WifiRadioEnergyModel:Total energy consumption is " <<
-                    m_totalEnergyConsumption << "J");
-    }
-
-  m_isSupersededChangeState = (m_nPendingChangeState > 1);
-
-  m_nPendingChangeState--;
-}
-
-void
-WifiRadioEnergyModel::HandleEnergyDepletion (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("WifiRadioEnergyModel:Energy is depleted!");
-  // invoke energy depletion callback, if set.
-  if (!m_energyDepletionCallback.IsNull ())
-    {
-      m_energyDepletionCallback ();
-    }
-}
-
-void
-WifiRadioEnergyModel::HandleEnergyRecharged (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("WifiRadioEnergyModel:Energy is recharged!");
-  // invoke energy recharged callback, if set.
-  if (!m_energyRechargedCallback.IsNull ())
-    {
-      m_energyRechargedCallback ();
-    }
-}
-
-WifiRadioEnergyModelPhyListener *
-WifiRadioEnergyModel::GetPhyListener (void)
-{
-  NS_LOG_FUNCTION (this);
-  return m_listener;
-}
-
-/*
- * Private functions start here.
- */
-
-void
-WifiRadioEnergyModel::DoDispose (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_source = NULL;
-  m_energyDepletionCallback.Nullify ();
-}
-
-double
-WifiRadioEnergyModel::DoGetCurrentA (void) const
-{
-  NS_LOG_FUNCTION (this);
-  switch (m_currentState)
-    {
-    case WifiPhy::IDLE:
-      return m_idleCurrentA;
-    case WifiPhy::CCA_BUSY:
-      return m_ccaBusyCurrentA;
-    case WifiPhy::TX:
-      return m_txCurrentA;
-    case WifiPhy::RX:
-      return m_rxCurrentA;
-    case WifiPhy::SWITCHING:
-      return m_switchingCurrentA;
-    case WifiPhy::SLEEP:
-      return m_sleepCurrentA;
-    default:
-      NS_FATAL_ERROR ("WifiRadioEnergyModel:Undefined radio state:" << m_currentState);
-    }
-}
-
-void
-WifiRadioEnergyModel::SetWifiRadioState (const WifiPhy::State state)
-{
-  NS_LOG_FUNCTION (this << state);
-  m_currentState = state;
-  std::string stateName;
-  switch (state)
-    {
-    case WifiPhy::IDLE:
-      stateName = "IDLE";
-      break;
-    case WifiPhy::CCA_BUSY:
-      stateName = "CCA_BUSY";
-      break;
-    case WifiPhy::TX:
-      stateName = "TX";
-      break;
-    case WifiPhy::RX:
-      stateName = "RX";
-      break;
-    case WifiPhy::SWITCHING:
-      stateName = "SWITCHING";
-      break;
-    case WifiPhy::SLEEP:
-      stateName = "SLEEP";
-      break;
-    }
-  NS_LOG_DEBUG ("WifiRadioEnergyModel:Switching to state: " << stateName <<
-                " at time = " << Simulator::Now ());
-}
-
-// -------------------------------------------------------------------------- //
-
-WifiRadioEnergyModelPhyListener::WifiRadioEnergyModelPhyListener ()
-{
-  NS_LOG_FUNCTION (this);
-  m_changeStateCallback.Nullify ();
-  m_updateTxCurrentCallback.Nullify ();
-}
-
-WifiRadioEnergyModelPhyListener::~WifiRadioEnergyModelPhyListener ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-WifiRadioEnergyModelPhyListener::SetChangeStateCallback (DeviceEnergyModel::ChangeStateCallback callback)
-{
-  NS_LOG_FUNCTION (this << &callback);
-  NS_ASSERT (!callback.IsNull ());
-  m_changeStateCallback = callback;
-}
-
-void
-WifiRadioEnergyModelPhyListener::SetUpdateTxCurrentCallback (UpdateTxCurrentCallback callback)
-{
-  NS_LOG_FUNCTION (this << &callback);
-  NS_ASSERT (!callback.IsNull ());
-  m_updateTxCurrentCallback = callback;
-}
-
-void
-WifiRadioEnergyModelPhyListener::NotifyRxStart (Time duration)
-{
-  NS_LOG_FUNCTION (this << duration);
-  if (m_changeStateCallback.IsNull ())
-    {
-      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
-    }
-  m_changeStateCallback (WifiPhy::RX);
-  m_switchToIdleEvent.Cancel ();
-}
-
-void
-WifiRadioEnergyModelPhyListener::NotifyRxEndOk (void)
-{
-  NS_LOG_FUNCTION (this);
-  if (m_changeStateCallback.IsNull ())
-    {
-      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
-    }
-  m_changeStateCallback (WifiPhy::IDLE);
-}
-
-void
-WifiRadioEnergyModelPhyListener::NotifyRxEndError (void)
-{
-  NS_LOG_FUNCTION (this);
-  if (m_changeStateCallback.IsNull ())
-    {
-      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
-    }
-  m_changeStateCallback (WifiPhy::IDLE);
-}
-
-void
-WifiRadioEnergyModelPhyListener::NotifyTxStart (Time duration, double txPowerDbm)
-{
-  NS_LOG_FUNCTION (this << duration << txPowerDbm);
-  if (m_updateTxCurrentCallback.IsNull ())
-    {
-      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Update tx current callback not set!");
-    }
-  m_updateTxCurrentCallback (txPowerDbm);
-  if (m_changeStateCallback.IsNull ())
-    {
-      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
-    }
-  m_changeStateCallback (WifiPhy::TX);
-  // schedule changing state back to IDLE after TX duration
-  m_switchToIdleEvent.Cancel ();
-  m_switchToIdleEvent = Simulator::Schedule (duration, &WifiRadioEnergyModelPhyListener::SwitchToIdle, this);
-}
-
-void
-WifiRadioEnergyModelPhyListener::NotifyMaybeCcaBusyStart (Time duration)
-{
-  NS_LOG_FUNCTION (this << duration);
-  if (m_changeStateCallback.IsNull ())
-    {
-      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
-    }
-  m_changeStateCallback (WifiPhy::CCA_BUSY);
-  // schedule changing state back to IDLE after CCA_BUSY duration
-  m_switchToIdleEvent.Cancel ();
-  m_switchToIdleEvent = Simulator::Schedule (duration, &WifiRadioEnergyModelPhyListener::SwitchToIdle, this);
-}
-
-void
-WifiRadioEnergyModelPhyListener::NotifySwitchingStart (Time duration)
-{
-  NS_LOG_FUNCTION (this << duration);
-  if (m_changeStateCallback.IsNull ())
-    {
-      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
-    }
-  m_changeStateCallback (WifiPhy::SWITCHING);
-  // schedule changing state back to IDLE after CCA_BUSY duration
-  m_switchToIdleEvent.Cancel ();
-  m_switchToIdleEvent = Simulator::Schedule (duration, &WifiRadioEnergyModelPhyListener::SwitchToIdle, this);
-}
-
-void
-WifiRadioEnergyModelPhyListener::NotifySleep (void)
-{
-  NS_LOG_FUNCTION (this);
-  if (m_changeStateCallback.IsNull ())
-    {
-      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
-    }
-  m_changeStateCallback (WifiPhy::SLEEP);
-  m_switchToIdleEvent.Cancel ();
-}
-
-void
-WifiRadioEnergyModelPhyListener::NotifyWakeup(void)
-{
-  NS_LOG_FUNCTION (this);
-  if (m_changeStateCallback.IsNull ())
-    {
-      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
-    }
-  m_changeStateCallback (WifiPhy::IDLE);
-}
-
-/*
- * Private function state here.
- */
-
-void
-WifiRadioEnergyModelPhyListener::SwitchToIdle (void)
-{
-  NS_LOG_FUNCTION (this);
-  if (m_changeStateCallback.IsNull ())
-    {
-      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
-    }
-  m_changeStateCallback (WifiPhy::IDLE);
-}
-
-} // namespace ns3
diff -Naur ns-3.23/src/energy/model/wifi-radio-energy-model.h ns-3.24/src/energy/model/wifi-radio-energy-model.h
--- ns-3.23/src/energy/model/wifi-radio-energy-model.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/model/wifi-radio-energy-model.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,363 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
- *
- * 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: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
- */
-
-#ifndef WIFI_RADIO_ENERGY_MODEL_H
-#define WIFI_RADIO_ENERGY_MODEL_H
-
-#include "ns3/device-energy-model.h"
-#include "ns3/nstime.h"
-#include "ns3/event-id.h"
-#include "ns3/traced-value.h"
-#include "ns3/wifi-phy.h"
-
-namespace ns3 {
-
-class WifiTxCurrentModel;
-
-/**
- * \ingroup energy
- * A WifiPhy listener class for notifying the WifiRadioEnergyModel of Wifi radio
- * state change.
- *
- */
-class WifiRadioEnergyModelPhyListener : public WifiPhyListener
-{
-public:
-  /**
-   * Callback type for updating the transmit current based on the nominal tx power.
-   */
-  typedef Callback<void, double> UpdateTxCurrentCallback;
-
-  WifiRadioEnergyModelPhyListener ();
-  virtual ~WifiRadioEnergyModelPhyListener ();
-
-  /**
-   * \brief Sets the change state callback. Used by helper class.
-   *
-   * \param callback Change state callback.
-   */
-  void SetChangeStateCallback (DeviceEnergyModel::ChangeStateCallback callback);
-
-  /**
-   * \brief Sets the update tx current callback.
-   *
-   * \param callback Update tx current callback.
-   */
-  void SetUpdateTxCurrentCallback (UpdateTxCurrentCallback callback);
-
-  /**
-   * \brief Switches the WifiRadioEnergyModel to RX state.
-   *
-   * \param duration the expected duration of the packet reception.
-   *
-   * Defined in ns3::WifiPhyListener
-   */
-  virtual void NotifyRxStart (Time duration);
-
-  /**
-   * \brief Switches the WifiRadioEnergyModel back to IDLE state.
-   *
-   * Defined in ns3::WifiPhyListener
-   *
-   * Note that for the WifiRadioEnergyModel, the behavior of the function is the
-   * same as NotifyRxEndError.
-   */
-  virtual void NotifyRxEndOk (void);
-
-  /**
-   * \brief Switches the WifiRadioEnergyModel back to IDLE state.
-   *
-   * Defined in ns3::WifiPhyListener
-   *
-   * Note that for the WifiRadioEnergyModel, the behavior of the function is the
-   * same as NotifyRxEndOk.
-   */
-  virtual void NotifyRxEndError (void);
-
-  /**
-   * \brief Switches the WifiRadioEnergyModel to TX state and switches back to
-   * IDLE after TX duration.
-   *
-   * \param duration the expected transmission duration.
-   * \param txPowerDbm the nominal tx power in dBm
-   *
-   * Defined in ns3::WifiPhyListener
-   */
-  virtual void NotifyTxStart (Time duration, double txPowerDbm);
-
-  /**
-   * \param duration the expected busy duration.
-   *
-   * Defined in ns3::WifiPhyListener
-   */
-  virtual void NotifyMaybeCcaBusyStart (Time duration);
-
-  /**
-   * \param duration the expected channel switching duration.
-   *
-   * Defined in ns3::WifiPhyListener
-   */
-  virtual void NotifySwitchingStart (Time duration);
-
-  /**
-   * Defined in ns3::WifiPhyListener
-   */
-  virtual void NotifySleep (void);
-
-  /**
-   * Defined in ns3::WifiPhyListener
-   */
-  virtual void NotifyWakeup (void);
-
-private:
-  /**
-   * A helper function that makes scheduling m_changeStateCallback possible.
-   */
-  void SwitchToIdle (void);
-
-private:
-  /**
-   * Change state callback used to notify the WifiRadioEnergyModel of a state
-   * change.
-   */
-  DeviceEnergyModel::ChangeStateCallback m_changeStateCallback;
-
-  /**
-   * Callback used to update the tx current stored in WifiRadioEnergyModel based on 
-   * the nominal tx power used to transmit the current frame.
-   */
-  UpdateTxCurrentCallback m_updateTxCurrentCallback;
-
-  EventId m_switchToIdleEvent;
-};
-
-// -------------------------------------------------------------------------- //
-
-/**
- * \ingroup energy
- * \brief A WiFi radio energy model.
- * 
- * 4 states are defined for the radio: TX, RX, IDLE, SLEEP. Default state is
- * IDLE.
- * The different types of transactions that are defined are: 
- *  1. Tx: State goes from IDLE to TX, radio is in TX state for TX_duration,
- *     then state goes from TX to IDLE.
- *  2. Rx: State goes from IDLE to RX, radio is in RX state for RX_duration,
- *     then state goes from RX to IDLE.
- *  3. Go_to_Sleep: State goes from IDLE to SLEEP.
- *  4. End_of_Sleep: State goes from SLEEP to IDLE.
- * The class keeps track of what state the radio is currently in.
- *
- * Energy calculation: For each transaction, this model notifies EnergySource
- * object. The EnergySource object will query this model for the total current.
- * Then the EnergySource object uses the total current to calculate energy.
- *
- * Default values for power consumption are based on measurements reported in:
- * 
- * Daniel Halperin, Ben Greenstein, Anmol Sheth, David Wetherall,
- * "Demystifying 802.11n power consumption", Proceedings of HotPower'10 
- * 
- * Power consumption in Watts (single antenna):
- * 
- * \f$ P_{tx} = 1.14 \f$ (transmit at 0dBm)
- * 
- * \f$ P_{rx} = 0.94 \f$
- * 
- * \f$ P_{idle} = 0.82 \f$
- * 
- * \f$ P_{sleep} = 0.10 \f$
- * 
- * Hence, considering the default supply voltage of 3.0 V for the basic energy
- * source, the default current values in Ampere are:
- * 
- * \f$ I_{tx} = 0.380 \f$
- * 
- * \f$ I_{rx} = 0.313 \f$
- * 
- * \f$ I_{idle} = 0.273 \f$
- * 
- * \f$ I_{sleep} = 0.033 \f$
- * 
- * The dependence of the power consumption in transmission mode on the nominal
- * transmit power can also be achieved through a wifi tx current model.
- *
- */
-class WifiRadioEnergyModel : public DeviceEnergyModel
-{
-public:
-  /**
-   * Callback type for energy depletion handling.
-   */
-  typedef Callback<void> WifiRadioEnergyDepletionCallback;
-
-  /**
-   * Callback type for energy recharged handling.
-   */
-  typedef Callback<void> WifiRadioEnergyRechargedCallback;
-
-public:
-  static TypeId GetTypeId (void);
-  WifiRadioEnergyModel ();
-  virtual ~WifiRadioEnergyModel ();
-
-  /**
-   * \brief Sets pointer to EnergySouce installed on node.
-   *
-   * \param source Pointer to EnergySource installed on node.
-   *
-   * Implements DeviceEnergyModel::SetEnergySource.
-   */
-  virtual void SetEnergySource (Ptr<EnergySource> source);
-
-  /**
-   * \returns Total energy consumption of the wifi device.
-   *
-   * Implements DeviceEnergyModel::GetTotalEnergyConsumption.
-   */
-  virtual double GetTotalEnergyConsumption (void) const;
-
-  // Setter & getters for state power consumption.
-  double GetIdleCurrentA (void) const;
-  void SetIdleCurrentA (double idleCurrentA);
-  double GetCcaBusyCurrentA (void) const;
-  void SetCcaBusyCurrentA (double ccaBusyCurrentA);
-  double GetTxCurrentA (void) const;
-  void SetTxCurrentA (double txCurrentA);
-  double GetRxCurrentA (void) const;
-  void SetRxCurrentA (double rxCurrentA);
-  double GetSwitchingCurrentA (void) const;
-  void SetSwitchingCurrentA (double switchingCurrentA);
-  double GetSleepCurrentA (void) const;
-  void SetSleepCurrentA (double sleepCurrentA);
-
-  /**
-   * \returns Current state.
-   */
-  WifiPhy::State GetCurrentState (void) const;
-
-  /**
-   * \param callback Callback function.
-   *
-   * Sets callback for energy depletion handling.
-   */
-  void SetEnergyDepletionCallback (WifiRadioEnergyDepletionCallback callback);
-
-  /**
-   * \param callback Callback function.
-   *
-   * Sets callback for energy recharged handling.
-   */
-  void SetEnergyRechargedCallback (WifiRadioEnergyRechargedCallback callback);
-
-  /**
-   * \param model the model used to compute the wifi tx current.
-   */
-  void SetTxCurrentModel (Ptr<WifiTxCurrentModel> model);
-
-  /**
-   * \brief Calls the CalcTxCurrent method of the tx current model to
-   *        compute the tx current based on such model
-   * 
-   * \param txPowerDbm the nominal tx power in dBm
-   */
-  void SetTxCurrentFromModel (double txPowerDbm);
-
-  /**
-   * \brief Changes state of the WifiRadioEnergyMode.
-   *
-   * \param newState New state the wifi radio is in.
-   *
-   * Implements DeviceEnergyModel::ChangeState.
-   */
-  virtual void ChangeState (int newState);
-
-  /**
-   * \brief Handles energy depletion.
-   *
-   * Implements DeviceEnergyModel::HandleEnergyDepletion
-   */
-  virtual void HandleEnergyDepletion (void);
-
-  /**
-   * \brief Handles energy recharged.
-   *
-   * Implements DeviceEnergyModel::HandleEnergyRecharged
-   */
-  virtual void HandleEnergyRecharged (void);
-
-  /**
-   * \returns Pointer to the PHY listener.
-   */
-  WifiRadioEnergyModelPhyListener * GetPhyListener (void);
-
-
-private:
-  void DoDispose (void);
-
-  /**
-   * \returns Current draw of device, at current state.
-   *
-   * Implements DeviceEnergyModel::GetCurrentA.
-   */
-  virtual double DoGetCurrentA (void) const;
-
-  /**
-   * \param state New state the radio device is currently in.
-   *
-   * Sets current state. This function is private so that only the energy model
-   * can change its own state.
-   */
-  void SetWifiRadioState (const WifiPhy::State state);
-
-private:
-  Ptr<EnergySource> m_source;
-
-  // Member variables for current draw in different radio modes.
-  double m_txCurrentA;
-  double m_rxCurrentA;
-  double m_idleCurrentA;
-  double m_ccaBusyCurrentA;
-  double m_switchingCurrentA;
-  double m_sleepCurrentA;
-  Ptr<WifiTxCurrentModel> m_txCurrentModel;
-
-  // This variable keeps track of the total energy consumed by this model.
-  TracedValue<double> m_totalEnergyConsumption;
-
-  // State variables.
-  WifiPhy::State m_currentState;  // current state the radio is in
-  Time m_lastUpdateTime;          // time stamp of previous energy update
-
-  uint8_t m_nPendingChangeState;
-  bool m_isSupersededChangeState;
-
-  // Energy depletion callback
-  WifiRadioEnergyDepletionCallback m_energyDepletionCallback;
-
-  // Energy recharged callback
-  WifiRadioEnergyRechargedCallback m_energyRechargedCallback;
-
-  // WifiPhy listener
-  WifiRadioEnergyModelPhyListener *m_listener;
-};
-
-} // namespace ns3
-
-#endif /* WIFI_RADIO_ENERGY_MODEL_H */
diff -Naur ns-3.23/src/energy/model/wifi-tx-current-model.cc ns-3.24/src/energy/model/wifi-tx-current-model.cc
--- ns-3.23/src/energy/model/wifi-tx-current-model.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/model/wifi-tx-current-model.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,143 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014 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 <stefano.avallone@unina.it>
- */
-
-#include "wifi-tx-current-model.h"
-#include "ns3/log.h"
-#include "ns3/boolean.h"
-#include "ns3/double.h"
-#include "ns3/string.h"
-#include "ns3/pointer.h"
-#include <cmath>
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("WifiTxCurrentModel");
-
-// ------------------------------------------------------------------------- //
-
-NS_OBJECT_ENSURE_REGISTERED (WifiTxCurrentModel);
-
-TypeId 
-WifiTxCurrentModel::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::WifiTxCurrentModel")
-    .SetParent<Object> ()
-    .SetGroupName ("Energy")
-  ;
-  return tid;
-}
-
-WifiTxCurrentModel::WifiTxCurrentModel()
-{
-}
-
-WifiTxCurrentModel::~WifiTxCurrentModel()
-{
-}
-
-double
-WifiTxCurrentModel::DbmToW (double dbm)
-{
-  double mW = std::pow (10.0, dbm / 10.0);
-  return mW / 1000.0;
-}
-
-// ------------------------------------------------------------------------- //
-
-NS_OBJECT_ENSURE_REGISTERED (LinearWifiTxCurrentModel);
-
-TypeId 
-LinearWifiTxCurrentModel::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::LinearWifiTxCurrentModel")
-    .SetParent<WifiTxCurrentModel> ()
-    .AddConstructor<LinearWifiTxCurrentModel> ()
-    .AddAttribute ("Eta", "The efficiency of the power amplifier.",
-                   DoubleValue (0.10),
-                   MakeDoubleAccessor (&LinearWifiTxCurrentModel::SetEta,
-                                       &LinearWifiTxCurrentModel::GetEta),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("Voltage", "The supply voltage (in Volts).",
-                   DoubleValue (3.0),
-                   MakeDoubleAccessor (&LinearWifiTxCurrentModel::SetVoltage,
-                                       &LinearWifiTxCurrentModel::GetVoltage),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("IdleCurrent", "The current in the IDLE state (in Watts).",
-                   DoubleValue (0.273333),
-                   MakeDoubleAccessor (&LinearWifiTxCurrentModel::SetIdleCurrent,
-                                       &LinearWifiTxCurrentModel::GetIdleCurrent),
-                   MakeDoubleChecker<double> ())
-  ;
-  return tid;
-}
-
-LinearWifiTxCurrentModel::LinearWifiTxCurrentModel ()
-{
-}
-
-LinearWifiTxCurrentModel::~LinearWifiTxCurrentModel()
-{
-}
-
-void
-LinearWifiTxCurrentModel::SetEta (double eta)
-{
-  m_eta = eta;
-}
-
-void
-LinearWifiTxCurrentModel::SetVoltage (double voltage)
-{
-  m_voltage = voltage;
-}
-
-void
-LinearWifiTxCurrentModel::SetIdleCurrent (double idleCurrent)
-{
-  m_idleCurrent = idleCurrent;
-}
-
-double
-LinearWifiTxCurrentModel::GetEta (void) const
-{
-  return m_eta;
-}
-
-double
-LinearWifiTxCurrentModel::GetVoltage (void) const
-{
-  return m_voltage;
-}
-
-double
-LinearWifiTxCurrentModel::GetIdleCurrent (void) const
-{
-  return m_idleCurrent;
-}
-
-double
-LinearWifiTxCurrentModel::CalcTxCurrent (double txPowerDbm) const
-{
-  return DbmToW (txPowerDbm) / (m_voltage * m_eta) + m_idleCurrent;
-}
-
-// ------------------------------------------------------------------------- //
-
-} // namespace ns3
diff -Naur ns-3.23/src/energy/model/wifi-tx-current-model.h ns-3.24/src/energy/model/wifi-tx-current-model.h
--- ns-3.23/src/energy/model/wifi-tx-current-model.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/model/wifi-tx-current-model.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,142 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014 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 <stefano.avallone@unina.it>
- */
-
-#ifndef WIFI_TX_CURRENT_MODEL_H
-#define WIFI_TX_CURRENT_MODEL_H
-
-#include "ns3/object.h"
-
-namespace ns3 {
-
-/**
- * \ingroup energy
- * 
- * \brief Modelize the transmit current as a function of the transmit power and mode
- *
- */
-class WifiTxCurrentModel : public Object
-{
-public:
-  static TypeId GetTypeId (void);
-
-  WifiTxCurrentModel ();
-  virtual ~WifiTxCurrentModel ();
-
-  /**
-   * \param txPowerDbm the nominal tx power in dBm
-   * \returns the transmit current (in Ampere)
-   */
-  virtual double CalcTxCurrent (double txPowerDbm) const = 0;
-
-  /**
-   * Convert from dBm to Watts.
-   *
-   * \param dbm the power in dBm
-   * \return the equivalent Watts for the given dBm
-   */
-  static double DbmToW (double dbm);
-};
-
-/**
- * \ingroup energy
- *
- * \brief a linear model of the Wifi transmit current
- *
- * This model assumes that the transmit current is a linear function
- * of the nominal transmit power used to send the frame.
- * In particular, the power absorbed during the transmission of a frame \f$ W_{tx} \f$
- * is given by the power absorbed by the power amplifier \f$ W_{pa} \f$ plus the power
- * absorbed by the RF subsystem. The latter is assumed to be the same as the power
- * absorbed in the IDLE state \f$ W_{idle} \f$.
- * 
- * The efficiency \f$ \eta \f$ of the power amplifier is given by 
- * \f$ \eta = \frac{P_{tx}}{W_{pa}} \f$, where \f$ P_{tx} \f$ is the output power, i.e.,
- * the nominal transmit power. Hence, \f$ W_{pa} = \frac{P_{tx}}{\eta} \f$
- * 
- * It turns out that \f$ W_{tx} = \frac{P_{tx}}{\eta} + W_{idle} \f$. By dividing both
- * sides by the supply voltage \f$ V \f$: \f$ I_{tx} = \frac{P_{tx}}{V \cdot \eta} + I_{idle} \f$,
- * where \f$ I_{tx} \f$ and \f$ I_{idle} \f$ are, respectively, the transmit current and
- * the idle current.
- * 
- * For more information, refer to:
- * Francesco Ivan Di Piazza, Stefano Mangione, and Ilenia Tinnirello.
- * "On the Effects of Transmit Power Control on the Energy Consumption of WiFi Network Cards",
- * Proceedings of ICST QShine 2009, pp. 463--475
- * 
- * If the tx current corresponding to a given nominal transmit power is known, the efficiency
- * of the power amplifier is given by the above formula:
- * \f$ \eta = \frac{P_{tx}}{(I_{tx}-I_{idle})\cdot V} \f$
- * 
- */
-class LinearWifiTxCurrentModel : public WifiTxCurrentModel
-{
-public:
-  static TypeId GetTypeId (void);
-
-  LinearWifiTxCurrentModel ();
-  virtual ~LinearWifiTxCurrentModel ();
-  
-  /**
-   * \param eta (dimension-less)
-   *
-   * Set the power amplifier efficiency.
-   */
-  void SetEta (double eta);
-
-  /**
-   * \param voltage (Volts)
-   *
-   * Set the supply voltage.
-   */
-  void SetVoltage (double voltage);
-
-  /**
-   * \param idleCurrent (Ampere)
-   *
-   * Set the current in the IDLE state.
-   */
-  void SetIdleCurrent (double idleCurrent);
-
-  /**
-   * \return the power amplifier efficiency.
-   */
-  double GetEta (void) const;
-
-  /**
-   * \return the supply voltage.
-   */
-  double GetVoltage (void) const;
-
-  /**
-   * \return the current in the IDLE state.
-   */
-  double GetIdleCurrent (void) const;
-
-  double CalcTxCurrent (double txPowerDbm) const;
-
-private:
-  double m_eta;
-  double m_voltage;
-  double m_idleCurrent;
-};
-
-} // namespace ns3
-
-#endif /* WIFI_TX_CURRENT_MODEL_H */
diff -Naur ns-3.23/src/energy/test/basic-energy-model-test.cc ns-3.24/src/energy/test/basic-energy-model-test.cc
--- ns-3.23/src/energy/test/basic-energy-model-test.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/test/basic-energy-model-test.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,393 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
- *
- * 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: He Wu <mdzz@u.washington.edu>
- */
-
-#include "ns3/basic-energy-source.h"
-#include "ns3/wifi-radio-energy-model.h"
-#include "ns3/basic-energy-source-helper.h"
-#include "ns3/wifi-radio-energy-model-helper.h"
-#include "ns3/energy-source-container.h"
-#include "ns3/device-energy-model-container.h"
-#include "ns3/log.h"
-#include "ns3/test.h"
-#include "ns3/node.h"
-#include "ns3/simulator.h"
-#include "ns3/double.h"
-#include "ns3/config.h"
-#include "ns3/string.h"
-#include "ns3/yans-wifi-helper.h"
-#include "ns3/nqos-wifi-mac-helper.h"
-#include <cmath>
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("BasicEnergyModelTestSuite");
-
-/**
- * Test case of update remaining energy for BasicEnergySource and
- * WifiRadioEnergyModel.
- */
-class BasicEnergyUpdateTest : public TestCase
-{
-public:
-  BasicEnergyUpdateTest ();
-  virtual ~BasicEnergyUpdateTest ();
-
-private:
-  void DoRun (void);
-
-  /**
-   * \param state Radio state to switch to.
-   * \return False if no error occurs.
-   *
-   * Runs simulation for a while, check if final state & remaining energy is
-   * correctly updated.
-   */
-  bool StateSwitchTest (WifiPhy::State state);
-
-private:
-  double m_timeS;     // in seconds
-  double m_tolerance; // tolerance for power estimation
-
-  ObjectFactory m_energySource;
-  ObjectFactory m_deviceEnergyModel;
-};
-
-BasicEnergyUpdateTest::BasicEnergyUpdateTest ()
-  : TestCase ("Basic energy model update remaining energy test case")
-{
-  m_timeS = 15.5; // idle for 15 seconds before changing state
-  m_tolerance = 1.0e-13;  //
-}
-
-BasicEnergyUpdateTest::~BasicEnergyUpdateTest ()
-{
-}
-
-void
-BasicEnergyUpdateTest::DoRun (void)
-{
-  // set types
-  m_energySource.SetTypeId ("ns3::BasicEnergySource");
-  m_deviceEnergyModel.SetTypeId ("ns3::WifiRadioEnergyModel");
-
-  // run state switch tests
-  NS_TEST_ASSERT_MSG_EQ (StateSwitchTest (WifiPhy::IDLE), false, "Problem with state switch test (WifiPhy idle).");
-  NS_TEST_ASSERT_MSG_EQ (StateSwitchTest (WifiPhy::CCA_BUSY), false, "Problem with state switch test (WifiPhy cca busy).");
-  NS_TEST_ASSERT_MSG_EQ (StateSwitchTest (WifiPhy::TX), false, "Problem with state switch test (WifiPhy tx).");
-  NS_TEST_ASSERT_MSG_EQ (StateSwitchTest (WifiPhy::RX), false, "Problem with state switch test (WifiPhy rx).");
-  NS_TEST_ASSERT_MSG_EQ (StateSwitchTest (WifiPhy::SWITCHING), false, "Problem with state switch test (WifiPhy switching).");
-  NS_TEST_ASSERT_MSG_EQ (StateSwitchTest (WifiPhy::SLEEP), false, "Problem with state switch test (WifiPhy sleep).");
-}
-
-bool
-BasicEnergyUpdateTest::StateSwitchTest (WifiPhy::State state)
-{
-  // create node
-  Ptr<Node> node = CreateObject<Node> ();
-
-  // create energy source
-  Ptr<BasicEnergySource> source = m_energySource.Create<BasicEnergySource> ();
-  // aggregate energy source to node
-  node->AggregateObject (source);
-
-  // create device energy model
-  Ptr<WifiRadioEnergyModel> model =
-    m_deviceEnergyModel.Create<WifiRadioEnergyModel> ();
-  // set energy source pointer
-  model->SetEnergySource (source);
-  // add device energy model to model list in energy source
-  source->AppendDeviceEnergyModel (model);
-
-  // retrieve device energy model from energy source
-  DeviceEnergyModelContainer models =
-    source->FindDeviceEnergyModels ("ns3::WifiRadioEnergyModel");
-  // check list
-  NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL (false, (models.GetN () == 0), "Model list is empty!");
-  // get pointer
-  Ptr<WifiRadioEnergyModel> devModel =
-    DynamicCast<WifiRadioEnergyModel> (models.Get (0));
-  // check pointer
-  NS_TEST_ASSERT_MSG_NE_RETURNS_BOOL (0, devModel, "NULL pointer to device model!");
-
-  /*
-   * The radio will stay IDLE for m_timeS seconds. Then it will switch into a
-   * different state.
-   */
-
-  // schedule change of state
-  Simulator::Schedule (Seconds (m_timeS),
-                       &WifiRadioEnergyModel::ChangeState, devModel, state);
-
-  // Calculate remaining energy at simulation stop time
-  Simulator::Schedule (Seconds (m_timeS * 2), 
-                       &BasicEnergySource::UpdateEnergySource, source);
-
-  double timeDelta = 0.000000001; // 1 nanosecond
-  // run simulation; stop just after last scheduled event
-  Simulator::Stop (Seconds (m_timeS * 2 + timeDelta));
-  Simulator::Run ();
-
-  // energy = current * voltage * time
-
-  // calculate idle power consumption
-  double estRemainingEnergy = source->GetInitialEnergy ();
-  double voltage = source->GetSupplyVoltage ();
-  estRemainingEnergy -= devModel->GetIdleCurrentA () * voltage * m_timeS;
-
-  /*
-   * Manually calculate the number of periodic updates performed by the source.
-   * This is to check if the periodic updates are performed correctly.
-   */
-  double actualTime = m_timeS;
-  actualTime /= source->GetEnergyUpdateInterval ().GetSeconds ();
-  actualTime = floor (actualTime); // rounding for update interval
-  actualTime *= source->GetEnergyUpdateInterval ().GetSeconds ();
-
-  // calculate new state power consumption
-  double current = 0.0;
-  switch (state)
-    {
-    case WifiPhy::IDLE:
-      current = devModel->GetIdleCurrentA ();
-      break;
-    case WifiPhy::CCA_BUSY:
-      current = devModel->GetCcaBusyCurrentA ();
-      break;
-    case WifiPhy::TX:
-      current = devModel->GetTxCurrentA ();
-      break;
-    case WifiPhy::RX:
-      current = devModel->GetRxCurrentA ();
-      break;
-    case WifiPhy::SWITCHING:
-      current = devModel->GetSwitchingCurrentA ();
-      break;
-    case WifiPhy::SLEEP:
-      current = devModel->GetSleepCurrentA ();
-      break;
-    default:
-      NS_FATAL_ERROR ("Undefined radio state: " << state);
-      break;
-    }
-  estRemainingEnergy -= current * voltage * m_timeS;
-
-  // obtain remaining energy from source
-  double remainingEnergy = source->GetRemainingEnergy ();
-  NS_LOG_DEBUG ("Remaining energy is " << remainingEnergy);
-  NS_LOG_DEBUG ("Estimated remaining energy is " << estRemainingEnergy);
-  NS_LOG_DEBUG ("Difference is " << estRemainingEnergy - remainingEnergy);
-  // check remaining energy
-  NS_TEST_ASSERT_MSG_EQ_TOL_RETURNS_BOOL (remainingEnergy, estRemainingEnergy, m_tolerance,
-                                          "Incorrect remaining energy!");
-
-  // obtain radio state
-  WifiPhy::State endState = devModel->GetCurrentState ();
-  NS_LOG_DEBUG ("Radio state is " << endState);
-  // check end state
-  NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL (endState, state,  "Incorrect end state!");
-  Simulator::Destroy ();
-
-  return false; // no error
-}
-
-// -------------------------------------------------------------------------- //
-
-/**
- * Test case of energy depletion handling for BasicEnergySource and
- * WifiRadioEnergyModel.
- */
-class BasicEnergyDepletionTest : public TestCase
-{
-public:
-  BasicEnergyDepletionTest ();
-  virtual ~BasicEnergyDepletionTest ();
-
-private:
-  void DoRun (void);
-
-  /**
-   * Callback invoked when energy is drained from source.
-   */
-  void DepletionHandler (void);
-
-  /**
-   * \param simTimeS Simulation time, in seconds.
-   * \param updateIntervalS Device model update interval, in seconds.
-   * \return False if all is good.
-   *
-   * Runs simulation with specified simulation time and update interval.
-   */
-  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
-
-};
-
-BasicEnergyDepletionTest::BasicEnergyDepletionTest ()
-  : TestCase ("Basic energy model energy depletion test case")
-{
-  m_numOfNodes = 10;
-  m_callbackCount = 0;
-  m_simTimeS = 4.5;
-  m_timeStepS = 0.5;
-  m_updateIntervalS = 1.5;
-}
-
-BasicEnergyDepletionTest::~BasicEnergyDepletionTest ()
-{
-}
-
-void
-BasicEnergyDepletionTest::DoRun (void)
-{
-  /*
-   * Run simulation with different simulation time and update interval.
-   */
-  for (double simTimeS = 0.0; simTimeS <= m_simTimeS; simTimeS += m_timeStepS)
-    {
-      for (double updateIntervalS = 0.5; updateIntervalS <= m_updateIntervalS;
-           updateIntervalS += m_timeStepS)
-        {
-          NS_TEST_ASSERT_MSG_EQ (DepletionTestCase (simTimeS, updateIntervalS), false, "Depletion test case problem.");
-          // reset callback count
-          m_callbackCount = 0;
-        }
-    }
-}
-
-void
-BasicEnergyDepletionTest::DepletionHandler (void)
-{
-  m_callbackCount++;
-}
-
-bool
-BasicEnergyDepletionTest::DepletionTestCase (double simTimeS,
-                                             double updateIntervalS)
-{
-  // create node
-  NodeContainer c;
-  c.Create (m_numOfNodes);
-
-  std::string phyMode ("DsssRate1Mbps");
-
-  // disable fragmentation for frames below 2200 bytes
-  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold",
-                      StringValue ("2200"));
-  // turn off RTS/CTS for frames below 2200 bytes
-  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold",
-                      StringValue ("2200"));
-  // Fix non-unicast data rate to be the same as that of unicast
-  Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode",
-                      StringValue (phyMode));
-
-  // install YansWifiPhy
-  WifiHelper wifi;
-  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
-
-  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
-  /*
-   * This is one parameter that matters when using FixedRssLossModel, set it to
-   * zero; otherwise, gain will be added.
-   */
-  wifiPhy.Set ("RxGain", DoubleValue (0));
-  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
-  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
-
-  YansWifiChannelHelper wifiChannel;
-  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
-  wifiPhy.SetChannel (wifiChannel.Create ());
-
-  // Add a non-QoS upper MAC, and disable rate control
-  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
-                                "DataMode", StringValue (phyMode),
-                                "ControlMode", StringValue (phyMode));
-  // Set it to ad-hoc mode
-  wifiMac.SetType ("ns3::AdhocWifiMac");
-  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
-
-  /*
-   * Create and install energy source and a single basic radio energy model on
-   * the node using helpers.
-   */
-  // source helper
-  BasicEnergySourceHelper basicSourceHelper;
-  // set energy to 0 so that we deplete energy at the beginning of simulation
-  basicSourceHelper.Set ("BasicEnergySourceInitialEnergyJ", DoubleValue (0.0));
-  // set update interval
-  basicSourceHelper.Set ("PeriodicEnergyUpdateInterval",
-                         TimeValue (Seconds (updateIntervalS)));
-  // install source
-  EnergySourceContainer sources = basicSourceHelper.Install (c);
-
-  // device energy model helper
-  WifiRadioEnergyModelHelper radioEnergyHelper;
-  // set energy depletion callback
-  WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback =
-    MakeCallback (&BasicEnergyDepletionTest::DepletionHandler, this);
-  radioEnergyHelper.SetDepletionCallback (callback);
-  // install on node
-  DeviceEnergyModelContainer deviceModels = radioEnergyHelper.Install (devices, sources);
-
-  // run simulation
-  Simulator::Stop (Seconds (simTimeS));
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  NS_LOG_DEBUG ("Simulation time = " << simTimeS << "s");
-  NS_LOG_DEBUG ("Update interval = " << updateIntervalS << "s");
-  NS_LOG_DEBUG ("Expected callback count is " << m_numOfNodes);
-  NS_LOG_DEBUG ("Actual callback count is " << m_callbackCount);
-
-  // check result, call back should only be invoked once
-  NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL (m_numOfNodes, m_callbackCount, "Not all callbacks are invoked!");
-
-  return false;
-}
-
-// -------------------------------------------------------------------------- //
-
-/**
- * Unit test suite for energy model. Although the test suite involves 2 modules
- * it is still considered a unit test. Because a DeviceEnergyModel cannot live
- * without an EnergySource.
- */
-class BasicEnergyModelTestSuite : public TestSuite
-{
-public:
-  BasicEnergyModelTestSuite ();
-};
-
-BasicEnergyModelTestSuite::BasicEnergyModelTestSuite ()
-  : TestSuite ("basic-energy-model", UNIT)
-{
-  AddTestCase (new BasicEnergyUpdateTest, TestCase::QUICK);
-  AddTestCase (new BasicEnergyDepletionTest, TestCase::QUICK);
-}
-
-// create an instance of the test suite
-static BasicEnergyModelTestSuite g_energyModelTestSuite;
-
diff -Naur ns-3.23/src/energy/test/examples-to-run.py ns-3.24/src/energy/test/examples-to-run.py
--- ns-3.23/src/energy/test/examples-to-run.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/test/examples-to-run.py	2015-09-15 11:18:44.000000000 -0700
@@ -7,7 +7,10 @@
 #     (example_name, do_run, do_valgrind_run).
 #
 # See test.py for more information.
-cpp_examples = []
+cpp_examples = [
+    ("li-ion-energy-source", "True", "True"),
+    ("rv-battery-model-test", "True", "True"),
+]
 
 # A list of Python examples to run in order to ensure that they remain
 # runnable over time.  Each tuple in the list contains
diff -Naur ns-3.23/src/energy/test/li-ion-energy-source-test.cc ns-3.24/src/energy/test/li-ion-energy-source-test.cc
--- ns-3.23/src/energy/test/li-ion-energy-source-test.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/test/li-ion-energy-source-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -37,7 +37,6 @@
 
   void DoRun (void);
 
-  double m_simTime;
   Ptr<Node> m_node;
 };
 
diff -Naur ns-3.23/src/energy/test/rv-battery-model-test.cc ns-3.24/src/energy/test/rv-battery-model-test.cc
--- ns-3.23/src/energy/test/rv-battery-model-test.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/test/rv-battery-model-test.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,892 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
- *
- * 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: He Wu <mdzz@u.washington.edu>
- */
-
-#include "ns3/rv-battery-model.h"
-#include "ns3/wifi-radio-energy-model.h"
-#include "ns3/rv-battery-model-helper.h"
-#include "ns3/wifi-radio-energy-model-helper.h"
-#include "ns3/energy-source-container.h"
-#include "ns3/device-energy-model-container.h"
-#include "ns3/log.h"
-#include "ns3/test.h"
-#include "ns3/node.h"
-#include "ns3/simulator.h"
-#include "ns3/double.h"
-#include "ns3/config.h"
-#include "ns3/string.h"
-#include "ns3/yans-wifi-helper.h"
-#include "ns3/nqos-wifi-mac-helper.h"
-#include <cmath>
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("RvBatteryModelTestSuite");
-
-/**
- * Test case of update remaining energy for RvBatteryModel and
- * WifiRadioEnergyModel.
- */
-class BatteryLifetimeTest : public TestCase
-{
-public:
-  BatteryLifetimeTest ();
-  virtual ~BatteryLifetimeTest ();
-
-private:
-  /**
-   * Creates load profiles according to "Battery Lifetime Prediction for Energy-
-   * Aware Computing" paper.
-   */
-  void CreateLoadProfiles (void);
-
-  /**
-   * \returns False if no error occurs.
-   *
-   * Runs test.
-   */
-  void DoRun (void);
-
-  /**
-   * \param load Load value, in Amperes (A).
-   * \param expLifetime Expected lifetime.
-   * \return False if no error occurs.
-   *
-   * Runs simulation with constant load and checks the battery lifetime with
-   * known results.
-   */
-  bool ConstantLoadTest (double load, Time expLifetime);
-
-  /**
-   * \param loads Load profile.
-   * \param timeStamps Time stamps.
-   * \param expLifetime Expected lifetime.
-   * \returns False if no error occurs.
-   *
-   * Runs simulation with variable load and checks the battery lifetime with
-   * known results.
-   */
-  bool VariableLoadTest (std::vector<double> loads,
-                         std::vector<Time> timeStamps,
-                         Time expLifetime);
-
-private:
-  typedef struct LoadProfile
-  {
-    std::vector<double> loads;
-    std::vector<Time> timeStamps;
-    Time itsyLifetime;
-    Time dualFoilLifeTime;
-  } LoadProfile;
-
-private:
-  std::vector<LoadProfile> m_loadProfiles;
-  double m_alpha;
-  double m_beta;
-};
-
-BatteryLifetimeTest::BatteryLifetimeTest ()
-  : TestCase ("RV battery model battery lifetime test case.")
-{
-  // Itsy battery
-  m_alpha = 35220;
-  m_beta = 0.637;
-}
-
-BatteryLifetimeTest::~BatteryLifetimeTest ()
-{
-}
-
-void
-BatteryLifetimeTest::CreateLoadProfiles (void)
-{
-  // create set of load profiles
-  LoadProfile profile;
-
-  std::vector<double> loads;
-  std::vector<Time> timeStamps;
-
-  // C1
-  loads.push_back (0.628);
-  loads.push_back (0);
-  loads.push_back (0.628);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (19.5 * 60));
-  timeStamps.push_back (Seconds (26.0 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (55.0 * 60);     // 55.0 minutes
-  profile.dualFoilLifeTime = Seconds (36.2 * 60); // 36.2 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C2
-  loads.push_back (0.4947);
-  loads.push_back (0);
-  loads.push_back (0.4947);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (31.0 * 60));
-  timeStamps.push_back (Seconds (41.3 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (73.9 * 60);     // 73.9 minutes
-  profile.dualFoilLifeTime = Seconds (55.8 * 60); // 55.8 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C3
-  loads.push_back (0.4256);
-  loads.push_back (0);
-  loads.push_back (0.4256);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (41.0 * 60));
-  timeStamps.push_back (Seconds (54.6 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (88.8 * 60);     // 88.8 minutes
-  profile.dualFoilLifeTime = Seconds (71.8 * 60); // 71.8 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C4
-  loads.push_back (0.2923);
-  loads.push_back (0);
-  loads.push_back (0.2923);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (74.6 * 60));
-  timeStamps.push_back (Seconds (99.5 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (137.8 * 60);      // 137.8 minutes
-  profile.dualFoilLifeTime = Seconds (124.9 * 60);  // 124.9 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C5
-  loads.push_back (0.2227);
-  loads.push_back (0);
-  loads.push_back (0.2227);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (105.7 * 60));
-  timeStamps.push_back (Seconds (140.9 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (185.8 * 60);      // 185.8 minutes
-  profile.dualFoilLifeTime = Seconds (176.7 * 60);  // 176.7 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C6
-  loads.push_back (0.628);
-  loads.push_back (0);
-  loads.push_back (0.628);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (19.5 * 60));
-  timeStamps.push_back (Seconds (29.9 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (58.9 * 60);     // 58.9 minutes
-  profile.dualFoilLifeTime = Seconds (41.0 * 60); // 41.0 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C7
-  loads.push_back (0.628);
-  loads.push_back (0);
-  loads.push_back (0.628);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (19.5 * 60));
-  timeStamps.push_back (Seconds (22.1 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (51.1 * 60);     // 51.1 minutes
-  profile.dualFoilLifeTime = Seconds (30.8 * 60); // 30.8 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C8
-  loads.push_back (0.628);
-  loads.push_back (0);
-  loads.push_back (0.628);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (23.4 * 60));
-  timeStamps.push_back (Seconds (29.9 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (55.0 * 60);     // 55.0 minutes
-  profile.dualFoilLifeTime = Seconds (37.4 * 60); // 37.4 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C9
-  loads.push_back (0.628);
-  loads.push_back (0);
-  loads.push_back (0.628);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (15.6 * 60));
-  timeStamps.push_back (Seconds (22.1 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (55.0 * 60);     // 55.0 minutes
-  profile.dualFoilLifeTime = Seconds (35.2 * 60); // 35.2 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C10
-  loads.push_back (0.300);
-  loads.push_back (0.628);
-  loads.push_back (0.4947);
-  loads.push_back (0.2523);
-  loads.push_back (0.2341);
-  loads.push_back (0.1379);
-  loads.push_back (0.1139);
-  loads.push_back (0.2656);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (0.5 * 60));
-  timeStamps.push_back (Seconds (5.5 * 60));
-  timeStamps.push_back (Seconds (10.5 * 60));
-  timeStamps.push_back (Seconds (35.5 * 60));
-  timeStamps.push_back (Seconds (60.5 * 60));
-  timeStamps.push_back (Seconds (85.5 * 60));
-  timeStamps.push_back (Seconds (110.5 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (144.3 * 60);      // 144.3 minutes
-  profile.dualFoilLifeTime = Seconds (132.6 * 60);  // 132.6 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C11
-  loads.push_back (0.300);
-  loads.push_back (0.1139);
-  loads.push_back (0.1379);
-  loads.push_back (0.2341);
-  loads.push_back (0.2523);
-  loads.push_back (0.4947);
-  loads.push_back (0.628);
-  loads.push_back (0.2656);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (0.5 * 60));
-  timeStamps.push_back (Seconds (25.5 * 60));
-  timeStamps.push_back (Seconds (50.5 * 60));
-  timeStamps.push_back (Seconds (75.5 * 60));
-  timeStamps.push_back (Seconds (100.5 * 60));
-  timeStamps.push_back (Seconds (105.5 * 60));
-  timeStamps.push_back (Seconds (110.5 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (144.3 * 60);      // 144.3 minutes
-  profile.dualFoilLifeTime = Seconds (107.4 * 60);  // 107.4 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C12
-  loads.push_back (0.300);
-  loads.push_back (0.1139);
-  loads.push_back (0.1379);
-  loads.push_back (0.2341);
-  loads.push_back (0.2523);
-  loads.push_back (0.4947);
-  loads.push_back (0.0);
-  loads.push_back (0.300);
-  loads.push_back (0.628);
-  loads.push_back (0.2656);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (0.5 * 60));
-  timeStamps.push_back (Seconds (25.5 * 60));
-  timeStamps.push_back (Seconds (50.5 * 60));
-  timeStamps.push_back (Seconds (75.5 * 60));
-  timeStamps.push_back (Seconds (100.5 * 60));
-  timeStamps.push_back (Seconds (105.5 * 60));
-  timeStamps.push_back (Seconds (130.5 * 60));
-  timeStamps.push_back (Seconds (131.0 * 60));
-  timeStamps.push_back (Seconds (136.0 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (169.3 * 60);      // 169.3 minutes
-  profile.dualFoilLifeTime = Seconds (155.4 * 60);  // 155.4 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C13
-  loads.push_back (0.300);
-  timeStamps.push_back (Seconds (0));
-
-  for (int i = 0; i < 5; i++)
-    {
-      loads.push_back (0.628);
-      loads.push_back (0.4947);
-      loads.push_back (0.2523);
-      loads.push_back (0.2341);
-      loads.push_back (0.1379);
-      loads.push_back (0.1139);
-
-      timeStamps.push_back (Seconds ((0.5 + i * 22.5) * 60));
-      timeStamps.push_back (Seconds ((1.5 + i * 22.5) * 60));
-      timeStamps.push_back (Seconds ((2.5 + i * 22.5) * 60));
-      timeStamps.push_back (Seconds ((7.5 + i * 22.5) * 60));
-      timeStamps.push_back (Seconds ((12.5 + i * 22.5) * 60));
-      timeStamps.push_back (Seconds ((17.5 + i * 22.5) * 60));
-    }
-
-  loads.push_back (0.2656);
-  timeStamps.push_back (Seconds (110.5 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (144.3 * 60);      // 144.3 minutes
-  profile.dualFoilLifeTime = Seconds (131.7 * 60);  // 131.7 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C14, time stamp calculation in paper is off, using our own estimated value
-  loads.push_back (0.300);
-  timeStamps.push_back (Seconds (0));
-
-  for (int i = 0; i < 5; i++)
-    {
-      loads.push_back (0.1139);
-      loads.push_back (0.1379);
-      loads.push_back (0.2341);
-      loads.push_back (0.2523);
-      loads.push_back (0.4947);
-      loads.push_back (0.628);
-
-      timeStamps.push_back (Seconds ((0.5 + i * 22.5) * 60));
-      timeStamps.push_back (Seconds ((5.5 + i * 22.5) * 60));
-      timeStamps.push_back (Seconds ((10.5 + i * 22.5) * 60));
-      timeStamps.push_back (Seconds ((15.5 + i * 22.5) * 60));
-      timeStamps.push_back (Seconds ((20.5 + i * 22.5) * 60));
-      timeStamps.push_back (Seconds ((21.5 + i * 22.5) * 60));
-    }
-
-  loads.push_back (0.2656);
-  timeStamps.push_back (Seconds (112.5 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (141.5 * 60);      // 141.5 minutes
-  profile.dualFoilLifeTime = Seconds (126.3 * 60);  // 126.3 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C15
-  loads.push_back (0.2227);
-  loads.push_back (0.2045);
-  loads.push_back (0.1083);
-  loads.push_back (0.0843);
-  loads.push_back (0.2227);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (50.0 * 60));
-  timeStamps.push_back (Seconds (100.0 * 60));
-  timeStamps.push_back (Seconds (150.0 * 60));
-  timeStamps.push_back (Seconds (200.0 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (211.4 * 60);      // 211.4 minutes
-  profile.dualFoilLifeTime = Seconds (209.2 * 60);  // 209.2 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C16
-  loads.push_back (0.0843);
-  loads.push_back (0.1083);
-  loads.push_back (0.2045);
-  loads.push_back (0.2227);
-  loads.push_back (0.2227);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (50.0 * 60));
-  timeStamps.push_back (Seconds (100.0 * 60));
-  timeStamps.push_back (Seconds (150.0 * 60));
-  timeStamps.push_back (Seconds (200.0 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (211.4 * 60);      // 211.4 minutes
-  profile.dualFoilLifeTime = Seconds (200.7 * 60);  // 200.7 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C17
-  loads.push_back (0.0843);
-  loads.push_back (0.1083);
-  loads.push_back (0.2045);
-  loads.push_back (0.0);
-  loads.push_back (0.2227);
-  loads.push_back (0.2227);
-
-  timeStamps.push_back (Seconds (0));
-  timeStamps.push_back (Seconds (50.0 * 60));
-  timeStamps.push_back (Seconds (100.0 * 60));
-  timeStamps.push_back (Seconds (150.0 * 60));
-  timeStamps.push_back (Seconds (200.0 * 60));
-  timeStamps.push_back (Seconds (250.0 * 60));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (261.4 * 60);      // 261.4 minutes
-  profile.dualFoilLifeTime = Seconds (251.2 * 60);  // 251.2 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C18
-  for (int i = 0; i < 10; i++)
-    {
-      loads.push_back (0.0843);
-      loads.push_back (0.1083);
-      loads.push_back (0.2045);
-      loads.push_back (0.2227);
-
-      timeStamps.push_back (Seconds ((0.0 + i * 20.0) * 60));
-      timeStamps.push_back (Seconds ((5.0 + i * 20.0) * 60));
-      timeStamps.push_back (Seconds ((10.0 + i * 20.0) * 60));
-      timeStamps.push_back (Seconds ((15.0 + i * 20.0) * 60));
-    }
-
-  loads.push_back (0.2227);
-  timeStamps.push_back (Seconds (200.0));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (211.4 * 60);      // 211.4 minutes
-  profile.dualFoilLifeTime = Seconds (204.6 * 60);  // 204.6 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C19
-  for (int i = 0; i < 10; i++)
-    {
-      loads.push_back (0.0755);
-      loads.push_back (0.0949);
-      loads.push_back (0.2045);
-      loads.push_back (0.2227);
-
-      timeStamps.push_back (Seconds ((0.0 + i * 20.0) * 60));
-      timeStamps.push_back (Seconds ((5.0 + i * 20.0) * 60));
-      timeStamps.push_back (Seconds ((10.0 + i * 20.0) * 60));
-      timeStamps.push_back (Seconds ((15.0 + i * 20.0) * 60));
-    }
-
-  loads.push_back (0.2227);
-  timeStamps.push_back (Seconds (200.0));
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (216.4 * 60);      // 216.4 minutes
-  profile.dualFoilLifeTime = Seconds (208.7 * 60);  // 208.7 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C20
-  for (int i = 0; i < 50; i++)
-    {
-      loads.push_back (0.4947);
-      loads.push_back (0.628);
-
-      timeStamps.push_back (Seconds ((0.0 + i * 2.0) * 60));
-      timeStamps.push_back (Seconds ((1.0 + i * 2.0) * 60));
-    }
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (55.3 * 60);       // 55.3 minutes
-  profile.dualFoilLifeTime = Seconds (33.2 * 60);   // 33.2 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C21
-  for (int i = 0; i < 50; i++)
-    {
-      loads.push_back (0.4947);
-      loads.push_back (0.628);
-      loads.push_back (0.0576);
-
-      timeStamps.push_back (Seconds ((0.0 + i * 3.0) * 60));
-      timeStamps.push_back (Seconds ((1.0 + i * 3.0) * 60));
-      timeStamps.push_back (Seconds ((2.0 + i * 3.0) * 60));
-    }
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (79.6 * 60);       // 79.6 minutes
-  profile.dualFoilLifeTime = Seconds (55.9 * 60);   // 55.9 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-
-  // C22
-  for (int i = 0; i < 150; i++)
-    {
-      loads.push_back (0.005 + 0.005 * i);
-      timeStamps.push_back (Seconds ((0.0 + i * 1.0) * 60));
-    }
-
-  profile.loads = loads;
-  profile.timeStamps = timeStamps;
-  profile.itsyLifetime = Seconds (112.2 * 60);      // 112.2 minutes
-  profile.dualFoilLifeTime = Seconds (94.5 * 60);   // 94.5 minutes
-
-  m_loadProfiles.push_back (profile);
-
-  loads.clear ();
-  timeStamps.clear ();
-}
-
-void
-BatteryLifetimeTest::DoRun (void)
-{
-  NS_LOG_DEBUG ("Constant load run.");
-
-  // 640mA
-  NS_TEST_ASSERT_MSG_EQ (ConstantLoadTest (0.640, Seconds (2844.0)), false,  "Problems with constant load test (640mA).");
-  // 320mA
-  NS_TEST_ASSERT_MSG_EQ (ConstantLoadTest (0.320, Seconds (6146.0)), false,  "Problems with constant load test (320mA).");
-  // 128mA
-  NS_TEST_ASSERT_MSG_EQ (ConstantLoadTest (0.128, Seconds (16052.0)), false,  "Problems with constant load test (128mA).");
-  // 64mA
-  NS_TEST_ASSERT_MSG_EQ (ConstantLoadTest (0.064, Seconds (32561.0)), false,  "Problems with constant load test (64mA).");
-  // 32mA
-  NS_TEST_ASSERT_MSG_EQ (ConstantLoadTest (0.032, Seconds (65580.0)), false,  "Problems with constant load test (32).");
-
-  // create load profiles for variable load test
-  CreateLoadProfiles ();
-
-  // variable load with Itsy battery
-  NS_LOG_DEBUG ("\n\nItsy");
-  m_alpha = 35220;
-  m_beta = 0.637;
-  for (uint32_t i = 0; i < m_loadProfiles.size (); i++)
-    {
-      NS_LOG_DEBUG ("========");
-      NS_LOG_DEBUG ("Variable load profile C" << i + 1);
-      if (VariableLoadTest (m_loadProfiles[i].loads,
-                            m_loadProfiles[i].timeStamps,
-                            m_loadProfiles[i].itsyLifetime))
-        {
-          return;
-        }
-    }
-
-  // variable load with DUALFOIL battery
-  NS_LOG_DEBUG ("\n\nDUALFOIL");
-  m_alpha = 40027;
-  m_beta = 0.276;
-  for (uint32_t i = 0; i < m_loadProfiles.size (); i++)
-    {
-      NS_LOG_DEBUG ("========");
-      NS_LOG_DEBUG ("Variable load profile C" << i + 1);
-      if (VariableLoadTest (m_loadProfiles[i].loads,
-                            m_loadProfiles[i].timeStamps,
-                            m_loadProfiles[i].dualFoilLifeTime))
-        {
-          return;
-        }
-    }
-}
-
-bool
-BatteryLifetimeTest::ConstantLoadTest (double load, Time expLifetime)
-{
-  // create single node
-  NodeContainer c;
-  c.Create (1);
-
-  std::string phyMode ("DsssRate1Mbps");
-
-  // disable fragmentation for frames below 2200 bytes
-  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold",
-                      StringValue ("2200"));
-  // turn off RTS/CTS for frames below 2200 bytes
-  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold",
-                      StringValue ("2200"));
-  // Fix non-unicast data rate to be the same as that of unicast
-  Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode",
-                      StringValue (phyMode));
-
-  // install YansWifiPhy
-  WifiHelper wifi;
-  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
-
-  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
-  /*
-   * This is one parameter that matters when using FixedRssLossModel, set it to
-   * zero; otherwise, gain will be added.
-   */
-  wifiPhy.Set ("RxGain", DoubleValue (0));
-  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
-  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
-
-  YansWifiChannelHelper wifiChannel;
-  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
-  wifiPhy.SetChannel (wifiChannel.Create ());
-
-  // Add a non-QoS upper MAC, and disable rate control
-  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
-                                "DataMode", StringValue (phyMode),
-                                "ControlMode", StringValue (phyMode));
-  // Set it to ad-hoc mode
-  wifiMac.SetType ("ns3::AdhocWifiMac");
-  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
-
-  // Create and install battery model and device models
-  // RV battery model
-  RvBatteryModelHelper rvModelHelper;
-  // Set alpha & beta values
-  rvModelHelper.Set ("RvBatteryModelAlphaValue", DoubleValue (m_alpha));
-  rvModelHelper.Set ("RvBatteryModelBetaValue", DoubleValue (m_beta));
-  rvModelHelper.Set ("RvBatteryModelLowBatteryThreshold", DoubleValue (0.0));
-  // install source
-  EnergySourceContainer sources = rvModelHelper.Install (c);
-  // device energy model
-  WifiRadioEnergyModelHelper radioEnergyHelper;
-  // set VariableLoadTestIDLE current, which will be the constant load
-  radioEnergyHelper.Set ("IdleCurrentA", DoubleValue (load));
-  // install on node
-  DeviceEnergyModelContainer deviceModels = radioEnergyHelper.Install (devices, sources);
-
-  // run simulation
-  Simulator::Stop (Seconds (70000.0));
-  Simulator::Run ();
-
-  Time actualLifetime;
-  Ptr<RvBatteryModel> srcPtr = DynamicCast<RvBatteryModel> (sources.Get (0));
-  actualLifetime = srcPtr->GetLifetime ();
-
-  NS_LOG_DEBUG ("Expected lifetime = " << expLifetime.GetSeconds () << "s");
-  NS_LOG_DEBUG ("Actual lifetime = " << actualLifetime.GetSeconds () << "s");
-
-  NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL (actualLifetime, expLifetime, "Incorrect lifetime!");
-  /*
-  NS_TEST_ASSERT_MSG_EQ_TOL_RETURNS_BOOL (actualLifetime.GetSeconds () / 60,
-                                         expLifetime.GetSeconds () / 60, 0.1,
-                                         "Incorrect lifetime!");
-   */
-
-  Simulator::Destroy ();
-
-  return false; // error free
-}
-
-bool
-BatteryLifetimeTest::VariableLoadTest (std::vector<double> loads,
-                                       std::vector<Time> timeStamps,
-                                       Time expLifetime)
-{
-  NS_ASSERT (loads.size () == timeStamps.size ());
-
-  // create single node
-  NodeContainer c;
-  c.Create (1);
-
-  std::string phyMode ("DsssRate1Mbps");
-
-  // disable fragmentation for frames below 2200 bytes
-  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold",
-                      StringValue ("2200"));
-  // turn off RTS/CTS for frames below 2200 bytes
-  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold",
-                      StringValue ("2200"));
-  // Fix non-unicast data rate to be the same as that of unicast
-  Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode",
-                      StringValue (phyMode));
-
-  // install YansWifiPhy
-  WifiHelper wifi;
-  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
-
-  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
-  /*
-   * This is one parameter that matters when using FixedRssLossModel, set it to
-   * zero; otherwise, gain will be added.
-   */
-  wifiPhy.Set ("RxGain", DoubleValue (0));
-  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
-  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
-
-  YansWifiChannelHelper wifiChannel;
-  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
-  wifiPhy.SetChannel (wifiChannel.Create ());
-
-  // Add a non-QoS upper MAC, and disable rate control
-  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
-                                "DataMode", StringValue (phyMode),
-                                "ControlMode", StringValue (phyMode));
-  // Set it to ad-hoc mode
-  wifiMac.SetType ("ns3::AdhocWifiMac");
-  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
-
-  // Create and install battery model and device models
-  // RV battery model
-  RvBatteryModelHelper rvModelHelper;
-  // Set alpha & beta values
-  rvModelHelper.Set ("RvBatteryModelAlphaValue", DoubleValue (m_alpha));
-  rvModelHelper.Set ("RvBatteryModelBetaValue", DoubleValue (m_beta));
-  rvModelHelper.Set ("RvBatteryModelLowBatteryThreshold", DoubleValue (0.0));
-  // install source
-  EnergySourceContainer sources = rvModelHelper.Install (c);
-  // device energy model
-  WifiRadioEnergyModelHelper radioEnergyHelper;
-  // set VariableLoadTestIDLE current, which will be the constant load
-  radioEnergyHelper.Set ("IdleCurrentA", DoubleValue (loads[0]));
-  // install on node
-  DeviceEnergyModelContainer deviceModels = radioEnergyHelper.Install (devices, sources);
-
-
-  Ptr<WifiRadioEnergyModel> wifiDevicePtr = DynamicCast<WifiRadioEnergyModel> (deviceModels.Get (0));
-  // schedule load change events
-  for (uint32_t i = 1; i < loads.size (); i++)
-    {
-      Simulator::Schedule (timeStamps[i], &WifiRadioEnergyModel::SetIdleCurrentA,
-                           wifiDevicePtr, loads[i]);
-    }
-
-  // run simulation
-  Simulator::Stop (Seconds (70000.0));
-  Simulator::Run ();
-
-  Time actualLifetime;
-  Ptr<RvBatteryModel> srcPtr = DynamicCast<RvBatteryModel> (sources.Get (0));
-  actualLifetime = srcPtr->GetLifetime ();
-
-  NS_LOG_DEBUG ("Expected lifetime = " << expLifetime.GetSeconds () << "s");
-  NS_LOG_DEBUG ("Actual lifetime = " << actualLifetime.GetSeconds () << "s");
-  NS_LOG_DEBUG ("Difference = " << expLifetime.GetSeconds () - actualLifetime.GetSeconds () << "s");
-
-  //NS_TEST_ASSERT_MSG_EQ_RETURNS_BOOL (actualLifetime, expLifetime, "Incorrect lifetime!");
-  NS_TEST_ASSERT_MSG_EQ_TOL_RETURNS_BOOL (actualLifetime.GetSeconds (), expLifetime.GetSeconds (),
-                                          120, // error tolerance = 120s
-                                          "Incorrect lifetime!");
-
-  Simulator::Destroy ();
-
-  return false;   // error free
-}
-
-// -------------------------------------------------------------------------- //
-
-/**
- * Unit test suite for energy model. Although the test suite involves 2 modules
- * it is still considered a unit test. Because a DeviceEnergyModel cannot live
- * without an EnergySource.
- */
-class RvBatteryModelTestSuite : public TestSuite
-{
-public:
-  RvBatteryModelTestSuite ();
-};
-
-RvBatteryModelTestSuite::RvBatteryModelTestSuite ()
-  : TestSuite ("rv-battery-model", SYSTEM)
-{
-  AddTestCase (new BatteryLifetimeTest, TestCase::QUICK);
-}
-
-// create an instance of the test suite
-static RvBatteryModelTestSuite g_rvBatteryModelTestSuite;
diff -Naur ns-3.23/src/energy/wscript ns-3.24/src/energy/wscript
--- ns-3.23/src/energy/wscript	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/energy/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -1,9 +1,8 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 def build(bld):
-    obj = bld.create_ns3_module('energy', ['wifi'])
+    obj = bld.create_ns3_module('energy', ['network'])
     obj.source = [
-        'model/wifi-radio-energy-model.cc',
         'model/energy-source.cc',
         'model/basic-energy-source.cc',
         'model/li-ion-energy-source.cc',
@@ -13,11 +12,9 @@
         'model/simple-device-energy-model.cc',
         'model/energy-harvester.cc',
         'model/basic-energy-harvester.cc',
-        'model/wifi-tx-current-model.cc',
         'helper/energy-source-container.cc',
         'helper/energy-model-helper.cc',
         'helper/basic-energy-source-helper.cc',
-        'helper/wifi-radio-energy-model-helper.cc',
         'helper/rv-battery-model-helper.cc',
         'helper/energy-harvester-container.cc',
         'helper/energy-harvester-helper.cc',
@@ -26,8 +23,6 @@
 
     obj_test = bld.create_ns3_module_test_library('energy')
     obj_test.source = [
-        'test/basic-energy-model-test.cc',
-        'test/rv-battery-model-test.cc',
         'test/li-ion-energy-source-test.cc',
         'test/basic-energy-harvester-test.cc',
         ]
@@ -35,7 +30,6 @@
     headers = bld(features='ns3header')
     headers.module = 'energy'
     headers.source = [
-        'model/wifi-radio-energy-model.h',
         'model/energy-source.h',
         'model/basic-energy-source.h',
         'model/li-ion-energy-source.h',
@@ -45,11 +39,9 @@
         'model/simple-device-energy-model.h',
         'model/energy-harvester.h',
         'model/basic-energy-harvester.h',
-        'model/wifi-tx-current-model.h',
         'helper/energy-source-container.h',
         'helper/energy-model-helper.h',
         'helper/basic-energy-source-helper.h',
-        'helper/wifi-radio-energy-model-helper.h',
         'helper/rv-battery-model-helper.h',
         'helper/energy-harvester-container.h',
         'helper/energy-harvester-helper.h',
diff -Naur ns-3.23/src/fd-net-device/bindings/modulegen__gcc_ILP32.py ns-3.24/src/fd-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -105,7 +105,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
@@ -274,6 +274,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -309,6 +315,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -662,17 +675,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -694,11 +707,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -708,16 +716,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -955,14 +953,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1023,11 +1025,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CriticalSection_methods(root_module, cls):
@@ -2051,7 +2048,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2069,10 +2066,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2136,10 +2133,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -2286,10 +2283,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -2921,10 +2918,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -3489,11 +3486,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4807,6 +4814,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -4819,6 +4827,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/fd-net-device/bindings/modulegen__gcc_LP64.py ns-3.24/src/fd-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -105,7 +105,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
@@ -274,6 +274,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -309,6 +315,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -662,17 +675,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -694,11 +707,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -708,16 +716,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -955,14 +953,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1023,11 +1025,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CriticalSection_methods(root_module, cls):
@@ -2051,7 +2048,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2069,10 +2066,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2136,10 +2133,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -2286,10 +2283,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -2921,10 +2918,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -3489,11 +3486,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4807,6 +4814,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -4819,6 +4827,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/fd-net-device/examples/dummy-network.cc ns-3.24/src/fd-net-device/examples/dummy-network.cc
--- ns-3.23/src/fd-net-device/examples/dummy-network.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/examples/dummy-network.cc	2015-09-15 11:18:44.000000000 -0700
@@ -69,7 +69,7 @@
   app->SetStartTime (Seconds (0.0));
   app->SetStopTime (Seconds (4.0));
 
-  fd.EnablePcapAll ("dummy-network", false);
+  fd.EnablePcapAll ("dummy-network", true);
 
   Simulator::Stop (Seconds (5.));
   Simulator::Run ();
diff -Naur ns-3.23/src/fd-net-device/helper/creator-utils.cc ns-3.24/src/fd-net-device/helper/creator-utils.cc
--- ns-3.23/src/fd-net-device/helper/creator-utils.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/helper/creator-utils.cc	2015-09-15 11:18:44.000000000 -0700
@@ -38,6 +38,7 @@
 
 namespace ns3 {
 
+/// Flag to enable / disable verbose log mode
 int gVerbose = 0;
 
 /**
diff -Naur ns-3.23/src/fd-net-device/helper/creator-utils.h ns-3.24/src/fd-net-device/helper/creator-utils.h
--- ns-3.23/src/fd-net-device/helper/creator-utils.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/helper/creator-utils.h	2015-09-15 11:18:44.000000000 -0700
@@ -54,6 +54,7 @@
     }
 
 /**
+ * \ingroup fd-net-device
  * \brief Send the file descriptor back to the code that invoked the creation.
  *
  * \param path The socket address information from the Unix socket we use
diff -Naur ns-3.23/src/fd-net-device/helper/emu-fd-net-device-helper.cc ns-3.24/src/fd-net-device/helper/emu-fd-net-device-helper.cc
--- ns-3.23/src/fd-net-device/helper/emu-fd-net-device-helper.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/helper/emu-fd-net-device-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -339,7 +339,7 @@
       //
       // 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
+      // an "ancillary element" but the msghdr uses the control message terminology
       // so we call it "control."
       //
       size_t msg_size = sizeof(int);
@@ -350,7 +350,7 @@
       // 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.
+      // controller 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.
diff -Naur ns-3.23/src/fd-net-device/helper/emu-fd-net-device-helper.h ns-3.24/src/fd-net-device/helper/emu-fd-net-device-helper.h
--- ns-3.23/src/fd-net-device/helper/emu-fd-net-device-helper.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/helper/emu-fd-net-device-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -32,6 +32,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup fd-net-device
  * \brief build a set of FdNetDevice objects attached to a physical network
  * interface
  *
@@ -63,6 +64,13 @@
 
 protected:
 
+  /**
+   * This method creates an ns3::FdNetDevice attached to a physical 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;
 
   /**
@@ -73,6 +81,7 @@
   /**
    * Call out to a separate process running as suid root in order to get a raw
    * socket.  We do this to avoid having the entire simulation running as root.
+   * \return the rawSocket number
    */
   virtual int CreateFileDescriptor (void) const;
 
diff -Naur ns-3.23/src/fd-net-device/helper/fd-net-device-helper.h ns-3.24/src/fd-net-device/helper/fd-net-device-helper.h
--- ns-3.23/src/fd-net-device/helper/fd-net-device-helper.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/helper/fd-net-device-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -34,6 +34,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup fd-net-device
  * \brief build a set of FdNetDevice objects
  * Normally we eschew multiple inheritance, however, the classes
  * PcapUserHelperForDevice and AsciiTraceUserHelperForDevice are
@@ -91,6 +92,12 @@
 
 protected:
 
+  /**
+   * This method creates an ns3::FdNetDevice and associates it to a node
+   *
+   * \param node The node to install the device in
+   * \returns A container holding the added net device.
+   */
   virtual Ptr<NetDevice> InstallPriv (Ptr<Node> node) const;
 
 private:
@@ -116,13 +123,14 @@
    * \param stream The output stream object to use when logging ascii traces.
    * \param prefix Filename prefix to use for ascii trace files.
    * \param nd Net device for which you want to enable tracing.
+   * \param explicitFilename Treat the prefix as an explicit filename if true
    */
   virtual void EnableAsciiInternal (Ptr<OutputStreamWrapper> stream,
                                     std::string prefix,
                                     Ptr<NetDevice> nd,
                                     bool explicitFilename);
 
-  ObjectFactory m_deviceFactory;
+  ObjectFactory m_deviceFactory;  //!< factory for the NetDevices
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/fd-net-device/helper/planetlab-fd-net-device-helper.h ns-3.24/src/fd-net-device/helper/planetlab-fd-net-device-helper.h
--- ns-3.23/src/fd-net-device/helper/planetlab-fd-net-device-helper.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/helper/planetlab-fd-net-device-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -36,6 +36,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup fd-net-device
  * \brief build a set of FdNetDevice objects attached to a virtual TAP network
  * interface
  *
@@ -67,6 +68,13 @@
 
 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;
 
   /**
diff -Naur ns-3.23/src/fd-net-device/helper/tap-device-creator.cc ns-3.24/src/fd-net-device/helper/tap-device-creator.cc
--- ns-3.23/src/fd-net-device/helper/tap-device-creator.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/helper/tap-device-creator.cc	2015-09-15 11:18:44.000000000 -0700
@@ -52,10 +52,13 @@
 
 using namespace ns3;
 
+/**
+ * Struct holding IPv6 address data
+ */
 struct in6_ifreq {
-  struct in6_addr ifr6_addr;
-  uint32_t        ifr6_prefixlen;
-  int32_t         ifr6_ifindex;
+  struct in6_addr ifr6_addr;      //!< IPv6 address
+  uint32_t        ifr6_prefixlen; //!< IPv6 prefix length
+  int32_t         ifr6_ifindex;   //!< interface index
 };
 
 char
diff -Naur ns-3.23/src/fd-net-device/helper/tap-fd-net-device-helper.h ns-3.24/src/fd-net-device/helper/tap-fd-net-device-helper.h
--- ns-3.23/src/fd-net-device/helper/tap-fd-net-device-helper.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/helper/tap-fd-net-device-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -34,7 +34,8 @@
 namespace ns3 {
 
 /**
- * \brief build a set of FdNetDevice objects attached to a virtua TAP network
+ * \ingroup fd-net-device
+ * \brief build a set of FdNetDevice objects attached to a virtual TAP network
  * interface
  *
  */
@@ -93,6 +94,13 @@
 
 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;
 
   /**
diff -Naur ns-3.23/src/fd-net-device/model/fd-net-device.cc ns-3.24/src/fd-net-device/model/fd-net-device.cc
--- ns-3.23/src/fd-net-device/model/fd-net-device.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/model/fd-net-device.cc	2015-09-15 11:18:44.000000000 -0700
@@ -168,12 +168,12 @@
 FdNetDevice::FdNetDevice ()
   : m_node (0),
     m_ifIndex (0),
-    m_mtu (1500), // Defaults to Ethernet v2 MTU 
+    // Defaults to Ethernet v2 MTU
+    m_mtu (1500),
     m_fd (-1),
     m_fdReader (0),
     m_isBroadcast (true),
     m_isMulticast (false),
-    m_pendingReadCount (0),
     m_startEvent (),
     m_stopEvent ()
 {
@@ -188,6 +188,18 @@
 FdNetDevice::~FdNetDevice ()
 {
   NS_LOG_FUNCTION (this);
+
+  {
+    CriticalSection cs (m_pendingReadMutex);
+
+    while (!m_pendingQueue.empty ())
+      {
+        std::pair<uint8_t *, ssize_t> next = m_pendingQueue.front ();
+        m_pendingQueue.pop ();
+
+        free (next.first);
+      }
+  }
 }
 
 void
@@ -249,7 +261,7 @@
 
   m_fdReader = Create<FdNetDeviceFdReader> ();
   // 22 bytes covers 14 bytes Ethernet header with possible 8 bytes LLC/SNAP
-  m_fdReader->SetBufferSize(m_mtu + 22);  
+  m_fdReader->SetBufferSize (m_mtu + 22);
   m_fdReader->Start (m_fd, MakeCallback (&FdNetDevice::ReceiveCallback, this));
 
   NotifyLinkUp ();
@@ -281,31 +293,40 @@
 
   {
     CriticalSection cs (m_pendingReadMutex);
-    if (m_pendingReadCount >= m_maxPendingReads)
+    if (m_pendingQueue.size () >= m_maxPendingReads)
       {
         NS_LOG_WARN ("Packet dropped");
         skip = true;
       }
     else
       {
-        ++m_pendingReadCount;
+        m_pendingQueue.push (std::make_pair (buf, len));
       }
   }
 
   if (skip)
     {
-      struct timespec time = { 0, 100000000L }; // 100 ms
+      struct timespec time = {
+        0, 100000000L
+      };                                        // 100 ms
       nanosleep (&time, NULL);
     }
   else
     {
-      Simulator::ScheduleWithContext (m_nodeId, Time (0), MakeEvent (&FdNetDevice::ForwardUp, this, buf, len));
-   }
+      Simulator::ScheduleWithContext (m_nodeId, Time (0), MakeEvent (&FdNetDevice::ForwardUp, this));
+    }
 }
 
-/// \todo Consider having a instance member m_packetBuffer and using memmove
-///  instead of memcpy to add the PI header.
-///  It might be faster in this case to use memmove and avoid the extra mallocs.
+/**
+ * \ingroup fd-net-device
+ * \brief Synthesize PI header for the kernel
+ * \param buf the buffer to add the header to
+ * \param len the buffer length
+ *
+ * \todo Consider having a instance member m_packetBuffer and using memmove
+ * instead of memcpy to add the PI header. It might be faster in this case
+ * to use memmove and avoid the extra mallocs.
+ */
 static void
 AddPIHeader (uint8_t *&buf, ssize_t &len)
 {
@@ -342,6 +363,12 @@
   buf = buf2;
 }
 
+/**
+ * \ingroup fd-net-device
+ * \brief Removes PI header
+ * \param buf the buffer to add the header to
+ * \param len the buffer length
+ */
 static void
 RemovePIHeader (uint8_t *&buf, ssize_t &len)
 {
@@ -355,17 +382,22 @@
 }
 
 void
-FdNetDevice::ForwardUp (uint8_t *buf, ssize_t len)
+FdNetDevice::ForwardUp (void)
 {
-  NS_LOG_FUNCTION (this << buf << len);
 
-  if (m_pendingReadCount > 0)
-    {
-      {
-        CriticalSection cs (m_pendingReadMutex);
-        --m_pendingReadCount;
-      }
-    }
+  uint8_t *buf = 0; 
+  ssize_t len = 0;
+
+  {
+    CriticalSection cs (m_pendingReadMutex);
+    std::pair<uint8_t *, ssize_t> next = m_pendingQueue.front ();
+    m_pendingQueue.pop ();
+
+    buf = next.first;
+    len = next.second;
+  }
+
+  NS_LOG_FUNCTION (this << buf << len);
 
   // We need to remove the PI header and ignore it
   if (m_encapMode == DIXPI)
diff -Naur ns-3.23/src/fd-net-device/model/fd-net-device.h ns-3.24/src/fd-net-device/model/fd-net-device.h
--- ns-3.23/src/fd-net-device/model/fd-net-device.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/fd-net-device/model/fd-net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -36,39 +36,41 @@
 #include "ns3/unix-fd-reader.h"
 #include "ns3/system-mutex.h"
 
-#include <string.h>
+#include <utility>
+#include <queue>
 
 namespace ns3 {
 
+
+/**
+ * \defgroup fd-net-device File Descriptor Network Device
+ * This section documents the API of the ns-3 fd-net-device module.
+ * For a generic functional description, please refer to the ns-3 manual.
+ */
+
+/**
+ * \ingroup fd-net-device
+ * \brief This class performs the actual data reading from the sockets.
+ */
 class FdNetDeviceFdReader : public FdReader
 {
 public:
-  /**
-   * Constructor for the FdNetDevice.
-   */
   FdNetDeviceFdReader ();
 
   /**
    * Set size of the read buffer.
-   *
    */
   void SetBufferSize (uint32_t bufferSize);
 
 private:
   FdReader::Data DoRead (void);
-  
-  uint32_t m_bufferSize;
+
+  uint32_t m_bufferSize; //!< size of the read buffer
 };
 
 class Node;
 
 /**
- * \defgroup fd-net-device File Descriptor Network Device
- * This section documents the API of the ns-3 fd-net-device module.
- * For a generic functional description, please refer to the ns-3 manual.
- */
-
-/**
  * \ingroup fd-net-device
  *
  * \brief a NetDevice to read/write network traffic from/into a file descriptor.
@@ -82,6 +84,10 @@
 class FdNetDevice : public NetDevice
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -170,15 +176,27 @@
   virtual bool SupportsSendFrom () const;
   virtual Address GetMulticast (Ipv6Address addr) const;
 
+  /**
+   * Set if the NetDevice is able to send Broadcast messages
+   * \param broadcast true if the NetDevice can send Broadcast
+   */
   virtual void SetIsBroadcast (bool broadcast);
+  /**
+   * Set if the NetDevice is able to send Multicast messages
+   * \param multicast true if the NetDevice can send Multicast
+   */
   virtual void SetIsMulticast (bool multicast);
 
 protected:
   virtual void DoDispose (void);
 
 private:
-  // private copy constructor as sugested in:
-  // http://www.nsnam.org/wiki/NS-3_Python_Bindings#.22invalid_use_of_incomplete_type.22
+  /**
+   * \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 &);
 
   /**
@@ -199,7 +217,7 @@
   /**
    * Forward the frame to the appropriate callback for processing
    */
-  void ForwardUp (uint8_t *buf, ssize_t len);
+  void ForwardUp (void);
 
   /**
    * Start Sending a Packet Down the Wire.
@@ -208,6 +226,9 @@
    */
   bool TransmitStart (Ptr<Packet> p);
 
+  /**
+   * Notify that the link is up and ready
+   */
   void NotifyLinkUp (void);
 
   /**
@@ -215,7 +236,7 @@
    */
   Ptr<Node> m_node;
 
-  /*
+  /**
    * 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
    * multithreaded apps is not a good thing.
@@ -278,14 +299,13 @@
   /**
    * Number of packets that were received and scheduled for read but not yeat read.
    */
-  uint32_t m_pendingReadCount;
-  
+  std::queue< std::pair<uint8_t *, ssize_t> > m_pendingQueue;
+
   /**
    * Maximum number of packets that can be received and scheduled for read but not yeat read.
    */
   uint32_t m_maxPendingReads;
-  
-   
+
   /**
    * Mutex to increase pending read counter.
    */
@@ -301,7 +321,13 @@
    */
   Time m_tStop;
 
+  /**
+   * NetDevice start event
+   */
   EventId m_startEvent;
+  /**
+   * NetDevice stop event
+   */
   EventId m_stopEvent;
 
   /**
@@ -361,6 +387,8 @@
    * The trace source fired when the phy layer drops a packet as it tries
    * to transmit it.
    *
+   * \todo Remove: this TracedCallback is never invoked.
+   *
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_phyTxDropTrace;
diff -Naur ns-3.23/src/flow-monitor/bindings/modulegen__gcc_ILP32.py ns-3.24/src/flow-monitor/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/flow-monitor/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/flow-monitor/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -82,6 +82,10 @@
     module.add_enum('Scope_e', ['HOST', 'LINKLOCAL', 'GLOBAL'], outer_class=root_module['ns3::Ipv6InterfaceAddress'], import_from_module='ns.internet')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
@@ -282,6 +286,10 @@
     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'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -332,6 +340,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -367,6 +381,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -391,6 +412,7 @@
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
@@ -476,6 +498,8 @@
     register_Ns3Ipv6PmtuCache_methods(root_module, root_module['ns3::Ipv6PmtuCache'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     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'])
@@ -613,17 +637,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -645,11 +669,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -659,16 +678,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -906,14 +915,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -974,11 +987,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -1779,6 +1787,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NodeContainer_methods(root_module, cls):
     ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NodeContainer const &', 'arg0')])
@@ -2136,7 +2216,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2228,10 +2308,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4138,11 +4218,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4390,6 +4480,11 @@
                    'std::map< unsigned int, ns3::FlowProbe::FlowStats >', 
                    [], 
                    is_const=True)
+    ## flow-probe.h (module 'flow-monitor'): static ns3::TypeId ns3::FlowProbe::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## flow-probe.h (module 'flow-monitor'): void ns3::FlowProbe::SerializeToXmlStream(std::ostream & os, int indent, uint32_t index) const [member function]
     cls.add_method('SerializeToXmlStream', 
                    'void', 
@@ -4682,6 +4777,11 @@
 def register_Ns3Ipv4FlowProbe_methods(root_module, cls):
     ## ipv4-flow-probe.h (module 'flow-monitor'): ns3::Ipv4FlowProbe::Ipv4FlowProbe(ns3::Ptr<ns3::FlowMonitor> monitor, ns3::Ptr<ns3::Ipv4FlowClassifier> classifier, ns3::Ptr<ns3::Node> node) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::FlowMonitor >', 'monitor'), param('ns3::Ptr< ns3::Ipv4FlowClassifier >', 'classifier'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv4-flow-probe.h (module 'flow-monitor'): static ns3::TypeId ns3::Ipv4FlowProbe::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## ipv4-flow-probe.h (module 'flow-monitor'): void ns3::Ipv4FlowProbe::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -5330,6 +5430,11 @@
 def register_Ns3Ipv6FlowProbe_methods(root_module, cls):
     ## ipv6-flow-probe.h (module 'flow-monitor'): ns3::Ipv6FlowProbe::Ipv6FlowProbe(ns3::Ptr<ns3::FlowMonitor> monitor, ns3::Ptr<ns3::Ipv6FlowClassifier> classifier, ns3::Ptr<ns3::Node> node) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::FlowMonitor >', 'monitor'), param('ns3::Ptr< ns3::Ipv6FlowClassifier >', 'classifier'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv6-flow-probe.h (module 'flow-monitor'): static ns3::TypeId ns3::Ipv6FlowProbe::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## ipv6-flow-probe.h (module 'flow-monitor'): void ns3::Ipv6FlowProbe::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -5652,6 +5757,46 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -6371,6 +6516,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -6383,6 +6529,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/flow-monitor/bindings/modulegen__gcc_LP64.py ns-3.24/src/flow-monitor/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/flow-monitor/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/flow-monitor/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -82,6 +82,10 @@
     module.add_enum('Scope_e', ['HOST', 'LINKLOCAL', 'GLOBAL'], outer_class=root_module['ns3::Ipv6InterfaceAddress'], import_from_module='ns.internet')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
@@ -282,6 +286,10 @@
     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'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -332,6 +340,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -367,6 +381,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -391,6 +412,7 @@
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
@@ -476,6 +498,8 @@
     register_Ns3Ipv6PmtuCache_methods(root_module, root_module['ns3::Ipv6PmtuCache'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     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'])
@@ -613,17 +637,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -645,11 +669,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -659,16 +678,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -906,14 +915,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -974,11 +987,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -1779,6 +1787,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NodeContainer_methods(root_module, cls):
     ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NodeContainer const &', 'arg0')])
@@ -2136,7 +2216,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2228,10 +2308,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4138,11 +4218,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4390,6 +4480,11 @@
                    'std::map< unsigned int, ns3::FlowProbe::FlowStats >', 
                    [], 
                    is_const=True)
+    ## flow-probe.h (module 'flow-monitor'): static ns3::TypeId ns3::FlowProbe::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## flow-probe.h (module 'flow-monitor'): void ns3::FlowProbe::SerializeToXmlStream(std::ostream & os, int indent, uint32_t index) const [member function]
     cls.add_method('SerializeToXmlStream', 
                    'void', 
@@ -4682,6 +4777,11 @@
 def register_Ns3Ipv4FlowProbe_methods(root_module, cls):
     ## ipv4-flow-probe.h (module 'flow-monitor'): ns3::Ipv4FlowProbe::Ipv4FlowProbe(ns3::Ptr<ns3::FlowMonitor> monitor, ns3::Ptr<ns3::Ipv4FlowClassifier> classifier, ns3::Ptr<ns3::Node> node) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::FlowMonitor >', 'monitor'), param('ns3::Ptr< ns3::Ipv4FlowClassifier >', 'classifier'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv4-flow-probe.h (module 'flow-monitor'): static ns3::TypeId ns3::Ipv4FlowProbe::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## ipv4-flow-probe.h (module 'flow-monitor'): void ns3::Ipv4FlowProbe::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -5330,6 +5430,11 @@
 def register_Ns3Ipv6FlowProbe_methods(root_module, cls):
     ## ipv6-flow-probe.h (module 'flow-monitor'): ns3::Ipv6FlowProbe::Ipv6FlowProbe(ns3::Ptr<ns3::FlowMonitor> monitor, ns3::Ptr<ns3::Ipv6FlowClassifier> classifier, ns3::Ptr<ns3::Node> node) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::FlowMonitor >', 'monitor'), param('ns3::Ptr< ns3::Ipv6FlowClassifier >', 'classifier'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv6-flow-probe.h (module 'flow-monitor'): static ns3::TypeId ns3::Ipv6FlowProbe::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## ipv6-flow-probe.h (module 'flow-monitor'): void ns3::Ipv6FlowProbe::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -5652,6 +5757,46 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -6371,6 +6516,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -6383,6 +6529,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/flow-monitor/model/flow-probe.cc ns-3.24/src/flow-monitor/model/flow-probe.cc
--- ns-3.23/src/flow-monitor/model/flow-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/flow-monitor/model/flow-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -23,6 +23,17 @@
 
 namespace ns3 {
 
+/* static */
+TypeId FlowProbe::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::FlowProbe")
+    .SetParent<Object> ()
+    .SetGroupName ("FlowMonitor")
+    // No AddConstructor because this class has no default constructor.
+    ;
+
+  return tid;
+}
 
 FlowProbe::~FlowProbe ()
 {
diff -Naur ns-3.23/src/flow-monitor/model/flow-probe.h ns-3.24/src/flow-monitor/model/flow-probe.h
--- ns-3.23/src/flow-monitor/model/flow-probe.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/flow-monitor/model/flow-probe.h	2015-09-15 11:18:44.000000000 -0700
@@ -54,6 +54,10 @@
 public:
   virtual ~FlowProbe ();
 
+  /// Register this type.
+  /// \return The TypeId.
+  static TypeId GetTypeId (void);
+  
   /// Structure to hold the statistics of a flow
   struct FlowStats
   {
diff -Naur ns-3.23/src/flow-monitor/model/ipv4-flow-probe.cc ns-3.24/src/flow-monitor/model/ipv4-flow-probe.cc
--- ns-3.23/src/flow-monitor/model/ipv4-flow-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/flow-monitor/model/ipv4-flow-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -231,6 +231,19 @@
 {
 }
 
+/* static */
+TypeId
+Ipv4FlowProbe::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::Ipv4FlowProbe")
+    .SetParent<FlowProbe> ()
+    .SetGroupName ("FlowMonitor")
+    // No AddConstructor because this class has no default constructor.
+    ;
+
+  return tid;
+}
+
 void
 Ipv4FlowProbe::DoDispose ()
 {
diff -Naur ns-3.23/src/flow-monitor/model/ipv4-flow-probe.h ns-3.24/src/flow-monitor/model/ipv4-flow-probe.h
--- ns-3.23/src/flow-monitor/model/ipv4-flow-probe.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/flow-monitor/model/ipv4-flow-probe.h	2015-09-15 11:18:44.000000000 -0700
@@ -48,6 +48,10 @@
   Ipv4FlowProbe (Ptr<FlowMonitor> monitor, Ptr<Ipv4FlowClassifier> classifier, Ptr<Node> node);
   virtual ~Ipv4FlowProbe ();
 
+  /// Register this type.
+  /// \return The TypeId.
+  static TypeId GetTypeId (void);
+  
   /// \brief enumeration of possible reasons why a packet may be dropped
   enum DropReason 
   {
diff -Naur ns-3.23/src/flow-monitor/model/ipv6-flow-probe.cc ns-3.24/src/flow-monitor/model/ipv6-flow-probe.cc
--- ns-3.23/src/flow-monitor/model/ipv6-flow-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/flow-monitor/model/ipv6-flow-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -228,6 +228,19 @@
   Config::ConnectWithoutContext (oss.str (), MakeCallback (&Ipv6FlowProbe::QueueDropLogger, Ptr<Ipv6FlowProbe> (this)));
 }
 
+/* static */
+TypeId
+Ipv6FlowProbe::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::Ipv6FlowProbe")
+    .SetParent<FlowProbe> ()
+    .SetGroupName ("FlowMonitor")
+    // No AddConstructor because this class has no default constructor.
+    ;
+
+  return tid;
+}
+
 Ipv6FlowProbe::~Ipv6FlowProbe ()
 {
 }
diff -Naur ns-3.23/src/flow-monitor/model/ipv6-flow-probe.h ns-3.24/src/flow-monitor/model/ipv6-flow-probe.h
--- ns-3.23/src/flow-monitor/model/ipv6-flow-probe.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/flow-monitor/model/ipv6-flow-probe.h	2015-09-15 11:18:44.000000000 -0700
@@ -49,6 +49,10 @@
   Ipv6FlowProbe (Ptr<FlowMonitor> monitor, Ptr<Ipv6FlowClassifier> classifier, Ptr<Node> node);
   virtual ~Ipv6FlowProbe ();
 
+  /// Register this type.
+  /// \return The TypeId.
+  static TypeId GetTypeId (void);
+
   /// \brief enumeration of possible reasons why a packet may be dropped
   enum DropReason 
   {
diff -Naur ns-3.23/src/internet/bindings/callbacks_list.py ns-3.24/src/internet/bindings/callbacks_list.py
--- ns-3.23/src/internet/bindings/callbacks_list.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/bindings/callbacks_list.py	2015-09-15 11:18:44.000000000 -0700
@@ -1,8 +1,6 @@
 callback_classes = [
     ['void', 'ns3::Ipv6Address', 'unsigned char', 'unsigned char', 'unsigned char', 'unsigned int', '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', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', '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::Ptr<ns3::Socket>', 'ns3::empty', '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::Socket>', 'ns3::Address const&', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur ns-3.23/src/internet/bindings/modulegen__gcc_ILP32.py ns-3.24/src/internet/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/internet/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -20,8 +20,6 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## tcp-socket.h (module 'internet'): ns3::TcpStates_t [enumeration]
-    module.add_enum('TcpStates_t', ['CLOSED', 'LISTEN', 'SYN_SENT', 'SYN_RCVD', 'ESTABLISHED', 'CLOSE_WAIT', 'LAST_ACK', 'FIN_WAIT_1', 'FIN_WAIT_2', 'CLOSING', 'TIME_WAIT', 'LAST_STATE'])
     ## address.h (module 'network'): ns3::Address [class]
     module.add_class('Address', import_from_module='ns.network')
     ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
@@ -120,8 +118,6 @@
     module.add_class('Ipv4AddressGenerator')
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper [class]
     module.add_class('Ipv4AddressHelper')
-    ## ipv4-end-point.h (module 'internet'): ns3::Ipv4EndPoint [class]
-    module.add_class('Ipv4EndPoint')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -203,7 +199,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -250,8 +246,8 @@
     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]
     root_module['ns3::TracedValue< ns3::SequenceNumber<unsigned int, int> >'].implicitly_converts_to(root_module['ns3::SequenceNumber32'])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpStates_t> [class]
-    module.add_class('TracedValue', template_parameters=['ns3::TcpStates_t'])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpSocket::TcpStates_t> [class]
+    module.add_class('TracedValue', template_parameters=['ns3::TcpSocket::TcpStates_t'])
     ## 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]
@@ -450,6 +446,8 @@
     module.add_class('TcpRxBuffer', parent=root_module['ns3::Object'])
     ## tcp-socket.h (module 'internet'): ns3::TcpSocket [class]
     module.add_class('TcpSocket', parent=root_module['ns3::Socket'])
+    ## tcp-socket.h (module 'internet'): ns3::TcpSocket::TcpStates_t [enumeration]
+    module.add_enum('TcpStates_t', ['CLOSED', 'LISTEN', 'SYN_SENT', 'SYN_RCVD', 'ESTABLISHED', 'CLOSE_WAIT', 'LAST_ACK', 'FIN_WAIT_1', 'FIN_WAIT_2', 'CLOSING', 'TIME_WAIT', 'LAST_STATE'], outer_class=root_module['ns3::TcpSocket'])
     ## tcp-socket-base.h (module 'internet'): ns3::TcpSocketBase [class]
     module.add_class('TcpSocketBase', parent=root_module['ns3::TcpSocket'])
     ## tcp-socket-factory.h (module 'internet'): ns3::TcpSocketFactory [class]
@@ -745,15 +743,12 @@
     typehandlers.add_type_alias(u'std::deque< ns3::RttHistory, std::allocator< ns3::RttHistory > >', u'ns3::RttHistory_t')
     typehandlers.add_type_alias(u'std::deque< ns3::RttHistory, std::allocator< ns3::RttHistory > >*', u'ns3::RttHistory_t*')
     typehandlers.add_type_alias(u'std::deque< ns3::RttHistory, std::allocator< ns3::RttHistory > >&', u'ns3::RttHistory_t&')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpStates_t, ns3::TcpStates_t ) *', u'ns3::TcpStatesTracedValueCallback')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpStates_t, ns3::TcpStates_t ) **', u'ns3::TcpStatesTracedValueCallback*')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpStates_t, ns3::TcpStates_t ) *&', u'ns3::TcpStatesTracedValueCallback&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpSocket::TcpStates_t, ns3::TcpSocket::TcpStates_t ) *', u'ns3::TcpStatesTracedValueCallback')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpSocket::TcpStates_t, ns3::TcpSocket::TcpStates_t ) **', u'ns3::TcpStatesTracedValueCallback*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpSocket::TcpStates_t, ns3::TcpSocket::TcpStates_t ) *&', u'ns3::TcpStatesTracedValueCallback&')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >', u'ns3::SequenceNumber8')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >*', u'ns3::SequenceNumber8*')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >&', u'ns3::SequenceNumber8&')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::SequenceNumber32TracedValueCallback')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::SequenceNumber32TracedValueCallback*')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::SequenceNumber32TracedValueCallback&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -767,6 +762,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -807,6 +808,40 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -847,7 +882,6 @@
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
     register_Ns3Ipv4AddressGenerator_methods(root_module, root_module['ns3::Ipv4AddressGenerator'])
     register_Ns3Ipv4AddressHelper_methods(root_module, root_module['ns3::Ipv4AddressHelper'])
-    register_Ns3Ipv4EndPoint_methods(root_module, root_module['ns3::Ipv4EndPoint'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
@@ -899,7 +933,7 @@
     register_Ns3TracedValue__Bool_methods(root_module, root_module['ns3::TracedValue< bool >'])
     register_Ns3TracedValue__Double_methods(root_module, root_module['ns3::TracedValue< double >'])
     register_Ns3TracedValue__Ns3SequenceNumber__lt__unsigned_int__int__gt___methods(root_module, root_module['ns3::TracedValue< ns3::SequenceNumber<unsigned int, int> >'])
-    register_Ns3TracedValue__Ns3TcpStates_t_methods(root_module, root_module['ns3::TracedValue< ns3::TcpStates_t >'])
+    register_Ns3TracedValue__Ns3TcpSocketTcpStates_t_methods(root_module, root_module['ns3::TracedValue< ns3::TcpSocket::TcpStates_t >'])
     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'])
@@ -1472,17 +1506,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1504,11 +1538,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1518,16 +1547,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1765,14 +1784,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1833,11 +1856,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CandidateQueue_methods(root_module, cls):
@@ -2515,65 +2533,6 @@
                    [param('ns3::Ipv4Address', 'network'), param('ns3::Ipv4Mask', 'mask'), param('ns3::Ipv4Address', 'base', default_value='"0.0.0.1"')])
     return
 
-def register_Ns3Ipv4EndPoint_methods(root_module, cls):
-    ## ipv4-end-point.h (module 'internet'): ns3::Ipv4EndPoint::Ipv4EndPoint(ns3::Ipv4EndPoint const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Ipv4EndPoint const &', 'arg0')])
-    ## ipv4-end-point.h (module 'internet'): ns3::Ipv4EndPoint::Ipv4EndPoint(ns3::Ipv4Address address, uint16_t port) [constructor]
-    cls.add_constructor([param('ns3::Ipv4Address', 'address'), param('uint16_t', 'port')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::BindToNetDevice(ns3::Ptr<ns3::NetDevice> netdevice) [member function]
-    cls.add_method('BindToNetDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'netdevice')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::ForwardIcmp(ns3::Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo) [member function]
-    cls.add_method('ForwardIcmp', 
-                   'void', 
-                   [param('ns3::Ipv4Address', 'icmpSource'), param('uint8_t', 'icmpTtl'), param('uint8_t', 'icmpType'), param('uint8_t', 'icmpCode'), param('uint32_t', 'icmpInfo')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::ForwardUp(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & header, uint16_t sport, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
-    cls.add_method('ForwardUp', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('uint16_t', 'sport'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')])
-    ## ipv4-end-point.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4EndPoint::GetBoundNetDevice() [member function]
-    cls.add_method('GetBoundNetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [])
-    ## ipv4-end-point.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4EndPoint::GetLocalAddress() [member function]
-    cls.add_method('GetLocalAddress', 
-                   'ns3::Ipv4Address', 
-                   [])
-    ## ipv4-end-point.h (module 'internet'): uint16_t ns3::Ipv4EndPoint::GetLocalPort() [member function]
-    cls.add_method('GetLocalPort', 
-                   'uint16_t', 
-                   [])
-    ## ipv4-end-point.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4EndPoint::GetPeerAddress() [member function]
-    cls.add_method('GetPeerAddress', 
-                   'ns3::Ipv4Address', 
-                   [])
-    ## ipv4-end-point.h (module 'internet'): uint16_t ns3::Ipv4EndPoint::GetPeerPort() [member function]
-    cls.add_method('GetPeerPort', 
-                   'uint16_t', 
-                   [])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::SetDestroyCallback(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('SetDestroyCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::SetIcmpCallback(ns3::Callback<void, ns3::Ipv4Address, unsigned char, unsigned char, unsigned char, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetIcmpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ipv4Address, unsigned char, unsigned char, unsigned char, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::SetLocalAddress(ns3::Ipv4Address address) [member function]
-    cls.add_method('SetLocalAddress', 
-                   'void', 
-                   [param('ns3::Ipv4Address', 'address')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::SetPeer(ns3::Ipv4Address address, uint16_t port) [member function]
-    cls.add_method('SetPeer', 
-                   'void', 
-                   [param('ns3::Ipv4Address', 'address'), param('uint16_t', 'port')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::SetRxCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::Ipv4Header, unsigned short, ns3::Ptr<ns3::Ipv4Interface>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetRxCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Ipv4Header, unsigned short, ns3::Ptr< ns3::Ipv4Interface >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    return
-
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
@@ -4205,7 +4164,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -4223,10 +4182,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -4290,10 +4249,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -4751,10 +4710,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -5047,38 +5006,38 @@
                    [param('ns3::SequenceNumber< unsigned int, int > const &', 'v')])
     return
 
-def register_Ns3TracedValue__Ns3TcpStates_t_methods(root_module, cls):
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpStates_t>::TracedValue() [constructor]
+def register_Ns3TracedValue__Ns3TcpSocketTcpStates_t_methods(root_module, cls):
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::TracedValue() [constructor]
     cls.add_constructor([])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpStates_t>::TracedValue(ns3::TracedValue<ns3::TcpStates_t> const & o) [copy constructor]
-    cls.add_constructor([param('ns3::TracedValue< ns3::TcpStates_t > const &', 'o')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpStates_t>::TracedValue(ns3::TcpStates_t const & v) [constructor]
-    cls.add_constructor([param('ns3::TcpStates_t const &', 'v')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpStates_t>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > path) [member function]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::TracedValue(ns3::TracedValue<ns3::TcpSocket::TcpStates_t> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TracedValue< ns3::TcpSocket::TcpStates_t > const &', 'o')])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::TracedValue(ns3::TcpSocket::TcpStates_t const & v) [constructor]
+    cls.add_constructor([param('ns3::TcpSocket::TcpStates_t const &', 'v')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::TcpStates_t>::ConnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::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::TcpStates_t>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > path) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::TcpStates_t>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
     cls.add_method('DisconnectWithoutContext', 
                    'void', 
                    [param('ns3::CallbackBase const &', 'cb')])
-    ## traced-value.h (module 'core'): ns3::TcpStates_t ns3::TracedValue<ns3::TcpStates_t>::Get() const [member function]
+    ## traced-value.h (module 'core'): ns3::TcpSocket::TcpStates_t ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::Get() const [member function]
     cls.add_method('Get', 
-                   'ns3::TcpStates_t', 
+                   'ns3::TcpSocket::TcpStates_t', 
                    [], 
                    is_const=True)
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpStates_t>::Set(ns3::TcpStates_t const & v) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::Set(ns3::TcpSocket::TcpStates_t const & v) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('ns3::TcpStates_t const &', 'v')])
+                   [param('ns3::TcpSocket::TcpStates_t const &', 'v')])
     return
 
 def register_Ns3TracedValue__Unsigned_int_methods(root_module, cls):
@@ -7651,10 +7610,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -8875,6 +8834,7 @@
     return
 
 def register_Ns3TcpHeader_methods(root_module, cls):
+    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
     ## tcp-header.h (module 'internet'): ns3::TcpHeader::TcpHeader(ns3::TcpHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::TcpHeader const &', 'arg0')])
@@ -8963,18 +8923,18 @@
                    'bool', 
                    [param('uint8_t', 'kind')], 
                    is_const=True)
-    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Ipv4Address source, ns3::Ipv4Address destination, uint8_t protocol) [member function]
+    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Ipv4Address const & source, ns3::Ipv4Address const & destination, uint8_t protocol) [member function]
     cls.add_method('InitializeChecksum', 
                    'void', 
-                   [param('ns3::Ipv4Address', 'source'), param('ns3::Ipv4Address', 'destination'), param('uint8_t', 'protocol')])
-    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Ipv6Address source, ns3::Ipv6Address destination, uint8_t protocol) [member function]
+                   [param('ns3::Ipv4Address const &', 'source'), param('ns3::Ipv4Address const &', 'destination'), param('uint8_t', 'protocol')])
+    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Ipv6Address const & source, ns3::Ipv6Address const & destination, uint8_t protocol) [member function]
     cls.add_method('InitializeChecksum', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'source'), param('ns3::Ipv6Address', 'destination'), param('uint8_t', 'protocol')])
-    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Address source, ns3::Address destination, uint8_t protocol) [member function]
+                   [param('ns3::Ipv6Address const &', 'source'), param('ns3::Ipv6Address const &', 'destination'), param('uint8_t', 'protocol')])
+    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Address const & source, ns3::Address const & destination, uint8_t protocol) [member function]
     cls.add_method('InitializeChecksum', 
                    'void', 
-                   [param('ns3::Address', 'source'), param('ns3::Address', 'destination'), param('uint8_t', 'protocol')])
+                   [param('ns3::Address const &', 'source'), param('ns3::Address const &', 'destination'), param('uint8_t', 'protocol')])
     ## tcp-header.h (module 'internet'): bool ns3::TcpHeader::IsChecksumOk() const [member function]
     cls.add_method('IsChecksumOk', 
                    'bool', 
@@ -9550,15 +9510,10 @@
                    'int', 
                    [], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DoForwardUp(ns3::Ptr<ns3::Packet> packet, ns3::Ipv4Header header, uint16_t port, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
-    cls.add_method('DoForwardUp', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Header', 'header'), param('uint16_t', 'port'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DoForwardUp(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Header header, uint16_t port) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DoForwardUp(ns3::Ptr<ns3::Packet> packet, ns3::Address const & fromAddress, ns3::Address const & toAddress) [member function]
     cls.add_method('DoForwardUp', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Header', 'header'), param('uint16_t', 'port')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'fromAddress'), param('ns3::Address const &', 'toAddress')], 
                    visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DoPeerClose() [member function]
     cls.add_method('DoPeerClose', 
@@ -9634,12 +9589,12 @@
     cls.add_method('GetInitialCwnd', 
                    'uint32_t', 
                    [], 
-                   is_pure_virtual=True, is_const=True, visibility='protected', is_virtual=True)
+                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): uint32_t ns3::TcpSocketBase::GetInitialSSThresh() const [member function]
     cls.add_method('GetInitialSSThresh', 
                    'uint32_t', 
                    [], 
-                   is_pure_virtual=True, is_const=True, visibility='protected', is_virtual=True)
+                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): ns3::Time ns3::TcpSocketBase::GetPersistTimeout() const [member function]
     cls.add_method('GetPersistTimeout', 
                    'ns3::Time', 
@@ -9665,6 +9620,11 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected', is_virtual=True)
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::InitializeCwnd() [member function]
+    cls.add_method('InitializeCwnd', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::LastAckTimeout() [member function]
     cls.add_method('LastAckTimeout', 
                    'void', 
@@ -9764,7 +9724,7 @@
     cls.add_method('ScaleSsThresh', 
                    'void', 
                    [param('uint8_t', 'scaleFactor')], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+                   visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): uint32_t ns3::TcpSocketBase::SendDataPacket(ns3::SequenceNumber32 seq, uint32_t maxSize, bool withAck) [member function]
     cls.add_method('SendDataPacket', 
                    'uint32_t', 
@@ -9814,12 +9774,12 @@
     cls.add_method('SetInitialCwnd', 
                    'void', 
                    [param('uint32_t', 'cwnd')], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+                   visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::SetInitialSSThresh(uint32_t threshold) [member function]
     cls.add_method('SetInitialSSThresh', 
                    'void', 
                    [param('uint32_t', 'threshold')], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+                   visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::SetPersistTimeout(ns3::Time timeout) [member function]
     cls.add_method('SetPersistTimeout', 
                    'void', 
@@ -9879,7 +9839,7 @@
     cls.add_method('Window', 
                    'uint32_t', 
                    [], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TcpSocketFactory_methods(root_module, cls):
@@ -9899,21 +9859,11 @@
     cls.add_constructor([])
     ## tcp-tahoe.h (module 'internet'): ns3::TcpTahoe::TcpTahoe(ns3::TcpTahoe const & sock) [copy constructor]
     cls.add_constructor([param('ns3::TcpTahoe const &', 'sock')])
-    ## tcp-tahoe.h (module 'internet'): int ns3::TcpTahoe::Connect(ns3::Address const & address) [member function]
-    cls.add_method('Connect', 
-                   'int', 
-                   [param('ns3::Address const &', 'address')], 
-                   is_virtual=True)
     ## tcp-tahoe.h (module 'internet'): static ns3::TypeId ns3::TcpTahoe::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## tcp-tahoe.h (module 'internet'): int ns3::TcpTahoe::Listen() [member function]
-    cls.add_method('Listen', 
-                   'int', 
-                   [], 
-                   is_virtual=True)
     ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
@@ -9924,16 +9874,6 @@
                    'ns3::Ptr< ns3::TcpSocketBase >', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): uint32_t ns3::TcpTahoe::GetInitialCwnd() const [member function]
-    cls.add_method('GetInitialCwnd', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): uint32_t ns3::TcpTahoe::GetInitialSSThresh() const [member function]
-    cls.add_method('GetInitialSSThresh', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::NewAck(ns3::SequenceNumber32 const & seq) [member function]
     cls.add_method('NewAck', 
                    'void', 
@@ -9944,31 +9884,6 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::ScaleSsThresh(uint8_t scaleFactor) [member function]
-    cls.add_method('ScaleSsThresh', 
-                   'void', 
-                   [param('uint8_t', 'scaleFactor')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::SetInitialCwnd(uint32_t cwnd) [member function]
-    cls.add_method('SetInitialCwnd', 
-                   'void', 
-                   [param('uint32_t', 'cwnd')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::SetInitialSSThresh(uint32_t threshold) [member function]
-    cls.add_method('SetInitialSSThresh', 
-                   'void', 
-                   [param('uint32_t', 'threshold')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::SetSegSize(uint32_t size) [member function]
-    cls.add_method('SetSegSize', 
-                   'void', 
-                   [param('uint32_t', 'size')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): uint32_t ns3::TcpTahoe::Window() [member function]
-    cls.add_method('Window', 
-                   'uint32_t', 
-                   [], 
-                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TcpTxBuffer_methods(root_module, cls):
@@ -10038,21 +9953,11 @@
     cls.add_constructor([])
     ## tcp-westwood.h (module 'internet'): ns3::TcpWestwood::TcpWestwood(ns3::TcpWestwood const & sock) [copy constructor]
     cls.add_constructor([param('ns3::TcpWestwood const &', 'sock')])
-    ## tcp-westwood.h (module 'internet'): int ns3::TcpWestwood::Connect(ns3::Address const & address) [member function]
-    cls.add_method('Connect', 
-                   'int', 
-                   [param('ns3::Address const &', 'address')], 
-                   is_virtual=True)
     ## tcp-westwood.h (module 'internet'): static ns3::TypeId ns3::TcpWestwood::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## tcp-westwood.h (module 'internet'): int ns3::TcpWestwood::Listen() [member function]
-    cls.add_method('Listen', 
-                   'int', 
-                   [], 
-                   is_virtual=True)
     ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
@@ -10068,16 +9973,6 @@
                    'ns3::Ptr< ns3::TcpSocketBase >', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): uint32_t ns3::TcpWestwood::GetInitialCwnd() const [member function]
-    cls.add_method('GetInitialCwnd', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): uint32_t ns3::TcpWestwood::GetInitialSSThresh() const [member function]
-    cls.add_method('GetInitialSSThresh', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::NewAck(ns3::SequenceNumber32 const & seq) [member function]
     cls.add_method('NewAck', 
                    'void', 
@@ -10093,31 +9988,6 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::ScaleSsThresh(uint8_t scaleFactor) [member function]
-    cls.add_method('ScaleSsThresh', 
-                   'void', 
-                   [param('uint8_t', 'scaleFactor')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::SetInitialCwnd(uint32_t cwnd) [member function]
-    cls.add_method('SetInitialCwnd', 
-                   'void', 
-                   [param('uint32_t', 'cwnd')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::SetInitialSSThresh(uint32_t threshold) [member function]
-    cls.add_method('SetInitialSSThresh', 
-                   'void', 
-                   [param('uint32_t', 'threshold')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::SetSegSize(uint32_t size) [member function]
-    cls.add_method('SetSegSize', 
-                   'void', 
-                   [param('uint32_t', 'size')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): uint32_t ns3::TcpWestwood::Window() [member function]
-    cls.add_method('Window', 
-                   'uint32_t', 
-                   [], 
-                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3Time_methods(root_module, cls):
@@ -10828,6 +10698,10 @@
     cls.add_method('PrintArpCache', 
                    'void', 
                    [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Remove(ns3::ArpCache::Entry * entry) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::ArpCache::Entry *', 'entry')])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::SetAliveTimeout(ns3::Time aliveTimeout) [member function]
     cls.add_method('SetAliveTimeout', 
                    'void', 
@@ -10864,6 +10738,10 @@
     cls.add_constructor([param('ns3::ArpCache::Entry const &', 'arg0')])
     ## arp-cache.h (module 'internet'): ns3::ArpCache::Entry::Entry(ns3::ArpCache * arp) [constructor]
     cls.add_constructor([param('ns3::ArpCache *', 'arp')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearPendingPacket() [member function]
+    cls.add_method('ClearPendingPacket', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearRetries() [member function]
     cls.add_method('ClearRetries', 
                    'void', 
@@ -10904,6 +10782,10 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsPermanent() [member function]
+    cls.add_method('IsPermanent', 
+                   'bool', 
+                   [])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsWaitReply() [member function]
     cls.add_method('IsWaitReply', 
                    'bool', 
@@ -10916,6 +10798,10 @@
     cls.add_method('MarkDead', 
                    'void', 
                    [])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkPermanent() [member function]
+    cls.add_method('MarkPermanent', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('MarkWaitReply', 
                    'void', 
@@ -10924,6 +10810,10 @@
     cls.add_method('SetIpv4Address', 
                    'void', 
                    [param('ns3::Ipv4Address', 'destination')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::SetMacAddresss(ns3::Address macAddress) [member function]
+    cls.add_method('SetMacAddresss', 
+                   'void', 
+                   [param('ns3::Address', 'macAddress')])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::UpdateWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('UpdateWaitReply', 
                    'bool', 
@@ -11197,11 +11087,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -11464,10 +11364,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -14710,7 +14610,7 @@
     cls.add_constructor([])
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
-    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(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('AddLinkChangeCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
@@ -15469,11 +15369,6 @@
     cls.add_method('SetNode', 
                    'void', 
                    [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## tcp-l4-protocol.h (module 'internet'): int ns3::TcpL4Protocol::GetProtocolNumber() const [member function]
-    cls.add_method('GetProtocolNumber', 
-                   'int', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): ns3::Ptr<ns3::Socket> ns3::TcpL4Protocol::CreateSocket() [member function]
     cls.add_method('CreateSocket', 
                    'ns3::Ptr< ns3::Socket >', 
@@ -15522,6 +15417,19 @@
     cls.add_method('Allocate6', 
                    'ns3::Ipv6EndPoint *', 
                    [param('ns3::Ipv6Address', 'localAddress'), param('uint16_t', 'localPort'), param('ns3::Ipv6Address', 'peerAddress'), param('uint16_t', 'peerPort')])
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::SendPacket(ns3::Ptr<ns3::Packet> pkt, ns3::TcpHeader const & outgoing, ns3::Address const & saddr, ns3::Address const & daddr, ns3::Ptr<ns3::NetDevice> oif=0) const [member function]
+    cls.add_method('SendPacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'pkt'), param('ns3::TcpHeader const &', 'outgoing'), param('ns3::Address const &', 'saddr'), param('ns3::Address const &', 'daddr'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')], 
+                   is_const=True)
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::AddSocket(ns3::Ptr<ns3::TcpSocketBase> socket) [member function]
+    cls.add_method('AddSocket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketBase >', 'socket')])
+    ## tcp-l4-protocol.h (module 'internet'): bool ns3::TcpL4Protocol::RemoveSocket(ns3::Ptr<ns3::TcpSocketBase> socket) [member function]
+    cls.add_method('RemoveSocket', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::TcpSocketBase >', 'socket')])
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::DeAllocate(ns3::Ipv4EndPoint * endPoint) [member function]
     cls.add_method('DeAllocate', 
                    'void', 
@@ -15530,23 +15438,15 @@
     cls.add_method('DeAllocate', 
                    'void', 
                    [param('ns3::Ipv6EndPoint *', 'endPoint')])
-    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv4Address saddr, ns3::Ipv4Address daddr, uint16_t sport, uint16_t dport, ns3::Ptr<ns3::NetDevice> oif=0) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Address', 'saddr'), param('ns3::Ipv4Address', 'daddr'), param('uint16_t', 'sport'), param('uint16_t', 'dport'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')])
-    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Address saddr, ns3::Ipv6Address daddr, uint16_t sport, uint16_t dport, ns3::Ptr<ns3::NetDevice> oif=0) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Address', 'saddr'), param('ns3::Ipv6Address', 'daddr'), param('uint16_t', 'sport'), param('uint16_t', 'dport'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')])
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & header, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & incomingIpHeader, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'incomingIpHeader'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
                    is_virtual=True)
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & incomingIpHeader, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'incomingIpHeader'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::ReceiveIcmp(ns3::Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo, ns3::Ipv4Address payloadSource, ns3::Ipv4Address payloadDestination, uint8_t const * payload) [member function]
     cls.add_method('ReceiveIcmp', 
@@ -15568,6 +15468,11 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Ipv6Address, ns3::Ipv6Address, unsigned char, ns3::Ptr< ns3::Ipv6Route >, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
+    ## tcp-l4-protocol.h (module 'internet'): int ns3::TcpL4Protocol::GetProtocolNumber() const [member function]
+    cls.add_method('GetProtocolNumber', 
+                   'int', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::Ipv4Address, ns3::Ipv4Address, unsigned char, ns3::Ptr<ns3::Ipv4Route>, ns3::empty, ns3::empty, ns3::empty, ns3::empty> ns3::TcpL4Protocol::GetDownTarget() const [member function]
     cls.add_method('GetDownTarget', 
                    'ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Ipv4Address, ns3::Ipv4Address, unsigned char, ns3::Ptr< ns3::Ipv4Route >, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 
@@ -15588,6 +15493,16 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::PacketReceived(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader & incomingTcpHeader, ns3::Address const & source, ns3::Address const & destination) [member function]
+    cls.add_method('PacketReceived', 
+                   'ns3::IpL4Protocol::RxStatus', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader &', 'incomingTcpHeader'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'destination')], 
+                   visibility='protected')
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::NoEndPointsFound(ns3::TcpHeader const & incomingHeader, ns3::Address const & incomingSAddr, ns3::Address const & incomingDAddr) [member function]
+    cls.add_method('NoEndPointsFound', 
+                   'void', 
+                   [param('ns3::TcpHeader const &', 'incomingHeader'), param('ns3::Address const &', 'incomingSAddr'), param('ns3::Address const &', 'incomingDAddr')], 
+                   visibility='protected')
     return
 
 def register_Ns3TcpNewReno_methods(root_module, cls):
@@ -15595,21 +15510,11 @@
     cls.add_constructor([])
     ## tcp-newreno.h (module 'internet'): ns3::TcpNewReno::TcpNewReno(ns3::TcpNewReno const & sock) [copy constructor]
     cls.add_constructor([param('ns3::TcpNewReno const &', 'sock')])
-    ## tcp-newreno.h (module 'internet'): int ns3::TcpNewReno::Connect(ns3::Address const & address) [member function]
-    cls.add_method('Connect', 
-                   'int', 
-                   [param('ns3::Address const &', 'address')], 
-                   is_virtual=True)
     ## tcp-newreno.h (module 'internet'): static ns3::TypeId ns3::TcpNewReno::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## tcp-newreno.h (module 'internet'): int ns3::TcpNewReno::Listen() [member function]
-    cls.add_method('Listen', 
-                   'int', 
-                   [], 
-                   is_virtual=True)
     ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
@@ -15620,16 +15525,6 @@
                    'ns3::Ptr< ns3::TcpSocketBase >', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): uint32_t ns3::TcpNewReno::GetInitialCwnd() const [member function]
-    cls.add_method('GetInitialCwnd', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): uint32_t ns3::TcpNewReno::GetInitialSSThresh() const [member function]
-    cls.add_method('GetInitialSSThresh', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::NewAck(ns3::SequenceNumber32 const & seq) [member function]
     cls.add_method('NewAck', 
                    'void', 
@@ -15640,31 +15535,6 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::ScaleSsThresh(uint8_t scaleFactor) [member function]
-    cls.add_method('ScaleSsThresh', 
-                   'void', 
-                   [param('uint8_t', 'scaleFactor')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::SetInitialCwnd(uint32_t cwnd) [member function]
-    cls.add_method('SetInitialCwnd', 
-                   'void', 
-                   [param('uint32_t', 'cwnd')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::SetInitialSSThresh(uint32_t threshold) [member function]
-    cls.add_method('SetInitialSSThresh', 
-                   'void', 
-                   [param('uint32_t', 'threshold')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::SetSegSize(uint32_t size) [member function]
-    cls.add_method('SetSegSize', 
-                   'void', 
-                   [param('uint32_t', 'size')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): uint32_t ns3::TcpNewReno::Window() [member function]
-    cls.add_method('Window', 
-                   'uint32_t', 
-                   [], 
-                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TcpReno_methods(root_module, cls):
@@ -15672,21 +15542,11 @@
     cls.add_constructor([])
     ## tcp-reno.h (module 'internet'): ns3::TcpReno::TcpReno(ns3::TcpReno const & sock) [copy constructor]
     cls.add_constructor([param('ns3::TcpReno const &', 'sock')])
-    ## tcp-reno.h (module 'internet'): int ns3::TcpReno::Connect(ns3::Address const & address) [member function]
-    cls.add_method('Connect', 
-                   'int', 
-                   [param('ns3::Address const &', 'address')], 
-                   is_virtual=True)
     ## tcp-reno.h (module 'internet'): static ns3::TypeId ns3::TcpReno::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## tcp-reno.h (module 'internet'): int ns3::TcpReno::Listen() [member function]
-    cls.add_method('Listen', 
-                   'int', 
-                   [], 
-                   is_virtual=True)
     ## tcp-reno.h (module 'internet'): void ns3::TcpReno::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
@@ -15697,16 +15557,6 @@
                    'ns3::Ptr< ns3::TcpSocketBase >', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): uint32_t ns3::TcpReno::GetInitialCwnd() const [member function]
-    cls.add_method('GetInitialCwnd', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): uint32_t ns3::TcpReno::GetInitialSSThresh() const [member function]
-    cls.add_method('GetInitialSSThresh', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-reno.h (module 'internet'): void ns3::TcpReno::NewAck(ns3::SequenceNumber32 const & seq) [member function]
     cls.add_method('NewAck', 
                    'void', 
@@ -15717,31 +15567,6 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): void ns3::TcpReno::ScaleSsThresh(uint8_t scaleFactor) [member function]
-    cls.add_method('ScaleSsThresh', 
-                   'void', 
-                   [param('uint8_t', 'scaleFactor')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): void ns3::TcpReno::SetInitialCwnd(uint32_t cwnd) [member function]
-    cls.add_method('SetInitialCwnd', 
-                   'void', 
-                   [param('uint32_t', 'cwnd')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): void ns3::TcpReno::SetInitialSSThresh(uint32_t threshold) [member function]
-    cls.add_method('SetInitialSSThresh', 
-                   'void', 
-                   [param('uint32_t', 'threshold')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): void ns3::TcpReno::SetSegSize(uint32_t size) [member function]
-    cls.add_method('SetSegSize', 
-                   'void', 
-                   [param('uint32_t', 'size')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): uint32_t ns3::TcpReno::Window() [member function]
-    cls.add_method('Window', 
-                   'uint32_t', 
-                   [], 
-                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TcpRfc793_methods(root_module, cls):
@@ -16112,7 +15937,7 @@
     cls.add_method('AddBridgePort', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'bridgePort')])
-    ## bridge-net-device.h (module 'bridge'): void ns3::BridgeNetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## bridge-net-device.h (module 'bridge'): void ns3::BridgeNetDevice::AddLinkChangeCallback(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('AddLinkChangeCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
@@ -16905,7 +16730,7 @@
     cls.add_constructor([param('ns3::LoopbackNetDevice const &', 'arg0')])
     ## loopback-net-device.h (module 'internet'): ns3::LoopbackNetDevice::LoopbackNetDevice() [constructor]
     cls.add_constructor([])
-    ## loopback-net-device.h (module 'internet'): void ns3::LoopbackNetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## loopback-net-device.h (module 'internet'): void ns3::LoopbackNetDevice::AddLinkChangeCallback(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('AddLinkChangeCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
@@ -17146,6 +16971,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -17159,6 +16985,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/internet/bindings/modulegen__gcc_LP64.py ns-3.24/src/internet/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/internet/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -20,8 +20,6 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## tcp-socket.h (module 'internet'): ns3::TcpStates_t [enumeration]
-    module.add_enum('TcpStates_t', ['CLOSED', 'LISTEN', 'SYN_SENT', 'SYN_RCVD', 'ESTABLISHED', 'CLOSE_WAIT', 'LAST_ACK', 'FIN_WAIT_1', 'FIN_WAIT_2', 'CLOSING', 'TIME_WAIT', 'LAST_STATE'])
     ## address.h (module 'network'): ns3::Address [class]
     module.add_class('Address', import_from_module='ns.network')
     ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
@@ -120,8 +118,6 @@
     module.add_class('Ipv4AddressGenerator')
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper [class]
     module.add_class('Ipv4AddressHelper')
-    ## ipv4-end-point.h (module 'internet'): ns3::Ipv4EndPoint [class]
-    module.add_class('Ipv4EndPoint')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -203,7 +199,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -250,8 +246,8 @@
     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]
     root_module['ns3::TracedValue< ns3::SequenceNumber<unsigned int, int> >'].implicitly_converts_to(root_module['ns3::SequenceNumber32'])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpStates_t> [class]
-    module.add_class('TracedValue', template_parameters=['ns3::TcpStates_t'])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpSocket::TcpStates_t> [class]
+    module.add_class('TracedValue', template_parameters=['ns3::TcpSocket::TcpStates_t'])
     ## 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]
@@ -450,6 +446,8 @@
     module.add_class('TcpRxBuffer', parent=root_module['ns3::Object'])
     ## tcp-socket.h (module 'internet'): ns3::TcpSocket [class]
     module.add_class('TcpSocket', parent=root_module['ns3::Socket'])
+    ## tcp-socket.h (module 'internet'): ns3::TcpSocket::TcpStates_t [enumeration]
+    module.add_enum('TcpStates_t', ['CLOSED', 'LISTEN', 'SYN_SENT', 'SYN_RCVD', 'ESTABLISHED', 'CLOSE_WAIT', 'LAST_ACK', 'FIN_WAIT_1', 'FIN_WAIT_2', 'CLOSING', 'TIME_WAIT', 'LAST_STATE'], outer_class=root_module['ns3::TcpSocket'])
     ## tcp-socket-base.h (module 'internet'): ns3::TcpSocketBase [class]
     module.add_class('TcpSocketBase', parent=root_module['ns3::TcpSocket'])
     ## tcp-socket-factory.h (module 'internet'): ns3::TcpSocketFactory [class]
@@ -745,15 +743,12 @@
     typehandlers.add_type_alias(u'std::deque< ns3::RttHistory, std::allocator< ns3::RttHistory > >', u'ns3::RttHistory_t')
     typehandlers.add_type_alias(u'std::deque< ns3::RttHistory, std::allocator< ns3::RttHistory > >*', u'ns3::RttHistory_t*')
     typehandlers.add_type_alias(u'std::deque< ns3::RttHistory, std::allocator< ns3::RttHistory > >&', u'ns3::RttHistory_t&')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpStates_t, ns3::TcpStates_t ) *', u'ns3::TcpStatesTracedValueCallback')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpStates_t, ns3::TcpStates_t ) **', u'ns3::TcpStatesTracedValueCallback*')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpStates_t, ns3::TcpStates_t ) *&', u'ns3::TcpStatesTracedValueCallback&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpSocket::TcpStates_t, ns3::TcpSocket::TcpStates_t ) *', u'ns3::TcpStatesTracedValueCallback')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpSocket::TcpStates_t, ns3::TcpSocket::TcpStates_t ) **', u'ns3::TcpStatesTracedValueCallback*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::TcpSocket::TcpStates_t, ns3::TcpSocket::TcpStates_t ) *&', u'ns3::TcpStatesTracedValueCallback&')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >', u'ns3::SequenceNumber8')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >*', u'ns3::SequenceNumber8*')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >&', u'ns3::SequenceNumber8&')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::SequenceNumber32TracedValueCallback')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::SequenceNumber32TracedValueCallback*')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::SequenceNumber32TracedValueCallback&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -767,6 +762,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -807,6 +808,40 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -847,7 +882,6 @@
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
     register_Ns3Ipv4AddressGenerator_methods(root_module, root_module['ns3::Ipv4AddressGenerator'])
     register_Ns3Ipv4AddressHelper_methods(root_module, root_module['ns3::Ipv4AddressHelper'])
-    register_Ns3Ipv4EndPoint_methods(root_module, root_module['ns3::Ipv4EndPoint'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
@@ -899,7 +933,7 @@
     register_Ns3TracedValue__Bool_methods(root_module, root_module['ns3::TracedValue< bool >'])
     register_Ns3TracedValue__Double_methods(root_module, root_module['ns3::TracedValue< double >'])
     register_Ns3TracedValue__Ns3SequenceNumber__lt__unsigned_int__int__gt___methods(root_module, root_module['ns3::TracedValue< ns3::SequenceNumber<unsigned int, int> >'])
-    register_Ns3TracedValue__Ns3TcpStates_t_methods(root_module, root_module['ns3::TracedValue< ns3::TcpStates_t >'])
+    register_Ns3TracedValue__Ns3TcpSocketTcpStates_t_methods(root_module, root_module['ns3::TracedValue< ns3::TcpSocket::TcpStates_t >'])
     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'])
@@ -1472,17 +1506,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1504,11 +1538,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1518,16 +1547,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1765,14 +1784,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1833,11 +1856,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CandidateQueue_methods(root_module, cls):
@@ -2515,65 +2533,6 @@
                    [param('ns3::Ipv4Address', 'network'), param('ns3::Ipv4Mask', 'mask'), param('ns3::Ipv4Address', 'base', default_value='"0.0.0.1"')])
     return
 
-def register_Ns3Ipv4EndPoint_methods(root_module, cls):
-    ## ipv4-end-point.h (module 'internet'): ns3::Ipv4EndPoint::Ipv4EndPoint(ns3::Ipv4EndPoint const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Ipv4EndPoint const &', 'arg0')])
-    ## ipv4-end-point.h (module 'internet'): ns3::Ipv4EndPoint::Ipv4EndPoint(ns3::Ipv4Address address, uint16_t port) [constructor]
-    cls.add_constructor([param('ns3::Ipv4Address', 'address'), param('uint16_t', 'port')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::BindToNetDevice(ns3::Ptr<ns3::NetDevice> netdevice) [member function]
-    cls.add_method('BindToNetDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'netdevice')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::ForwardIcmp(ns3::Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo) [member function]
-    cls.add_method('ForwardIcmp', 
-                   'void', 
-                   [param('ns3::Ipv4Address', 'icmpSource'), param('uint8_t', 'icmpTtl'), param('uint8_t', 'icmpType'), param('uint8_t', 'icmpCode'), param('uint32_t', 'icmpInfo')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::ForwardUp(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & header, uint16_t sport, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
-    cls.add_method('ForwardUp', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('uint16_t', 'sport'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')])
-    ## ipv4-end-point.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4EndPoint::GetBoundNetDevice() [member function]
-    cls.add_method('GetBoundNetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [])
-    ## ipv4-end-point.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4EndPoint::GetLocalAddress() [member function]
-    cls.add_method('GetLocalAddress', 
-                   'ns3::Ipv4Address', 
-                   [])
-    ## ipv4-end-point.h (module 'internet'): uint16_t ns3::Ipv4EndPoint::GetLocalPort() [member function]
-    cls.add_method('GetLocalPort', 
-                   'uint16_t', 
-                   [])
-    ## ipv4-end-point.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4EndPoint::GetPeerAddress() [member function]
-    cls.add_method('GetPeerAddress', 
-                   'ns3::Ipv4Address', 
-                   [])
-    ## ipv4-end-point.h (module 'internet'): uint16_t ns3::Ipv4EndPoint::GetPeerPort() [member function]
-    cls.add_method('GetPeerPort', 
-                   'uint16_t', 
-                   [])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::SetDestroyCallback(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('SetDestroyCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::SetIcmpCallback(ns3::Callback<void, ns3::Ipv4Address, unsigned char, unsigned char, unsigned char, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetIcmpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ipv4Address, unsigned char, unsigned char, unsigned char, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::SetLocalAddress(ns3::Ipv4Address address) [member function]
-    cls.add_method('SetLocalAddress', 
-                   'void', 
-                   [param('ns3::Ipv4Address', 'address')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::SetPeer(ns3::Ipv4Address address, uint16_t port) [member function]
-    cls.add_method('SetPeer', 
-                   'void', 
-                   [param('ns3::Ipv4Address', 'address'), param('uint16_t', 'port')])
-    ## ipv4-end-point.h (module 'internet'): void ns3::Ipv4EndPoint::SetRxCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::Ipv4Header, unsigned short, ns3::Ptr<ns3::Ipv4Interface>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetRxCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Ipv4Header, unsigned short, ns3::Ptr< ns3::Ipv4Interface >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    return
-
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
     cls.add_output_stream_operator()
@@ -4205,7 +4164,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -4223,10 +4182,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -4290,10 +4249,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -4751,10 +4710,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -5047,38 +5006,38 @@
                    [param('ns3::SequenceNumber< unsigned int, int > const &', 'v')])
     return
 
-def register_Ns3TracedValue__Ns3TcpStates_t_methods(root_module, cls):
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpStates_t>::TracedValue() [constructor]
+def register_Ns3TracedValue__Ns3TcpSocketTcpStates_t_methods(root_module, cls):
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::TracedValue() [constructor]
     cls.add_constructor([])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpStates_t>::TracedValue(ns3::TracedValue<ns3::TcpStates_t> const & o) [copy constructor]
-    cls.add_constructor([param('ns3::TracedValue< ns3::TcpStates_t > const &', 'o')])
-    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpStates_t>::TracedValue(ns3::TcpStates_t const & v) [constructor]
-    cls.add_constructor([param('ns3::TcpStates_t const &', 'v')])
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpStates_t>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > path) [member function]
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::TracedValue(ns3::TracedValue<ns3::TcpSocket::TcpStates_t> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TracedValue< ns3::TcpSocket::TcpStates_t > const &', 'o')])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::TracedValue(ns3::TcpSocket::TcpStates_t const & v) [constructor]
+    cls.add_constructor([param('ns3::TcpSocket::TcpStates_t const &', 'v')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::TcpStates_t>::ConnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::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::TcpStates_t>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > path) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::TcpStates_t>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
     cls.add_method('DisconnectWithoutContext', 
                    'void', 
                    [param('ns3::CallbackBase const &', 'cb')])
-    ## traced-value.h (module 'core'): ns3::TcpStates_t ns3::TracedValue<ns3::TcpStates_t>::Get() const [member function]
+    ## traced-value.h (module 'core'): ns3::TcpSocket::TcpStates_t ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::Get() const [member function]
     cls.add_method('Get', 
-                   'ns3::TcpStates_t', 
+                   'ns3::TcpSocket::TcpStates_t', 
                    [], 
                    is_const=True)
-    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpStates_t>::Set(ns3::TcpStates_t const & v) [member function]
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::TcpSocket::TcpStates_t>::Set(ns3::TcpSocket::TcpStates_t const & v) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('ns3::TcpStates_t const &', 'v')])
+                   [param('ns3::TcpSocket::TcpStates_t const &', 'v')])
     return
 
 def register_Ns3TracedValue__Unsigned_int_methods(root_module, cls):
@@ -7651,10 +7610,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -8875,6 +8834,7 @@
     return
 
 def register_Ns3TcpHeader_methods(root_module, cls):
+    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
     ## tcp-header.h (module 'internet'): ns3::TcpHeader::TcpHeader(ns3::TcpHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::TcpHeader const &', 'arg0')])
@@ -8963,18 +8923,18 @@
                    'bool', 
                    [param('uint8_t', 'kind')], 
                    is_const=True)
-    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Ipv4Address source, ns3::Ipv4Address destination, uint8_t protocol) [member function]
+    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Ipv4Address const & source, ns3::Ipv4Address const & destination, uint8_t protocol) [member function]
     cls.add_method('InitializeChecksum', 
                    'void', 
-                   [param('ns3::Ipv4Address', 'source'), param('ns3::Ipv4Address', 'destination'), param('uint8_t', 'protocol')])
-    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Ipv6Address source, ns3::Ipv6Address destination, uint8_t protocol) [member function]
+                   [param('ns3::Ipv4Address const &', 'source'), param('ns3::Ipv4Address const &', 'destination'), param('uint8_t', 'protocol')])
+    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Ipv6Address const & source, ns3::Ipv6Address const & destination, uint8_t protocol) [member function]
     cls.add_method('InitializeChecksum', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'source'), param('ns3::Ipv6Address', 'destination'), param('uint8_t', 'protocol')])
-    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Address source, ns3::Address destination, uint8_t protocol) [member function]
+                   [param('ns3::Ipv6Address const &', 'source'), param('ns3::Ipv6Address const &', 'destination'), param('uint8_t', 'protocol')])
+    ## tcp-header.h (module 'internet'): void ns3::TcpHeader::InitializeChecksum(ns3::Address const & source, ns3::Address const & destination, uint8_t protocol) [member function]
     cls.add_method('InitializeChecksum', 
                    'void', 
-                   [param('ns3::Address', 'source'), param('ns3::Address', 'destination'), param('uint8_t', 'protocol')])
+                   [param('ns3::Address const &', 'source'), param('ns3::Address const &', 'destination'), param('uint8_t', 'protocol')])
     ## tcp-header.h (module 'internet'): bool ns3::TcpHeader::IsChecksumOk() const [member function]
     cls.add_method('IsChecksumOk', 
                    'bool', 
@@ -9550,15 +9510,10 @@
                    'int', 
                    [], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DoForwardUp(ns3::Ptr<ns3::Packet> packet, ns3::Ipv4Header header, uint16_t port, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
-    cls.add_method('DoForwardUp', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Header', 'header'), param('uint16_t', 'port'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DoForwardUp(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Header header, uint16_t port) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DoForwardUp(ns3::Ptr<ns3::Packet> packet, ns3::Address const & fromAddress, ns3::Address const & toAddress) [member function]
     cls.add_method('DoForwardUp', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Header', 'header'), param('uint16_t', 'port')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'fromAddress'), param('ns3::Address const &', 'toAddress')], 
                    visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DoPeerClose() [member function]
     cls.add_method('DoPeerClose', 
@@ -9634,12 +9589,12 @@
     cls.add_method('GetInitialCwnd', 
                    'uint32_t', 
                    [], 
-                   is_pure_virtual=True, is_const=True, visibility='protected', is_virtual=True)
+                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): uint32_t ns3::TcpSocketBase::GetInitialSSThresh() const [member function]
     cls.add_method('GetInitialSSThresh', 
                    'uint32_t', 
                    [], 
-                   is_pure_virtual=True, is_const=True, visibility='protected', is_virtual=True)
+                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): ns3::Time ns3::TcpSocketBase::GetPersistTimeout() const [member function]
     cls.add_method('GetPersistTimeout', 
                    'ns3::Time', 
@@ -9665,6 +9620,11 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected', is_virtual=True)
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::InitializeCwnd() [member function]
+    cls.add_method('InitializeCwnd', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::LastAckTimeout() [member function]
     cls.add_method('LastAckTimeout', 
                    'void', 
@@ -9764,7 +9724,7 @@
     cls.add_method('ScaleSsThresh', 
                    'void', 
                    [param('uint8_t', 'scaleFactor')], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+                   visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): uint32_t ns3::TcpSocketBase::SendDataPacket(ns3::SequenceNumber32 seq, uint32_t maxSize, bool withAck) [member function]
     cls.add_method('SendDataPacket', 
                    'uint32_t', 
@@ -9814,12 +9774,12 @@
     cls.add_method('SetInitialCwnd', 
                    'void', 
                    [param('uint32_t', 'cwnd')], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+                   visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::SetInitialSSThresh(uint32_t threshold) [member function]
     cls.add_method('SetInitialSSThresh', 
                    'void', 
                    [param('uint32_t', 'threshold')], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+                   visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::SetPersistTimeout(ns3::Time timeout) [member function]
     cls.add_method('SetPersistTimeout', 
                    'void', 
@@ -9879,7 +9839,7 @@
     cls.add_method('Window', 
                    'uint32_t', 
                    [], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TcpSocketFactory_methods(root_module, cls):
@@ -9899,21 +9859,11 @@
     cls.add_constructor([])
     ## tcp-tahoe.h (module 'internet'): ns3::TcpTahoe::TcpTahoe(ns3::TcpTahoe const & sock) [copy constructor]
     cls.add_constructor([param('ns3::TcpTahoe const &', 'sock')])
-    ## tcp-tahoe.h (module 'internet'): int ns3::TcpTahoe::Connect(ns3::Address const & address) [member function]
-    cls.add_method('Connect', 
-                   'int', 
-                   [param('ns3::Address const &', 'address')], 
-                   is_virtual=True)
     ## tcp-tahoe.h (module 'internet'): static ns3::TypeId ns3::TcpTahoe::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## tcp-tahoe.h (module 'internet'): int ns3::TcpTahoe::Listen() [member function]
-    cls.add_method('Listen', 
-                   'int', 
-                   [], 
-                   is_virtual=True)
     ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
@@ -9924,16 +9874,6 @@
                    'ns3::Ptr< ns3::TcpSocketBase >', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): uint32_t ns3::TcpTahoe::GetInitialCwnd() const [member function]
-    cls.add_method('GetInitialCwnd', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): uint32_t ns3::TcpTahoe::GetInitialSSThresh() const [member function]
-    cls.add_method('GetInitialSSThresh', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::NewAck(ns3::SequenceNumber32 const & seq) [member function]
     cls.add_method('NewAck', 
                    'void', 
@@ -9944,31 +9884,6 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::ScaleSsThresh(uint8_t scaleFactor) [member function]
-    cls.add_method('ScaleSsThresh', 
-                   'void', 
-                   [param('uint8_t', 'scaleFactor')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::SetInitialCwnd(uint32_t cwnd) [member function]
-    cls.add_method('SetInitialCwnd', 
-                   'void', 
-                   [param('uint32_t', 'cwnd')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::SetInitialSSThresh(uint32_t threshold) [member function]
-    cls.add_method('SetInitialSSThresh', 
-                   'void', 
-                   [param('uint32_t', 'threshold')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::SetSegSize(uint32_t size) [member function]
-    cls.add_method('SetSegSize', 
-                   'void', 
-                   [param('uint32_t', 'size')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-tahoe.h (module 'internet'): uint32_t ns3::TcpTahoe::Window() [member function]
-    cls.add_method('Window', 
-                   'uint32_t', 
-                   [], 
-                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TcpTxBuffer_methods(root_module, cls):
@@ -10038,21 +9953,11 @@
     cls.add_constructor([])
     ## tcp-westwood.h (module 'internet'): ns3::TcpWestwood::TcpWestwood(ns3::TcpWestwood const & sock) [copy constructor]
     cls.add_constructor([param('ns3::TcpWestwood const &', 'sock')])
-    ## tcp-westwood.h (module 'internet'): int ns3::TcpWestwood::Connect(ns3::Address const & address) [member function]
-    cls.add_method('Connect', 
-                   'int', 
-                   [param('ns3::Address const &', 'address')], 
-                   is_virtual=True)
     ## tcp-westwood.h (module 'internet'): static ns3::TypeId ns3::TcpWestwood::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## tcp-westwood.h (module 'internet'): int ns3::TcpWestwood::Listen() [member function]
-    cls.add_method('Listen', 
-                   'int', 
-                   [], 
-                   is_virtual=True)
     ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
@@ -10068,16 +9973,6 @@
                    'ns3::Ptr< ns3::TcpSocketBase >', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): uint32_t ns3::TcpWestwood::GetInitialCwnd() const [member function]
-    cls.add_method('GetInitialCwnd', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): uint32_t ns3::TcpWestwood::GetInitialSSThresh() const [member function]
-    cls.add_method('GetInitialSSThresh', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::NewAck(ns3::SequenceNumber32 const & seq) [member function]
     cls.add_method('NewAck', 
                    'void', 
@@ -10093,31 +9988,6 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::ScaleSsThresh(uint8_t scaleFactor) [member function]
-    cls.add_method('ScaleSsThresh', 
-                   'void', 
-                   [param('uint8_t', 'scaleFactor')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::SetInitialCwnd(uint32_t cwnd) [member function]
-    cls.add_method('SetInitialCwnd', 
-                   'void', 
-                   [param('uint32_t', 'cwnd')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::SetInitialSSThresh(uint32_t threshold) [member function]
-    cls.add_method('SetInitialSSThresh', 
-                   'void', 
-                   [param('uint32_t', 'threshold')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::SetSegSize(uint32_t size) [member function]
-    cls.add_method('SetSegSize', 
-                   'void', 
-                   [param('uint32_t', 'size')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): uint32_t ns3::TcpWestwood::Window() [member function]
-    cls.add_method('Window', 
-                   'uint32_t', 
-                   [], 
-                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3Time_methods(root_module, cls):
@@ -10828,6 +10698,10 @@
     cls.add_method('PrintArpCache', 
                    'void', 
                    [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Remove(ns3::ArpCache::Entry * entry) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::ArpCache::Entry *', 'entry')])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::SetAliveTimeout(ns3::Time aliveTimeout) [member function]
     cls.add_method('SetAliveTimeout', 
                    'void', 
@@ -10864,6 +10738,10 @@
     cls.add_constructor([param('ns3::ArpCache::Entry const &', 'arg0')])
     ## arp-cache.h (module 'internet'): ns3::ArpCache::Entry::Entry(ns3::ArpCache * arp) [constructor]
     cls.add_constructor([param('ns3::ArpCache *', 'arp')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearPendingPacket() [member function]
+    cls.add_method('ClearPendingPacket', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::ClearRetries() [member function]
     cls.add_method('ClearRetries', 
                    'void', 
@@ -10904,6 +10782,10 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsPermanent() [member function]
+    cls.add_method('IsPermanent', 
+                   'bool', 
+                   [])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::IsWaitReply() [member function]
     cls.add_method('IsWaitReply', 
                    'bool', 
@@ -10916,6 +10798,10 @@
     cls.add_method('MarkDead', 
                    'void', 
                    [])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkPermanent() [member function]
+    cls.add_method('MarkPermanent', 
+                   'void', 
+                   [])
     ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::MarkWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('MarkWaitReply', 
                    'void', 
@@ -10924,6 +10810,10 @@
     cls.add_method('SetIpv4Address', 
                    'void', 
                    [param('ns3::Ipv4Address', 'destination')])
+    ## arp-cache.h (module 'internet'): void ns3::ArpCache::Entry::SetMacAddresss(ns3::Address macAddress) [member function]
+    cls.add_method('SetMacAddresss', 
+                   'void', 
+                   [param('ns3::Address', 'macAddress')])
     ## arp-cache.h (module 'internet'): bool ns3::ArpCache::Entry::UpdateWaitReply(ns3::Ptr<ns3::Packet> waiting) [member function]
     cls.add_method('UpdateWaitReply', 
                    'bool', 
@@ -11197,11 +11087,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -11464,10 +11364,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -14710,7 +14610,7 @@
     cls.add_constructor([])
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
-    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(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('AddLinkChangeCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
@@ -15469,11 +15369,6 @@
     cls.add_method('SetNode', 
                    'void', 
                    [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## tcp-l4-protocol.h (module 'internet'): int ns3::TcpL4Protocol::GetProtocolNumber() const [member function]
-    cls.add_method('GetProtocolNumber', 
-                   'int', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): ns3::Ptr<ns3::Socket> ns3::TcpL4Protocol::CreateSocket() [member function]
     cls.add_method('CreateSocket', 
                    'ns3::Ptr< ns3::Socket >', 
@@ -15522,6 +15417,19 @@
     cls.add_method('Allocate6', 
                    'ns3::Ipv6EndPoint *', 
                    [param('ns3::Ipv6Address', 'localAddress'), param('uint16_t', 'localPort'), param('ns3::Ipv6Address', 'peerAddress'), param('uint16_t', 'peerPort')])
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::SendPacket(ns3::Ptr<ns3::Packet> pkt, ns3::TcpHeader const & outgoing, ns3::Address const & saddr, ns3::Address const & daddr, ns3::Ptr<ns3::NetDevice> oif=0) const [member function]
+    cls.add_method('SendPacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'pkt'), param('ns3::TcpHeader const &', 'outgoing'), param('ns3::Address const &', 'saddr'), param('ns3::Address const &', 'daddr'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')], 
+                   is_const=True)
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::AddSocket(ns3::Ptr<ns3::TcpSocketBase> socket) [member function]
+    cls.add_method('AddSocket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketBase >', 'socket')])
+    ## tcp-l4-protocol.h (module 'internet'): bool ns3::TcpL4Protocol::RemoveSocket(ns3::Ptr<ns3::TcpSocketBase> socket) [member function]
+    cls.add_method('RemoveSocket', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::TcpSocketBase >', 'socket')])
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::DeAllocate(ns3::Ipv4EndPoint * endPoint) [member function]
     cls.add_method('DeAllocate', 
                    'void', 
@@ -15530,23 +15438,15 @@
     cls.add_method('DeAllocate', 
                    'void', 
                    [param('ns3::Ipv6EndPoint *', 'endPoint')])
-    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv4Address saddr, ns3::Ipv4Address daddr, uint16_t sport, uint16_t dport, ns3::Ptr<ns3::NetDevice> oif=0) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Address', 'saddr'), param('ns3::Ipv4Address', 'daddr'), param('uint16_t', 'sport'), param('uint16_t', 'dport'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')])
-    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Address saddr, ns3::Ipv6Address daddr, uint16_t sport, uint16_t dport, ns3::Ptr<ns3::NetDevice> oif=0) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Address', 'saddr'), param('ns3::Ipv6Address', 'daddr'), param('uint16_t', 'sport'), param('uint16_t', 'dport'), param('ns3::Ptr< ns3::NetDevice >', 'oif', default_value='0')])
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & header, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & incomingIpHeader, ns3::Ptr<ns3::Ipv4Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'incomingIpHeader'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
                    is_virtual=True)
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & incomingIpHeader, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'incomingIpHeader'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::ReceiveIcmp(ns3::Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo, ns3::Ipv4Address payloadSource, ns3::Ipv4Address payloadDestination, uint8_t const * payload) [member function]
     cls.add_method('ReceiveIcmp', 
@@ -15568,6 +15468,11 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Ipv6Address, ns3::Ipv6Address, unsigned char, ns3::Ptr< ns3::Ipv6Route >, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
+    ## tcp-l4-protocol.h (module 'internet'): int ns3::TcpL4Protocol::GetProtocolNumber() const [member function]
+    cls.add_method('GetProtocolNumber', 
+                   'int', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::Ipv4Address, ns3::Ipv4Address, unsigned char, ns3::Ptr<ns3::Ipv4Route>, ns3::empty, ns3::empty, ns3::empty, ns3::empty> ns3::TcpL4Protocol::GetDownTarget() const [member function]
     cls.add_method('GetDownTarget', 
                    'ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Ipv4Address, ns3::Ipv4Address, unsigned char, ns3::Ptr< ns3::Ipv4Route >, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 
@@ -15588,6 +15493,16 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::PacketReceived(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader & incomingTcpHeader, ns3::Address const & source, ns3::Address const & destination) [member function]
+    cls.add_method('PacketReceived', 
+                   'ns3::IpL4Protocol::RxStatus', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader &', 'incomingTcpHeader'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'destination')], 
+                   visibility='protected')
+    ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::NoEndPointsFound(ns3::TcpHeader const & incomingHeader, ns3::Address const & incomingSAddr, ns3::Address const & incomingDAddr) [member function]
+    cls.add_method('NoEndPointsFound', 
+                   'void', 
+                   [param('ns3::TcpHeader const &', 'incomingHeader'), param('ns3::Address const &', 'incomingSAddr'), param('ns3::Address const &', 'incomingDAddr')], 
+                   visibility='protected')
     return
 
 def register_Ns3TcpNewReno_methods(root_module, cls):
@@ -15595,21 +15510,11 @@
     cls.add_constructor([])
     ## tcp-newreno.h (module 'internet'): ns3::TcpNewReno::TcpNewReno(ns3::TcpNewReno const & sock) [copy constructor]
     cls.add_constructor([param('ns3::TcpNewReno const &', 'sock')])
-    ## tcp-newreno.h (module 'internet'): int ns3::TcpNewReno::Connect(ns3::Address const & address) [member function]
-    cls.add_method('Connect', 
-                   'int', 
-                   [param('ns3::Address const &', 'address')], 
-                   is_virtual=True)
     ## tcp-newreno.h (module 'internet'): static ns3::TypeId ns3::TcpNewReno::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## tcp-newreno.h (module 'internet'): int ns3::TcpNewReno::Listen() [member function]
-    cls.add_method('Listen', 
-                   'int', 
-                   [], 
-                   is_virtual=True)
     ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
@@ -15620,16 +15525,6 @@
                    'ns3::Ptr< ns3::TcpSocketBase >', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): uint32_t ns3::TcpNewReno::GetInitialCwnd() const [member function]
-    cls.add_method('GetInitialCwnd', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): uint32_t ns3::TcpNewReno::GetInitialSSThresh() const [member function]
-    cls.add_method('GetInitialSSThresh', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::NewAck(ns3::SequenceNumber32 const & seq) [member function]
     cls.add_method('NewAck', 
                    'void', 
@@ -15640,31 +15535,6 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::ScaleSsThresh(uint8_t scaleFactor) [member function]
-    cls.add_method('ScaleSsThresh', 
-                   'void', 
-                   [param('uint8_t', 'scaleFactor')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::SetInitialCwnd(uint32_t cwnd) [member function]
-    cls.add_method('SetInitialCwnd', 
-                   'void', 
-                   [param('uint32_t', 'cwnd')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::SetInitialSSThresh(uint32_t threshold) [member function]
-    cls.add_method('SetInitialSSThresh', 
-                   'void', 
-                   [param('uint32_t', 'threshold')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::SetSegSize(uint32_t size) [member function]
-    cls.add_method('SetSegSize', 
-                   'void', 
-                   [param('uint32_t', 'size')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-newreno.h (module 'internet'): uint32_t ns3::TcpNewReno::Window() [member function]
-    cls.add_method('Window', 
-                   'uint32_t', 
-                   [], 
-                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TcpReno_methods(root_module, cls):
@@ -15672,21 +15542,11 @@
     cls.add_constructor([])
     ## tcp-reno.h (module 'internet'): ns3::TcpReno::TcpReno(ns3::TcpReno const & sock) [copy constructor]
     cls.add_constructor([param('ns3::TcpReno const &', 'sock')])
-    ## tcp-reno.h (module 'internet'): int ns3::TcpReno::Connect(ns3::Address const & address) [member function]
-    cls.add_method('Connect', 
-                   'int', 
-                   [param('ns3::Address const &', 'address')], 
-                   is_virtual=True)
     ## tcp-reno.h (module 'internet'): static ns3::TypeId ns3::TcpReno::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## tcp-reno.h (module 'internet'): int ns3::TcpReno::Listen() [member function]
-    cls.add_method('Listen', 
-                   'int', 
-                   [], 
-                   is_virtual=True)
     ## tcp-reno.h (module 'internet'): void ns3::TcpReno::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
@@ -15697,16 +15557,6 @@
                    'ns3::Ptr< ns3::TcpSocketBase >', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): uint32_t ns3::TcpReno::GetInitialCwnd() const [member function]
-    cls.add_method('GetInitialCwnd', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): uint32_t ns3::TcpReno::GetInitialSSThresh() const [member function]
-    cls.add_method('GetInitialSSThresh', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected', is_virtual=True)
     ## tcp-reno.h (module 'internet'): void ns3::TcpReno::NewAck(ns3::SequenceNumber32 const & seq) [member function]
     cls.add_method('NewAck', 
                    'void', 
@@ -15717,31 +15567,6 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): void ns3::TcpReno::ScaleSsThresh(uint8_t scaleFactor) [member function]
-    cls.add_method('ScaleSsThresh', 
-                   'void', 
-                   [param('uint8_t', 'scaleFactor')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): void ns3::TcpReno::SetInitialCwnd(uint32_t cwnd) [member function]
-    cls.add_method('SetInitialCwnd', 
-                   'void', 
-                   [param('uint32_t', 'cwnd')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): void ns3::TcpReno::SetInitialSSThresh(uint32_t threshold) [member function]
-    cls.add_method('SetInitialSSThresh', 
-                   'void', 
-                   [param('uint32_t', 'threshold')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): void ns3::TcpReno::SetSegSize(uint32_t size) [member function]
-    cls.add_method('SetSegSize', 
-                   'void', 
-                   [param('uint32_t', 'size')], 
-                   visibility='protected', is_virtual=True)
-    ## tcp-reno.h (module 'internet'): uint32_t ns3::TcpReno::Window() [member function]
-    cls.add_method('Window', 
-                   'uint32_t', 
-                   [], 
-                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3TcpRfc793_methods(root_module, cls):
@@ -16112,7 +15937,7 @@
     cls.add_method('AddBridgePort', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'bridgePort')])
-    ## bridge-net-device.h (module 'bridge'): void ns3::BridgeNetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## bridge-net-device.h (module 'bridge'): void ns3::BridgeNetDevice::AddLinkChangeCallback(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('AddLinkChangeCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
@@ -16905,7 +16730,7 @@
     cls.add_constructor([param('ns3::LoopbackNetDevice const &', 'arg0')])
     ## loopback-net-device.h (module 'internet'): ns3::LoopbackNetDevice::LoopbackNetDevice() [constructor]
     cls.add_constructor([])
-    ## loopback-net-device.h (module 'internet'): void ns3::LoopbackNetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    ## loopback-net-device.h (module 'internet'): void ns3::LoopbackNetDevice::AddLinkChangeCallback(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('AddLinkChangeCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
@@ -17146,6 +16971,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -17159,6 +16985,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/internet/examples/main-simple.cc ns-3.24/src/internet/examples/main-simple.cc
--- ns-3.23/src/internet/examples/main-simple.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/examples/main-simple.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 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>
+ */
+
 #include <iostream>
 
 #include "ns3/core-module.h"
diff -Naur ns-3.23/src/internet/helper/internet-stack-helper.h ns-3.24/src/internet/helper/internet-stack-helper.h
--- ns-3.23/src/internet/helper/internet-stack-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/helper/internet-stack-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -297,8 +297,6 @@
    */
   static void CreateAndAggregateObjectFromTypeId (Ptr<Node> node, const std::string typeId);
 
-  static void Cleanup (void);
-
   /**
    * \brief checks if there is an hook to a Pcap wrapper
    * \param ipv4 pointer to the IPv4 object
diff -Naur ns-3.23/src/internet/helper/ipv4-interface-container.cc ns-3.24/src/internet/helper/ipv4-interface-container.cc
--- ns-3.23/src/internet/helper/ipv4-interface-container.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/helper/ipv4-interface-container.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- 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>
+ */
+
 #include "ipv4-interface-container.h"
 #include "ns3/node-list.h"
 #include "ns3/names.h"
diff -Naur ns-3.23/src/internet/helper/ipv4-interface-container.h ns-3.24/src/internet/helper/ipv4-interface-container.h
--- ns-3.23/src/internet/helper/ipv4-interface-container.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/helper/ipv4-interface-container.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- 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 IPV4_INTERFACE_CONTAINER_H
 #define IPV4_INTERFACE_CONTAINER_H
 
diff -Naur ns-3.23/src/internet/model/arp-cache.cc ns-3.24/src/internet/model/arp-cache.cc
--- ns-3.23/src/internet/model/arp-cache.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/arp-cache.cc	2015-09-15 11:18:44.000000000 -0700
@@ -282,6 +282,10 @@
         {
           *os << " DELAY\n";
         }
+      else if (i->second->IsPermanent ())
+	{
+	  *os << " PERMANENT\n";
+	}
       else
         {
           *os << " STALE\n";
@@ -313,6 +317,24 @@
   return entry;
 }
 
+void
+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)
+        {
+          m_arpCache.erase (i);
+          entry->ClearPendingPacket (); //clear the pending packets for entry's ipaddress
+          delete entry;
+          return;
+        }
+    }
+  NS_LOG_WARN ("Entry not found in this ARP Cache");
+}
+
 ArpCache::Entry::Entry (ArpCache *arp)
   : m_arp (arp),
     m_state (ALIVE),
@@ -340,12 +362,19 @@
   NS_LOG_FUNCTION (this);
   return (m_state == WAIT_REPLY) ? true : false;
 }
+bool
+ArpCache::Entry::IsPermanent (void)
+{
+  NS_LOG_FUNCTION (this);
+  return (m_state == PERMANENT) ? true : false;
+}
 
 
 void 
 ArpCache::Entry::MarkDead (void) 
 {
   NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_state == ALIVE || m_state == WAIT_REPLY || m_state == DEAD);
   m_state = DEAD;
   ClearRetries ();
   UpdateSeen ();
@@ -360,7 +389,15 @@
   ClearRetries ();
   UpdateSeen ();
 }
-
+void
+ArpCache::Entry::MarkPermanent (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (!m_macAddress.IsInvalid ());
+  m_state = PERMANENT;
+  ClearRetries ();
+  UpdateSeen ();
+}
 bool
 ArpCache::Entry::UpdateWaitReply (Ptr<Packet> waiting)
 {
@@ -395,13 +432,19 @@
   NS_LOG_FUNCTION (this);
   return m_macAddress;
 }
+void 
+ArpCache::Entry::SetMacAddresss (Address macAddress)
+{
+  NS_LOG_FUNCTION (this);
+  m_macAddress = macAddress;
+}
 Ipv4Address 
 ArpCache::Entry::GetIpv4Address (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_ipv4Address;
 }
-void 
+void
 ArpCache::Entry::SetIpv4Address (Ipv4Address destination)
 {
   NS_LOG_FUNCTION (this << destination);
@@ -418,6 +461,8 @@
       return m_arp->GetDeadTimeout ();
     case ArpCache::Entry::ALIVE:
       return m_arp->GetAliveTimeout ();
+    case ArpCache::Entry::PERMANENT:
+      return Time::Max ();
     default:
       NS_ASSERT (false);
       return Seconds (0);
@@ -453,6 +498,12 @@
     }
 }
 void 
+ArpCache::Entry::ClearPendingPacket (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_pending.clear ();
+}
+void 
 ArpCache::Entry::UpdateSeen (void)
 {
   NS_LOG_FUNCTION (this);
diff -Naur ns-3.23/src/internet/model/arp-cache.h ns-3.24/src/internet/model/arp-cache.h
--- ns-3.23/src/internet/model/arp-cache.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/arp-cache.h	2015-09-15 11:18:44.000000000 -0700
@@ -151,6 +151,11 @@
    */
   ArpCache::Entry *Add (Ipv4Address to);
   /**
+   * \brief Remove an entry.
+   * \param entry pointer to delete it from the list
+   */
+  void Remove (ArpCache::Entry *entry);
+  /**
    * \brief Clear the ArpCache of all entries
    */
   void Flush (void);
@@ -186,6 +191,12 @@
      */
     void MarkWaitReply (Ptr<Packet> waiting);
     /**
+     * \brief Changes the state of this entry to Permanent.
+     *
+     * The entry must have a valid MacAddress.
+     */
+    void MarkPermanent (void);
+    /**
      * \param waiting
      * \return 
      */
@@ -202,7 +213,10 @@
      * \return True if the state of this entry is wait_reply; false otherwise.
      */
     bool IsWaitReply (void);
-
+    /**
+     * \return True if the state of this entry is permanent; false otherwise.
+     */
+    bool IsPermanent (void); 
     /**
      * \return The MacAddress of this entry
      */
@@ -212,6 +226,10 @@
      */
     Ipv4Address GetIpv4Address (void) const;
     /**
+     * \param macAddress The MacAddress for this entry
+     */
+    void SetMacAddresss (Address macAddress);
+    /**
      * \param destination The Ipv4Address for this entry
      */
     void SetIpv4Address (Ipv4Address destination);
@@ -228,6 +246,10 @@
      */
     Ptr<Packet> DequeuePending (void);
     /**
+     * \brief Clear the pending packet list
+     */
+    void ClearPendingPacket (void);
+    /**
      * \returns number of retries that have been sent for an ArpRequest
      *  in WaitReply state.
      */
@@ -248,7 +270,8 @@
     enum ArpCacheEntryState_e {
       ALIVE,
       WAIT_REPLY,
-      DEAD
+      DEAD,
+      PERMANENT
     };
 
     /**
diff -Naur ns-3.23/src/internet/model/arp-l3-protocol.cc ns-3.24/src/internet/model/arp-l3-protocol.cc
--- ns-3.23/src/internet/model/arp-l3-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/arp-l3-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -289,7 +289,7 @@
               entry->MarkWaitReply (packet);
               Simulator::Schedule (Time (MilliSeconds (m_requestJitter->GetValue ())), &ArpL3Protocol::SendArpRequest, this, cache, destination);
             } 
-          else if (entry->IsWaitReply ()) 
+          else
             {
               NS_FATAL_ERROR ("Test for possibly unreachable code-- please file a bug report, with a test case, if this is ever hit");
             }
@@ -318,6 +318,17 @@
                   m_dropTrace (packet);
                 }
             }
+          else if (entry-> IsPermanent ())
+            {
+              NS_LOG_LOGIC ("node="<<m_node->GetId ()<<
+                            ", permanent for " << destination << "valid -- send");
+              *hardwareDestination = entry->GetMacAddress ();
+              return true;
+            }
+          else
+            {
+              NS_LOG_LOGIC ("Test for possibly unreachable code-- please file a bug report, with a test case, if this is ever hit");
+            }
         }
     }
   else
diff -Naur ns-3.23/src/internet/model/codel-queue.cc ns-3.24/src/internet/model/codel-queue.cc
--- ns-3.23/src/internet/model/codel-queue.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/codel-queue.cc	2015-09-15 11:18:44.000000000 -0700
@@ -184,23 +184,23 @@
     .AddTraceSource ("Count",
                      "CoDel count",
                      MakeTraceSourceAccessor (&CoDelQueue::m_count),
-                     "ns3::TracedValue::Uint32Callback")
+                     "ns3::TracedValueCallback::Uint32")
     .AddTraceSource ("DropCount",
                      "CoDel drop count",
                      MakeTraceSourceAccessor (&CoDelQueue::m_dropCount),
-                     "ns3::TracedValue::Uint32Callback")
+                     "ns3::TracedValueCallback::Uint32")
     .AddTraceSource ("LastCount",
                      "CoDel lastcount",
                      MakeTraceSourceAccessor (&CoDelQueue::m_lastCount),
-                     "ns3::TracedValue::Uint32Callback")
+                     "ns3::TracedValueCallback::Uint32")
     .AddTraceSource ("DropState",
                      "Dropping state",
                      MakeTraceSourceAccessor (&CoDelQueue::m_dropping),
-                     "ns3::TracedValue::BoolCallback")
+                     "ns3::TracedValueCallback::Bool")
     .AddTraceSource ("BytesInQueue",
                      "Number of bytes in the queue",
                      MakeTraceSourceAccessor (&CoDelQueue::m_bytesInQueue),
-                     "ns3::TracedValue::Uint32Callback")
+                     "ns3::TracedValueCallback::Uint32")
     .AddTraceSource ("Sojourn",
                      "Time in the queue",
                      MakeTraceSourceAccessor (&CoDelQueue::m_sojourn),
@@ -208,7 +208,7 @@
     .AddTraceSource ("DropNext",
                      "Time until next packet drop",
                      MakeTraceSourceAccessor (&CoDelQueue::m_dropNext),
-                     "ns3::TracedValue::Uint32Callback")
+                     "ns3::TracedValueCallback::Uint32")
   ;
 
   return tid;
diff -Naur ns-3.23/src/internet/model/icmpv4-l4-protocol.cc ns-3.24/src/internet/model/icmpv4-l4-protocol.cc
--- ns-3.23/src/internet/model/icmpv4-l4-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/icmpv4-l4-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- 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>
+ */
+
 #include "icmpv4-l4-protocol.h"
 #include "ipv4-raw-socket-factory-impl.h"
 #include "ipv4-interface.h"
@@ -72,7 +92,7 @@
             }
         }
     }
-  Object::NotifyNewAggregate ();
+  IpL4Protocol::NotifyNewAggregate ();
 }
 
 uint16_t 
diff -Naur ns-3.23/src/internet/model/icmpv4-l4-protocol.h ns-3.24/src/internet/model/icmpv4-l4-protocol.h
--- ns-3.23/src/internet/model/icmpv4-l4-protocol.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/icmpv4-l4-protocol.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- 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 ICMPV4_L4_PROTOCOL_H
 #define ICMPV4_L4_PROTOCOL_H
 
diff -Naur ns-3.23/src/internet/model/icmpv6-l4-protocol.cc ns-3.24/src/internet/model/icmpv6-l4-protocol.cc
--- ns-3.23/src/internet/model/icmpv6-l4-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/icmpv6-l4-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,4 +1,4 @@
-
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
  * Copyright (c) 2007-2009 Strasbourg University
  *
@@ -137,7 +137,7 @@
             }
         }
     }
-  Object::NotifyNewAggregate ();
+  IpL4Protocol::NotifyNewAggregate ();
 }
 
 void Icmpv6L4Protocol::SetNode (Ptr<Node> node)
diff -Naur ns-3.23/src/internet/model/icmpv6-l4-protocol.h ns-3.24/src/internet/model/icmpv6-l4-protocol.h
--- ns-3.23/src/internet/model/icmpv6-l4-protocol.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/icmpv6-l4-protocol.h	2015-09-15 11:18:44.000000000 -0700
@@ -393,7 +393,7 @@
    * \brief Send a Router Solicitation.
    * \param src link-local source address
    * \param dst destination address (usealy ff02::2 i.e all-routers)
-   * \param hardwareAddress link-layer address (SHOULD be included if src is not ::
+   * \param hardwareAddress link-layer address (SHOULD be included if src is not ::)
    */
   void SendRS (Ipv6Address src, Ipv6Address dst,  Address hardwareAddress);
 
diff -Naur ns-3.23/src/internet/model/ipv4-end-point.cc ns-3.24/src/internet/model/ipv4-end-point.cc
--- ns-3.23/src/internet/model/ipv4-end-point.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv4-end-point.cc	2015-09-15 11:18:44.000000000 -0700
@@ -31,10 +31,12 @@
   : m_localAddr (address), 
     m_localPort (port),
     m_peerAddr (Ipv4Address::GetAny ()),
-    m_peerPort (0)
+    m_peerPort (0),
+    m_rxEnabled (true)
 {
   NS_LOG_FUNCTION (this << address << port);
 }
+
 Ipv4EndPoint::~Ipv4EndPoint ()
 {
   NS_LOG_FUNCTION (this);
@@ -67,18 +69,21 @@
   NS_LOG_FUNCTION (this);
   return m_localPort;
 }
+
 Ipv4Address 
 Ipv4EndPoint::GetPeerAddress (void)
 {
   NS_LOG_FUNCTION (this);
   return m_peerAddr;
 }
+
 uint16_t 
 Ipv4EndPoint::GetPeerPort (void)
 {
   NS_LOG_FUNCTION (this);
   return m_peerPort;
 }
+
 void 
 Ipv4EndPoint::SetPeer (Ipv4Address address, uint16_t port)
 {
@@ -108,6 +113,7 @@
   NS_LOG_FUNCTION (this << &callback);
   m_rxCallback = callback;
 }
+
 void 
 Ipv4EndPoint::SetIcmpCallback (Callback<void,Ipv4Address,uint8_t,uint8_t,uint8_t,uint32_t> callback)
 {
@@ -134,6 +140,7 @@
                               incomingInterface);
     }
 }
+
 void 
 Ipv4EndPoint::DoForwardUp (Ptr<Packet> p, const Ipv4Header& header, uint16_t sport,
                            Ptr<Ipv4Interface> incomingInterface)
@@ -159,6 +166,7 @@
                               icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
     }
 }
+
 void 
 Ipv4EndPoint::DoForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, 
                              uint8_t icmpType, uint8_t icmpCode,
@@ -172,4 +180,16 @@
     }
 }
 
+void
+Ipv4EndPoint::SetRxEnabled (bool enabled)
+{
+  m_rxEnabled = enabled;
+}
+
+bool
+Ipv4EndPoint::IsRxEnabled ()
+{
+  return m_rxEnabled;
+}
+
 } // namespace ns3
diff -Naur ns-3.23/src/internet/model/ipv4-end-point-demux.cc ns-3.24/src/internet/model/ipv4-end-point-demux.cc
--- ns-3.23/src/internet/model/ipv4-end-point-demux.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv4-end-point-demux.cc	2015-09-15 11:18:44.000000000 -0700
@@ -207,10 +207,19 @@
   for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++) 
     {
       Ipv4EndPoint* endP = *i;
+
       NS_LOG_DEBUG ("Looking at endpoint dport=" << endP->GetLocalPort ()
                                                  << " daddr=" << endP->GetLocalAddress ()
                                                  << " sport=" << endP->GetPeerPort ()
                                                  << " saddr=" << endP->GetPeerAddress ());
+
+      if (!endP->IsRxEnabled ())
+        {
+          NS_LOG_LOGIC ("Skipping endpoint " << &endP
+                        << " because endpoint can not receive packets");
+          continue;
+        }
+
       if (endP->GetLocalPort () != dport) 
         {
           NS_LOG_LOGIC ("Skipping endpoint " << &endP
diff -Naur ns-3.23/src/internet/model/ipv4-end-point-demux.h ns-3.24/src/internet/model/ipv4-end-point-demux.h
--- ns-3.23/src/internet/model/ipv4-end-point-demux.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv4-end-point-demux.h	2015-09-15 11:18:44.000000000 -0700
@@ -78,6 +78,15 @@
 
   /**
    * \brief lookup for a match with all the parameters.
+   *
+   * The function will return a list of most-matching EndPoints, in this order:
+   *   -# Full match
+   *   -# All but local address
+   *   -# Only local port and local address match
+   *   -# Only local port match
+   *
+   * EndPoint with disabled Rx are skipped.
+   *
    * \param daddr destination address to test
    * \param dport destination port to test
    * \param saddr source address to test
diff -Naur ns-3.23/src/internet/model/ipv4-end-point.h ns-3.24/src/internet/model/ipv4-end-point.h
--- ns-3.23/src/internet/model/ipv4-end-point.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv4-end-point.h	2015-09-15 11:18:44.000000000 -0700
@@ -168,6 +168,18 @@
                     uint8_t icmpType, uint8_t icmpCode,
                     uint32_t icmpInfo);
 
+  /**
+   * \brief Enable or Disable the endpoint Rx capability.
+   * \param enabled true if Rx is enabled
+   */
+  void SetRxEnabled (bool enabled);
+
+  /**
+   * \brief Checks if the endpoint can receive packets.
+   * \returns true if the endpoint can receive packets.
+   */
+  bool IsRxEnabled (void);
+
 private:
   /**
    * \brief ForwardUp wrapper.
@@ -229,6 +241,11 @@
    * \brief The destroy callback.
    */
   Callback<void> m_destroyCallback;
+
+  /**
+   * \brief true if the endpoint can receive packets.
+   */
+  bool m_rxEnabled;
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/internet/model/ipv4-interface.cc ns-3.24/src/internet/model/ipv4-interface.cc
--- ns-3.23/src/internet/model/ipv4-interface.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv4-interface.cc	2015-09-15 11:18:44.000000000 -0700
@@ -41,6 +41,7 @@
 {
   static TypeId tid = TypeId ("ns3::Ipv4Interface")
     .SetParent<Object> ()
+    .SetGroupName ("Internet")
     .AddAttribute ("ArpCache",
                    "The arp cache for this ipv4 interface",
                    PointerValue (0),
diff -Naur ns-3.23/src/internet/model/ipv4-l3-protocol.cc ns-3.24/src/internet/model/ipv4-l3-protocol.cc
--- ns-3.23/src/internet/model/ipv4-l3-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv4-l3-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -197,7 +197,7 @@
           this->SetNode (node);
         }
     }
-  Object::NotifyNewAggregate ();
+  Ipv4::NotifyNewAggregate ();
 }
 
 void 
diff -Naur ns-3.23/src/internet/model/ipv4-l3-protocol.h ns-3.24/src/internet/model/ipv4-l3-protocol.h
--- ns-3.23/src/internet/model/ipv4-l3-protocol.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv4-l3-protocol.h	2015-09-15 11:18:44.000000000 -0700
@@ -245,8 +245,7 @@
    * \param [in] interface
    */
   typedef void (* SentTracedCallback)
-    (const Ipv4Header & header, const Ptr<const Packet> packet,
-     const uint32_t interface);
+    (const Ipv4Header & header, Ptr<const Packet> packet, uint32_t interface);
    
   /**
    * TracedCallback signature for packet transmission or reception events.
@@ -254,10 +253,11 @@
    * \param [in] packet The packet.
    * \param [in] ipv4
    * \param [in] interface
+   * \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
+   * and will be changed to \c Ptr<const Ipv4> in a future release.
    */
   typedef void (* TxRxTracedCallback)
-    (const Ptr<const Packet> packet, const Ptr<const Ipv4> ipv4, 
-     const uint32_t interface);
+    (Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
 
   /**
    * TracedCallback signature for packet drop events.
@@ -267,11 +267,13 @@
    * \param [in] reason The reason the packet was dropped.
    * \param [in] ipv4
    * \param [in] interface
+   * \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
+   * and will be changed to \c Ptr<const Ipv4> in a future release.
    */
   typedef void (* DropTracedCallback)
-    (const Ipv4Header & header, const Ptr<const Packet> packet,
-     const DropReason reason, const Ptr<const Ipv4> ipv4,
-     const uint32_t interface);
+    (const Ipv4Header & header, Ptr<const Packet> packet,
+     DropReason reason, Ptr<Ipv4> ipv4,
+     uint32_t interface);
    
 protected:
 
@@ -456,11 +458,17 @@
 
   // The following two traces pass a packet with an IP header
   /// Trace of transmitted packets
+  /// \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
+  /// and will be changed to \c Ptr<const Ipv4> in a future release.
   TracedCallback<Ptr<const Packet>, Ptr<Ipv4>,  uint32_t> m_txTrace;
   /// Trace of received packets
+  /// \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
+  /// and will be changed to \c Ptr<const Ipv4> in a future release.
   TracedCallback<Ptr<const Packet>, Ptr<Ipv4>, uint32_t> m_rxTrace;
   // <ip-header, payload, reason, ifindex> (ifindex not valid if reason is DROP_NO_ROUTE)
   /// Trace of dropped packets
+  /// \deprecated The non-const \c Ptr<Ipv4> argument is deprecated
+  /// and will be changed to \c Ptr<const Ipv4> in a future release.
   TracedCallback<const Ipv4Header &, Ptr<const Packet>, DropReason, Ptr<Ipv4>, uint32_t> m_dropTrace;
 
   Ptr<Ipv4RoutingProtocol> m_routingProtocol; //!< Routing protocol associated with the stack
diff -Naur ns-3.23/src/internet/model/ipv4-packet-probe.cc ns-3.24/src/internet/model/ipv4-packet-probe.cc
--- ns-3.23/src/internet/model/ipv4-packet-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv4-packet-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -45,11 +45,11 @@
                       "The packet plus its IPv4 object and interface "
                       "that serve as the output for this probe",
                       MakeTraceSourceAccessor (&Ipv4PacketProbe::m_output),
-                      "ns3::Ipv4PacketProbe::TracedCallback")
+                      "ns3::Ipv4L3Protocol::TxRxTracedCallback")
     .AddTraceSource ( "OutputBytes",
                       "The number of bytes in the packet",
                       MakeTraceSourceAccessor (&Ipv4PacketProbe::m_outputBytes),
-                      "ns3::Packet::PacketSizeTracedCallback")
+                      "ns3::Packet::SizeTracedCallback")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/internet/model/ipv4-packet-probe.h ns-3.24/src/internet/model/ipv4-packet-probe.h
--- ns-3.23/src/internet/model/ipv4-packet-probe.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv4-packet-probe.h	2015-09-15 11:18:44.000000000 -0700
@@ -93,17 +93,6 @@
    */
   virtual void ConnectByPath (std::string path);
 
-  /**
-   * TracedCallback signature for PacketProbe events.
-   *
-   * \param [in] packet The packet.
-   * \param [in] ipv4 
-   * \param [in] interface
-   */
-  typedef void (* TracedCallback)
-    (const Ptr<const Packet> packet, const Ptr<const Ipv4> ipv4,
-     const uint32_t interface);
-
 private:
   /**
    * \brief Method to connect to an underlying ns3::TraceSource with
diff -Naur ns-3.23/src/internet/model/ipv6-end-point.cc ns-3.24/src/internet/model/ipv6-end-point.cc
--- ns-3.23/src/internet/model/ipv6-end-point.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv6-end-point.cc	2015-09-15 11:18:44.000000000 -0700
@@ -33,7 +33,8 @@
   : m_localAddr (addr),
     m_localPort (port),
     m_peerAddr (Ipv6Address::GetAny ()),
-    m_peerPort (0)
+    m_peerPort (0),
+    m_rxEnabled (true)
 {
 }
 
@@ -140,5 +141,16 @@
   m_icmpCallback (src, ttl, type, code, info);
 }
 
+void Ipv6EndPoint::SetRxEnabled (bool enabled)
+{
+  m_rxEnabled = enabled;
+}
+
+bool Ipv6EndPoint::IsRxEnabled ()
+{
+  return m_rxEnabled;
+}
+
+
 } /* namespace ns3 */
 
diff -Naur ns-3.23/src/internet/model/ipv6-end-point-demux.cc ns-3.24/src/internet/model/ipv6-end-point-demux.cc
--- ns-3.23/src/internet/model/ipv6-end-point-demux.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv6-end-point-demux.cc	2015-09-15 11:18:44.000000000 -0700
@@ -182,10 +182,19 @@
   for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++)
     {
       Ipv6EndPoint* endP = *i;
+
       NS_LOG_DEBUG ("Looking at endpoint dport=" << endP->GetLocalPort ()
                                                  << " daddr=" << endP->GetLocalAddress ()
                                                  << " sport=" << endP->GetPeerPort ()
                                                  << " saddr=" << endP->GetPeerAddress ());
+
+      if (!endP->IsRxEnabled ())
+        {
+          NS_LOG_LOGIC ("Skipping endpoint " << &endP
+                        << " because endpoint can not receive packets");
+          continue;
+        }
+
       if (endP->GetLocalPort () != dport)
         {
           NS_LOG_LOGIC ("Skipping endpoint " << &endP
diff -Naur ns-3.23/src/internet/model/ipv6-end-point-demux.h ns-3.24/src/internet/model/ipv6-end-point-demux.h
--- ns-3.23/src/internet/model/ipv6-end-point-demux.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv6-end-point-demux.h	2015-09-15 11:18:44.000000000 -0700
@@ -67,6 +67,15 @@
 
   /**
    * \brief lookup for a match with all the parameters.
+   *
+   * The function will return a list of most-matching EndPoints, in this order:
+   *   -# Full match
+   *   -# All but local address
+   *   -# Only local port and local address match
+   *   -# Only local port match
+   *
+   * EndPoint with disabled Rx are skipped.
+   *
    * \param dst destination address to test
    * \param dport destination port to test
    * \param src source address to test
diff -Naur ns-3.23/src/internet/model/ipv6-end-point.h ns-3.24/src/internet/model/ipv6-end-point.h
--- ns-3.23/src/internet/model/ipv6-end-point.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv6-end-point.h	2015-09-15 11:18:44.000000000 -0700
@@ -177,6 +177,18 @@
   void ForwardIcmp (Ipv6Address src, uint8_t ttl, uint8_t type,
                     uint8_t code, uint32_t info);
 
+  /**
+   * \brief Enable or Disable the endpoint Rx capability.
+   * \param enabled true if Rx is enabled
+   */
+  void SetRxEnabled (bool enabled);
+
+  /**
+   * \brief Checks if the endpoint can receive packets.
+   * \returns true if the endpoint can receive packets.
+   */
+  bool IsRxEnabled (void);
+
 private:
   /**
    * \brief ForwardUp wrapper.
@@ -237,6 +249,11 @@
    * \brief The destroy callback.
    */
   Callback<void> m_destroyCallback;
+
+  /**
+   * \brief true if the endpoint can receive packets.
+   */
+  bool m_rxEnabled;
 };
 
 } /* namespace ns3 */
diff -Naur ns-3.23/src/internet/model/ipv6-extension-header.cc ns-3.24/src/internet/model/ipv6-extension-header.cc
--- ns-3.23/src/internet/model/ipv6-extension-header.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv6-extension-header.cc	2015-09-15 11:18:44.000000000 -0700
@@ -68,6 +68,10 @@
 
 void Ipv6ExtensionHeader::SetLength (uint16_t length)
 {
+  NS_ASSERT_MSG (!(length & 0x7), "Invalid Ipv6ExtensionHeader Length, must be a multiple of 8 bytes.");
+  NS_ASSERT_MSG (length > 0, "Invalid Ipv6ExtensionHeader Length, must be greater than 0.");
+  NS_ASSERT_MSG (length < 2048, "Invalid Ipv6ExtensionHeader Length, must be a lower than 2048.");
+
   m_length = (length >> 3) - 1;
 }
 
@@ -333,7 +337,7 @@
   : m_offset (0),
     m_identification (0)
 {
-  SetLength (0);
+  SetLength (16);
 }
 
 Ipv6ExtensionFragmentHeader::~Ipv6ExtensionFragmentHeader ()
@@ -398,8 +402,7 @@
   Buffer::Iterator i = start;
 
   SetNextHeader (i.ReadU8 ());
-  i.ReadU8();
-  SetLength (0);
+  SetLength ((i.ReadU8 () + 1) << 3);
   m_offset = i.ReadNtohU16 ();
   m_identification = i.ReadNtohU32 ();
 
diff -Naur ns-3.23/src/internet/model/ipv6-interface.cc ns-3.24/src/internet/model/ipv6-interface.cc
--- ns-3.23/src/internet/model/ipv6-interface.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv6-interface.cc	2015-09-15 11:18:44.000000000 -0700
@@ -121,7 +121,7 @@
     {
       icmpv6 = proto->GetObject <Icmpv6L4Protocol> ();
     }
-  if (icmpv6)
+  if (icmpv6 && !m_ndCache)
     {
       m_ndCache = icmpv6->CreateCache (m_device, this);
     }
@@ -179,6 +179,7 @@
     {
       return;
     }
+  DoSetup ();
   m_ifup = true;
 }
 
diff -Naur ns-3.23/src/internet/model/ipv6-l3-protocol.cc ns-3.24/src/internet/model/ipv6-l3-protocol.cc
--- ns-3.23/src/internet/model/ipv6-l3-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv6-l3-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -693,7 +693,7 @@
           this->SetNode (node);
         }
     }
-  Object::NotifyNewAggregate ();
+  Ipv6::NotifyNewAggregate ();
 }
 
 void Ipv6L3Protocol::SetNode (Ptr<Node> node)
diff -Naur ns-3.23/src/internet/model/ipv6-l3-protocol.h ns-3.24/src/internet/model/ipv6-l3-protocol.h
--- ns-3.23/src/internet/model/ipv6-l3-protocol.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv6-l3-protocol.h	2015-09-15 11:18:44.000000000 -0700
@@ -395,8 +395,7 @@
    * \param [in] interface
    */
   typedef void (* SentTracedCallback)
-    (const Ipv6Header & header, const Ptr<const Packet> packet,
-     const uint32_t interface);
+    (const Ipv6Header & header, Ptr<const Packet> packet, uint32_t interface);
    
   /**
    * TracedCallback signature for packet transmission or reception events.
@@ -404,10 +403,11 @@
    * \param [in] packet The packet.
    * \param [in] ipv6
    * \param [in] interface
+   * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
+   * and will be changed to \c Ptr<const Ipv6> in a future release.
    */
   typedef void (* TxRxTracedCallback)
-    (const Ptr<const Packet> packet, const Ptr<const Ipv6> ipv6,
-     const uint32_t interface);
+    (Ptr<const Packet> packet, Ptr<Ipv6> ipv6, uint32_t interface);
 
   /**
    * TracedCallback signature for packet drop events.
@@ -417,11 +417,13 @@
    * \param [in] reason The reason the packet was dropped.
    * \param [in] ipv6
    * \param [in] interface
+   * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
+   * and will be changed to \c Ptr<const Ipv6> in a future release.
    */
   typedef void (* DropTracedCallback)
-    (const Ipv6Header & header, const Ptr<const Packet> packet,
-     const DropReason reason, const Ptr<const Ipv6> ipv6,
-     const uint32_t interface);
+    (const Ipv6Header & header, Ptr<const Packet> packet,
+     DropReason reason, Ptr<Ipv6> ipv6,
+     uint32_t interface);
    
 protected:
   /**
@@ -468,16 +470,22 @@
 
   /**
    * \brief Callback to trace TX (transmission) packets.
+   * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
+   * and will be changed to \c Ptr<const Ipv6> in a future release.
    */ 
   TracedCallback<Ptr<const Packet>, Ptr<Ipv6>, uint32_t> m_txTrace;
 
   /**
    * \brief Callback to trace RX (reception) packets.
+   * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
+   * and will be changed to \c Ptr<const Ipv6> in a future release.
    */ 
   TracedCallback<Ptr<const Packet>, Ptr<Ipv6>, uint32_t> m_rxTrace;
 
   /**
    * \brief Callback to trace drop packets.
+   * \deprecated The non-const \c Ptr<Ipv6> argument is deprecated
+   * and will be changed to \c Ptr<const Ipv6> in a future release.
    */ 
   TracedCallback<const Ipv6Header &, Ptr<const Packet>, DropReason, Ptr<Ipv6>, uint32_t> m_dropTrace;
 
diff -Naur ns-3.23/src/internet/model/ipv6-packet-probe.cc ns-3.24/src/internet/model/ipv6-packet-probe.cc
--- ns-3.23/src/internet/model/ipv6-packet-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv6-packet-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -46,11 +46,11 @@
                       "The packet plus its IPv6 object and interface "
                       "that serve as the output for this probe",
                       MakeTraceSourceAccessor (&Ipv6PacketProbe::m_output),
-                      "ns3::Ipv6PacketProbe::TracedCallback")
+                      "ns3::Ipv6L3Protocol::TxRxTracedCallback")
     .AddTraceSource ( "OutputBytes",
                       "The number of bytes in the packet",
                       MakeTraceSourceAccessor (&Ipv6PacketProbe::m_outputBytes),
-                      "ns3::Packet::PacketSizeTracedCallback")
+                      "ns3::Packet::SizeTracedCallback")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/internet/model/ipv6-packet-probe.h ns-3.24/src/internet/model/ipv6-packet-probe.h
--- ns-3.23/src/internet/model/ipv6-packet-probe.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv6-packet-probe.h	2015-09-15 11:18:44.000000000 -0700
@@ -95,17 +95,6 @@
    */
   virtual void ConnectByPath (std::string path);
 
-  /**
-   * TracedCallback signature for PacketProbe events.
-   *
-   * \param [in] packet The packet.
-   * \param [in] ipv6 
-   * \param [in] interface
-   */
-  typedef void (* TracedCallback)
-    (const Ptr<const Packet> packet, const Ptr<const Ipv6> ipv6,
-     const uint32_t interface);
-
 private:
   /**
    * \brief Method to connect to an underlying ns3::TraceSource with
diff -Naur ns-3.23/src/internet/model/ipv6-pmtu-cache.h ns-3.24/src/internet/model/ipv6-pmtu-cache.h
--- ns-3.23/src/internet/model/ipv6-pmtu-cache.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ipv6-pmtu-cache.h	2015-09-15 11:18:44.000000000 -0700
@@ -111,7 +111,7 @@
   /**
    * \brief Container of the IPv6 PMTU data (Ipv6 destination address and expiration event).
    */
-  typedef std::map<Ipv6Address, EventId> ::iterator pathMtuTimerIter;
+  typedef std::map<Ipv6Address, EventId>::iterator pathMtuTimerIter;
 
   /**
    * \brief Path MTU Expiration table
diff -Naur ns-3.23/src/internet/model/nsc-tcp-l4-protocol.cc ns-3.24/src/internet/model/nsc-tcp-l4-protocol.cc
--- ns-3.23/src/internet/model/nsc-tcp-l4-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/nsc-tcp-l4-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -244,7 +244,7 @@
             }
         }
     }
-  Object::NotifyNewAggregate ();
+  IpL4Protocol::NotifyNewAggregate ();
 }
 
 int 
diff -Naur ns-3.23/src/internet/model/nsc-tcp-socket-impl.cc ns-3.24/src/internet/model/nsc-tcp-socket-impl.cc
--- ns-3.23/src/internet/model/nsc-tcp-socket-impl.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/nsc-tcp-socket-impl.cc	2015-09-15 11:18:44.000000000 -0700
@@ -58,11 +58,11 @@
     .AddTraceSource ("CongestionWindow",
                      "The TCP connection's congestion window",
                      MakeTraceSourceAccessor (&NscTcpSocketImpl::m_cWnd),
-                     "ns3::TracedValue::Uint32Callback")
+                     "ns3::TracedValueCallback::Uint32")
     .AddTraceSource ("SlowStartThreshold",
                      "TCP slow start threshold (bytes)",
                      MakeTraceSourceAccessor (&NscTcpSocketImpl::m_ssThresh),
-                     "ns3::TracedValue::Uint32Callback")
+                     "ns3::TracedValueCallback::Uint32")
     .AddTraceSource ("State",
                      "TCP state",
                      MakeTraceSourceAccessor (&NscTcpSocketImpl::m_state),
diff -Naur ns-3.23/src/internet/model/ripng.cc ns-3.24/src/internet/model/ripng.cc
--- ns-3.23/src/internet/model/ripng.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/ripng.cc	2015-09-15 11:18:44.000000000 -0700
@@ -151,7 +151,7 @@
       TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
       Ptr<Node> theNode = GetObject<Node> ();
       m_recvSocket = Socket::CreateSocket (theNode, tid);
-      Inet6SocketAddress local = Inet6SocketAddress (Ipv6Address::GetAny (), RIPNG_PORT);
+      Inet6SocketAddress local = Inet6SocketAddress (RIPNG_ALL_NODE, RIPNG_PORT);
       m_recvSocket->Bind (local);
       m_recvSocket->SetRecvCallback (MakeCallback (&RipNg::Receive, this));
       m_recvSocket->SetIpv6RecvHopLimit (true);
@@ -347,7 +347,7 @@
       TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
       Ptr<Node> theNode = GetObject<Node> ();
       m_recvSocket = Socket::CreateSocket (theNode, tid);
-      Inet6SocketAddress local = Inet6SocketAddress (Ipv6Address::GetAny (), RIPNG_PORT);
+      Inet6SocketAddress local = Inet6SocketAddress (RIPNG_ALL_NODE, RIPNG_PORT);
       m_recvSocket->Bind (local);
       m_recvSocket->SetRecvCallback (MakeCallback (&RipNg::Receive, this));
       m_recvSocket->SetIpv6RecvHopLimit (true);
diff -Naur ns-3.23/src/internet/model/rtt-estimator.cc ns-3.24/src/internet/model/rtt-estimator.cc
--- ns-3.23/src/internet/model/rtt-estimator.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/rtt-estimator.cc	2015-09-15 11:18:44.000000000 -0700
@@ -38,6 +38,7 @@
 
 NS_OBJECT_ENSURE_REGISTERED (RttEstimator);
 
+/// Tolerance used to check reciprocal of two numbers.
 static const double TOLERANCE = 1e-6;
 
 TypeId 
diff -Naur ns-3.23/src/internet/model/sim_errno.h ns-3.24/src/internet/model/sim_errno.h
--- ns-3.23/src/internet/model/sim_errno.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/sim_errno.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- 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
 
diff -Naur ns-3.23/src/internet/model/tcp-header.cc ns-3.24/src/internet/model/tcp-header.cc
--- ns-3.23/src/internet/model/tcp-header.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-header.cc	2015-09-15 11:18:44.000000000 -0700
@@ -176,8 +176,8 @@
 }
 
 void 
-TcpHeader::InitializeChecksum (Ipv4Address source, 
-                               Ipv4Address destination,
+TcpHeader::InitializeChecksum (const Ipv4Address &source,
+                               const Ipv4Address &destination,
                                uint8_t protocol)
 {
   m_source = source;
@@ -186,8 +186,8 @@
 }
 
 void 
-TcpHeader::InitializeChecksum (Ipv6Address source, 
-                               Ipv6Address destination,
+TcpHeader::InitializeChecksum (const Ipv6Address &source,
+                               const Ipv6Address &destination,
                                uint8_t protocol)
 {
   m_source = source;
@@ -196,8 +196,8 @@
 }
 
 void 
-TcpHeader::InitializeChecksum (Address source, 
-                               Address destination,
+TcpHeader::InitializeChecksum (const Address &source,
+                               const Address &destination,
                                uint8_t protocol)
 {
   m_source = source;
@@ -516,4 +516,11 @@
     );
 }
 
+std::ostream&
+operator<< (std::ostream& os, TcpHeader const & tc)
+{
+  tc.Print (os);
+  return os;
+}
+
 } // namespace ns3
diff -Naur ns-3.23/src/internet/model/tcp-header.h ns-3.24/src/internet/model/tcp-header.h
--- ns-3.23/src/internet/model/tcp-header.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-header.h	2015-09-15 11:18:44.000000000 -0700
@@ -48,6 +48,15 @@
   virtual ~TcpHeader ();
 
   /**
+   * \brief Print a TCP header into an output stream
+   *
+   * \param os output stream
+   * \param tc TCP header to print
+   * \return The ostream passed as first argument
+   */
+  friend std::ostream& operator<<(std::ostream& os, TcpHeader const & tc);
+
+  /**
    * \brief Converts an integer into a human readable list of Tcp flags
    *
    * \param flags Bitfield of TCP flags to convert to a readable string
@@ -204,8 +213,8 @@
    *        IP packet.
    *
    */
-  void InitializeChecksum (Ipv4Address source, 
-                           Ipv4Address destination,
+  void InitializeChecksum (const Ipv4Address &source,
+                           const Ipv4Address &destination,
                            uint8_t protocol);
 
   /**
@@ -222,8 +231,8 @@
    *        IP packet.
    *
    */
-  void InitializeChecksum (Ipv6Address source, 
-                           Ipv6Address destination,
+  void InitializeChecksum (const Ipv6Address &source,
+                           const Ipv6Address &destination,
                            uint8_t protocol);
 
   /**
@@ -240,8 +249,8 @@
    *        IP packet.
    *
    */
-  void InitializeChecksum (Address source, 
-                           Address destination,
+  void InitializeChecksum (const Address &source,
+                           const Address &destination,
                            uint8_t protocol);
 
   /**
diff -Naur ns-3.23/src/internet/model/tcp-l4-protocol.cc ns-3.24/src/internet/model/tcp-l4-protocol.cc
--- ns-3.23/src/internet/model/tcp-l4-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-l4-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -57,12 +57,12 @@
 
 #undef NS_LOG_APPEND_CONTEXT
 #define NS_LOG_APPEND_CONTEXT                                   \
-  if (m_node) { std::clog << Simulator::Now ().GetSeconds () << " [node " << m_node->GetId () << "] "; } 
+  if (m_node) { std::clog << Simulator::Now ().GetSeconds () << " [node " << m_node->GetId () << "] "; }
 
 /* see http://www.iana.org/assignments/protocol-numbers */
 const uint8_t TcpL4Protocol::PROT_NUMBER = 6;
 
-TypeId 
+TypeId
 TcpL4Protocol::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::TcpL4Protocol")
@@ -91,7 +91,7 @@
   : m_endPoints (new Ipv4EndPointDemux ()), m_endPoints6 (new Ipv6EndPointDemux ())
 {
   NS_LOG_FUNCTION_NOARGS ();
-  NS_LOG_LOGIC ("Made a TcpL4Protocol "<<this);
+  NS_LOG_LOGIC ("Made a TcpL4Protocol " << this);
 }
 
 TcpL4Protocol::~TcpL4Protocol ()
@@ -99,17 +99,12 @@
   NS_LOG_FUNCTION_NOARGS ();
 }
 
-void 
+void
 TcpL4Protocol::SetNode (Ptr<Node> node)
 {
   m_node = node;
 }
 
-/* 
- * This method is called by AddAgregate and completes the aggregation
- * by setting the node in the TCP stack, link it to the ipv4 stack and 
- * adding TCP socket factory to the node.
- */
 void
 TcpL4Protocol::NotifyNewAggregate ()
 {
@@ -132,21 +127,21 @@
   // functions.  Since these functions have different prototypes, we
   // need to keep track of whether we are connected to an IPv4 or
   // IPv6 lower layer and call the appropriate one.
-  
+
   if (ipv4 != 0 && m_downTarget.IsNull ())
     {
-      ipv4->Insert(this);
-      this->SetDownTarget(MakeCallback(&Ipv4::Send, ipv4));
+      ipv4->Insert (this);
+      this->SetDownTarget (MakeCallback (&Ipv4::Send, ipv4));
     }
   if (ipv6 != 0 && m_downTarget6.IsNull ())
     {
-      ipv6->Insert(this);
-      this->SetDownTarget6(MakeCallback(&Ipv6L3Protocol::Send, ipv6));
+      ipv6->Insert (this);
+      this->SetDownTarget6 (MakeCallback (&Ipv6L3Protocol::Send, ipv6));
     }
-  Object::NotifyNewAggregate ();
+  IpL4Protocol::NotifyNewAggregate ();
 }
 
-int 
+int
 TcpL4Protocol::GetProtocolNumber (void) const
 {
   return PROT_NUMBER;
@@ -236,7 +231,7 @@
                                 peerAddress, peerPort);
 }
 
-void 
+void
 TcpL4Protocol::DeAllocate (Ipv4EndPoint *endPoint)
 {
   NS_LOG_FUNCTION (this << endPoint);
@@ -287,13 +282,13 @@
   m_endPoints6->DeAllocate (endPoint);
 }
 
-void 
+void
 TcpL4Protocol::ReceiveIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,
                             uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo,
                             Ipv4Address payloadSource,Ipv4Address payloadDestination,
                             const uint8_t payload[8])
 {
-  NS_LOG_FUNCTION (this << icmpSource << icmpTtl << icmpType << icmpCode << icmpInfo 
+  NS_LOG_FUNCTION (this << icmpSource << icmpTtl << icmpType << icmpCode << icmpInfo
                         << payloadSource << payloadDestination);
   uint16_t src, dst;
   src = payload[0] << 8;
@@ -309,18 +304,18 @@
   else
     {
       NS_LOG_DEBUG ("no endpoint found source=" << payloadSource <<
-                    ", destination="<<payloadDestination<<
+                    ", destination=" << payloadDestination <<
                     ", src=" << src << ", dst=" << dst);
     }
 }
 
-void 
+void
 TcpL4Protocol::ReceiveIcmp (Ipv6Address icmpSource, uint8_t icmpTtl,
                             uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo,
                             Ipv6Address payloadSource,Ipv6Address payloadDestination,
                             const uint8_t payload[8])
 {
-  NS_LOG_FUNCTION (this << icmpSource << icmpTtl << icmpType << icmpCode << icmpInfo 
+  NS_LOG_FUNCTION (this << icmpSource << icmpTtl << icmpType << icmpCode << icmpInfo
                         << payloadSource << payloadDestination);
   uint16_t src, dst;
   src = payload[0] << 8;
@@ -336,277 +331,203 @@
   else
     {
       NS_LOG_DEBUG ("no endpoint found source=" << payloadSource <<
-                    ", destination="<<payloadDestination<<
+                    ", destination=" << payloadDestination <<
                     ", src=" << src << ", dst=" << dst);
     }
 }
 
 enum IpL4Protocol::RxStatus
-TcpL4Protocol::Receive (Ptr<Packet> packet,
-                        Ipv4Header const &ipHeader,
-                        Ptr<Ipv4Interface> incomingInterface)
+TcpL4Protocol::PacketReceived (Ptr<Packet> packet, TcpHeader &incomingTcpHeader,
+                               const Address &source, const Address &destination)
 {
-  NS_LOG_FUNCTION (this << packet << ipHeader << incomingInterface);
 
-  TcpHeader tcpHeader;
-  if(Node::ChecksumEnabled ())
+  if (Node::ChecksumEnabled ())
     {
-      tcpHeader.EnableChecksums ();
-      tcpHeader.InitializeChecksum (ipHeader.GetSource (), ipHeader.GetDestination (), PROT_NUMBER);
+      incomingTcpHeader.EnableChecksums ();
+      incomingTcpHeader.InitializeChecksum (source, destination, PROT_NUMBER);
     }
 
-  packet->PeekHeader (tcpHeader);
+  packet->PeekHeader (incomingTcpHeader);
 
   NS_LOG_LOGIC ("TcpL4Protocol " << this
-                                 << " receiving seq " << tcpHeader.GetSequenceNumber ()
-                                 << " ack " << tcpHeader.GetAckNumber ()
-                                 << " flags "<< std::hex << (int)tcpHeader.GetFlags () << std::dec
+                                 << " receiving seq " << incomingTcpHeader.GetSequenceNumber ()
+                                 << " ack " << incomingTcpHeader.GetAckNumber ()
+                                 << " flags "<< TcpHeader::FlagsToString (incomingTcpHeader.GetFlags ())
                                  << " data size " << packet->GetSize ());
 
-  if(!tcpHeader.IsChecksumOk ())
+  if (!incomingTcpHeader.IsChecksumOk ())
     {
       NS_LOG_INFO ("Bad checksum, dropping packet!");
       return IpL4Protocol::RX_CSUM_FAILED;
     }
 
-  NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" received a packet");
-  Ipv4EndPointDemux::EndPoints endPoints =
-    m_endPoints->Lookup (ipHeader.GetDestination (), tcpHeader.GetDestinationPort (),
-                         ipHeader.GetSource (), tcpHeader.GetSourcePort (),incomingInterface);
-  if (endPoints.empty ())
-    {
-      if (this->GetObject<Ipv6L3Protocol> () != 0)
-        {
-          NS_LOG_LOGIC ("  No Ipv4 endpoints matched on TcpL4Protocol, trying Ipv6 "<<this);
-          Ptr<Ipv6Interface> fakeInterface;
-          Ipv6Header ipv6Header;
-          Ipv6Address src = Ipv6Address::MakeIpv4MappedAddress (ipHeader.GetSource ());
-          Ipv6Address dst = Ipv6Address::MakeIpv4MappedAddress (ipHeader.GetDestination ());
-          ipv6Header.SetSourceAddress (src);
-          ipv6Header.SetDestinationAddress (dst);
-          return (this->Receive (packet, ipv6Header, fakeInterface));
-        }
+  return IpL4Protocol::RX_OK;
+}
 
-      NS_LOG_LOGIC ("  No endpoints matched on TcpL4Protocol "<<this);
-      std::ostringstream oss;
-      oss<<"  destination IP: ";
-      ipHeader.GetDestination ().Print (oss);
-      oss<<" destination port: "<< tcpHeader.GetDestinationPort ()<<" source IP: ";
-      ipHeader.GetSource ().Print (oss);
-      oss<<" source port: "<<tcpHeader.GetSourcePort ();
-      NS_LOG_LOGIC (oss.str ());
+void
+TcpL4Protocol::NoEndPointsFound (const TcpHeader &incomingHeader,
+                                 const Address &incomingSAddr,
+                                 const Address &incomingDAddr)
+{
+  if (!(incomingHeader.GetFlags () & TcpHeader::RST))
+    {
+      // build a RST packet and send
+      Ptr<Packet> rstPacket = Create<Packet> ();
+      TcpHeader outgoingTcpHeader;
 
-      if (!(tcpHeader.GetFlags () & TcpHeader::RST))
+      if (incomingHeader.GetFlags () & TcpHeader::ACK)
         {
-          // build a RST packet and send
-          Ptr<Packet> rstPacket = Create<Packet> ();
-          TcpHeader header;
-          if (tcpHeader.GetFlags () & TcpHeader::ACK)
-            {
-              // ACK bit was set
-              header.SetFlags (TcpHeader::RST);
-              header.SetSequenceNumber (header.GetAckNumber ());
-            }
-          else
-            {
-              header.SetFlags (TcpHeader::RST | TcpHeader::ACK);
-              header.SetSequenceNumber (SequenceNumber32 (0));
-              header.SetAckNumber (header.GetSequenceNumber () + SequenceNumber32 (1));
-            }
-          header.SetSourcePort (tcpHeader.GetDestinationPort ());
-          header.SetDestinationPort (tcpHeader.GetSourcePort ());
-          SendPacket (rstPacket, header, ipHeader.GetDestination (), ipHeader.GetSource ());
-          return IpL4Protocol::RX_ENDPOINT_CLOSED;
+          // ACK bit was set
+          outgoingTcpHeader.SetFlags (TcpHeader::RST);
+          outgoingTcpHeader.SetSequenceNumber (incomingHeader.GetAckNumber ());
         }
       else
         {
-          return IpL4Protocol::RX_ENDPOINT_CLOSED;
+          outgoingTcpHeader.SetFlags (TcpHeader::RST | TcpHeader::ACK);
+          outgoingTcpHeader.SetSequenceNumber (SequenceNumber32 (0));
+          outgoingTcpHeader.SetAckNumber (incomingHeader.GetSequenceNumber () +
+                                          SequenceNumber32 (1));
         }
+
+      // Remember that parameters refer to the incoming packet; in reply,
+      // we need to swap src/dst
+
+      outgoingTcpHeader.SetSourcePort (incomingHeader.GetDestinationPort ());
+      outgoingTcpHeader.SetDestinationPort (incomingHeader.GetSourcePort ());
+
+      SendPacket (rstPacket, outgoingTcpHeader, incomingDAddr, incomingSAddr);
     }
-  NS_ASSERT_MSG (endPoints.size () == 1, "Demux returned more than one endpoint");
-  NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" forwarding up to endpoint/socket");
-  (*endPoints.begin ())->ForwardUp (packet, ipHeader, tcpHeader.GetSourcePort (), 
-                                    incomingInterface);
-  return IpL4Protocol::RX_OK;
 }
 
 enum IpL4Protocol::RxStatus
 TcpL4Protocol::Receive (Ptr<Packet> packet,
-                        Ipv6Header const &ipHeader,
-                        Ptr<Ipv6Interface> interface)
+                        Ipv4Header const &incomingIpHeader,
+                        Ptr<Ipv4Interface> incomingInterface)
 {
-  NS_LOG_FUNCTION (this << packet << ipHeader.GetSourceAddress () << ipHeader.GetDestinationAddress ());
+  NS_LOG_FUNCTION (this << packet << incomingIpHeader << incomingInterface);
 
-  TcpHeader tcpHeader;
+  TcpHeader incomingTcpHeader;
+  IpL4Protocol::RxStatus checksumControl;
 
-  // If we are receving a v4-mapped packet, we will re-calculate the TCP checksum
-  // Is it worth checking every received "v6" packet to see if it is v4-mapped in
-  // order to avoid re-calculating TCP checksums for v4-mapped packets?
+  checksumControl = PacketReceived (packet, incomingTcpHeader,
+                                    incomingIpHeader.GetSource (),
+                                    incomingIpHeader.GetDestination ());
 
-  if(Node::ChecksumEnabled ())
+  if (checksumControl != IpL4Protocol::RX_OK)
     {
-      tcpHeader.EnableChecksums ();
-      tcpHeader.InitializeChecksum (ipHeader.GetSourceAddress (), ipHeader.GetDestinationAddress (), PROT_NUMBER);
+      return checksumControl;
     }
 
-  packet->PeekHeader (tcpHeader);
-
-  NS_LOG_LOGIC ("TcpL4Protocol " << this
-                                 << " receiving seq " << tcpHeader.GetSequenceNumber ()
-                                 << " ack " << tcpHeader.GetAckNumber ()
-                                 << " flags "<< std::hex << (int)tcpHeader.GetFlags () << std::dec
-                                 << " data size " << packet->GetSize ());
+  NS_LOG_LOGIC ("TcpL4Protocol " << this << " received a packet");
 
-  if(!tcpHeader.IsChecksumOk ())
-    {
-      NS_LOG_INFO ("Bad checksum, dropping packet!");
-      return IpL4Protocol::RX_CSUM_FAILED;
-    }
+  Ipv4EndPointDemux::EndPoints endPoints;
+  endPoints = m_endPoints->Lookup (incomingIpHeader.GetDestination (),
+                                   incomingTcpHeader.GetDestinationPort (),
+                                   incomingIpHeader.GetSource (),
+                                   incomingTcpHeader.GetSourcePort (),
+                                   incomingInterface);
 
-  NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" received a packet");
-  Ipv6EndPointDemux::EndPoints endPoints =
-    m_endPoints6->Lookup (ipHeader.GetDestinationAddress (), tcpHeader.GetDestinationPort (),
-                          ipHeader.GetSourceAddress (), tcpHeader.GetSourcePort (),interface);
   if (endPoints.empty ())
     {
-      NS_LOG_LOGIC ("  No IPv6 endpoints matched on TcpL4Protocol "<<this);
-      std::ostringstream oss;
-      oss<<"  destination IP: ";
-      (ipHeader.GetDestinationAddress ()).Print (oss);
-      oss<<" destination port: "<< tcpHeader.GetDestinationPort ()<<" source IP: ";
-      (ipHeader.GetSourceAddress ()).Print (oss);
-      oss<<" source port: "<<tcpHeader.GetSourcePort ();
-      NS_LOG_LOGIC (oss.str ());
-
-      if (!(tcpHeader.GetFlags () & TcpHeader::RST))
-        {
-          // build a RST packet and send
-          Ptr<Packet> rstPacket = Create<Packet> ();
-          TcpHeader header;
-          if (tcpHeader.GetFlags () & TcpHeader::ACK)
-            {
-              // ACK bit was set
-              header.SetFlags (TcpHeader::RST);
-              header.SetSequenceNumber (header.GetAckNumber ());
-            }
-          else
-            {
-              header.SetFlags (TcpHeader::RST | TcpHeader::ACK);
-              header.SetSequenceNumber (SequenceNumber32 (0));
-              header.SetAckNumber (header.GetSequenceNumber () + SequenceNumber32 (1));
-            }
-          header.SetSourcePort (tcpHeader.GetDestinationPort ());
-          header.SetDestinationPort (tcpHeader.GetSourcePort ());
-          SendPacket (rstPacket, header, ipHeader.GetDestinationAddress (), ipHeader.GetSourceAddress ());
-          return IpL4Protocol::RX_ENDPOINT_CLOSED;
-        }
-      else
+      if (this->GetObject<Ipv6L3Protocol> () != 0)
         {
-          return IpL4Protocol::RX_ENDPOINT_CLOSED;
+          NS_LOG_LOGIC ("  No Ipv4 endpoints matched on TcpL4Protocol, trying Ipv6 " << this);
+          Ptr<Ipv6Interface> fakeInterface;
+          Ipv6Header ipv6Header;
+          Ipv6Address src, dst;
+
+          src = Ipv6Address::MakeIpv4MappedAddress (incomingIpHeader.GetSource ());
+          dst = Ipv6Address::MakeIpv4MappedAddress (incomingIpHeader.GetDestination ());
+          ipv6Header.SetSourceAddress (src);
+          ipv6Header.SetDestinationAddress (dst);
+          return (this->Receive (packet, ipv6Header, fakeInterface));
         }
+
+      NS_LOG_LOGIC ("No endpoints matched on TcpL4Protocol "<< this <<
+                    " destination IP: " << incomingIpHeader.GetDestination () <<
+                    " destination port: "<< incomingTcpHeader.GetDestinationPort () <<
+                    " source IP: " << incomingIpHeader.GetSource () <<
+                    " source port: "<< incomingTcpHeader.GetSourcePort ());
+
+      NoEndPointsFound (incomingTcpHeader, incomingIpHeader.GetSource (),
+                        incomingIpHeader.GetDestination ());
+
+      return IpL4Protocol::RX_ENDPOINT_CLOSED;
+
     }
+
   NS_ASSERT_MSG (endPoints.size () == 1, "Demux returned more than one endpoint");
-  NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" forwarding up to endpoint/socket");
-  (*endPoints.begin ())->ForwardUp (packet, ipHeader, tcpHeader.GetSourcePort (), interface);
+  NS_LOG_LOGIC ("TcpL4Protocol " << this << " forwarding up to endpoint/socket");
+
+  (*endPoints.begin ())->ForwardUp (packet, incomingIpHeader,
+                                    incomingTcpHeader.GetSourcePort (),
+                                    incomingInterface);
+
   return IpL4Protocol::RX_OK;
 }
 
-void
-TcpL4Protocol::Send (Ptr<Packet> packet, 
-                     Ipv4Address saddr, Ipv4Address daddr,
-                     uint16_t sport, uint16_t dport, Ptr<NetDevice> oif)
+enum IpL4Protocol::RxStatus
+TcpL4Protocol::Receive (Ptr<Packet> packet,
+                        Ipv6Header const &incomingIpHeader,
+                        Ptr<Ipv6Interface> interface)
 {
-  NS_LOG_FUNCTION (this << packet << saddr << daddr << sport << dport << oif);
+  NS_LOG_FUNCTION (this << packet << incomingIpHeader.GetSourceAddress () <<
+                   incomingIpHeader.GetDestinationAddress ());
 
-  TcpHeader tcpHeader;
-  tcpHeader.SetDestinationPort (dport);
-  tcpHeader.SetSourcePort (sport);
-  if(Node::ChecksumEnabled ())
-    {
-      tcpHeader.EnableChecksums ();
-    }
-  tcpHeader.InitializeChecksum (saddr,
-                                daddr,
-                                PROT_NUMBER);
-  tcpHeader.SetFlags (TcpHeader::ACK);
-  tcpHeader.SetAckNumber (SequenceNumber32 (0));
+  TcpHeader incomingTcpHeader;
+  IpL4Protocol::RxStatus checksumControl;
+
+  // If we are receving a v4-mapped packet, we will re-calculate the TCP checksum
+  // Is it worth checking every received "v6" packet to see if it is v4-mapped in
+  // order to avoid re-calculating TCP checksums for v4-mapped packets?
 
-  packet->AddHeader (tcpHeader);
+  checksumControl = PacketReceived (packet, incomingTcpHeader,
+                                    incomingIpHeader.GetSourceAddress (),
+                                    incomingIpHeader.GetDestinationAddress ());
 
-  Ptr<Ipv4> ipv4 = m_node->GetObject<Ipv4> ();
-  if (ipv4 != 0)
+  if (checksumControl != IpL4Protocol::RX_OK)
     {
-      Ipv4Header header;
-      header.SetDestination (daddr);
-      header.SetProtocol (PROT_NUMBER);
-      Socket::SocketErrno errno_;
-      Ptr<Ipv4Route> route;
-      Ptr<NetDevice> oif (0); //specify non-zero if bound to a source address
-      if (ipv4->GetRoutingProtocol () != 0)
-        {
-          route = ipv4->GetRoutingProtocol ()->RouteOutput (packet, header, oif, errno_);
-        }
-      else
-        {
-          NS_LOG_ERROR ("No IPV4 Routing Protocol");
-          route = 0;
-        }
-      ipv4->Send (packet, saddr, daddr, PROT_NUMBER, route);
+      return checksumControl;
     }
-}
 
-void
-TcpL4Protocol::Send (Ptr<Packet> packet,
-                     Ipv6Address saddr, Ipv6Address daddr,
-                     uint16_t sport, uint16_t dport, Ptr<NetDevice> oif)
-{
-  NS_LOG_FUNCTION (this << packet << saddr << daddr << sport << dport << oif);
-
-  TcpHeader tcpHeader;
-  tcpHeader.SetDestinationPort (dport);
-  tcpHeader.SetSourcePort (sport);
-  if(Node::ChecksumEnabled ())
+  NS_LOG_LOGIC ("TcpL4Protocol " << this << " received a packet");
+  Ipv6EndPointDemux::EndPoints endPoints =
+    m_endPoints6->Lookup (incomingIpHeader.GetDestinationAddress (),
+                          incomingTcpHeader.GetDestinationPort (),
+                          incomingIpHeader.GetSourceAddress (),
+                          incomingTcpHeader.GetSourcePort (), interface);
+  if (endPoints.empty ())
     {
-      tcpHeader.EnableChecksums ();
-    }
-  tcpHeader.InitializeChecksum (saddr,
-                                daddr,
-                                PROT_NUMBER);
-  tcpHeader.SetFlags (TcpHeader::ACK);
-  tcpHeader.SetAckNumber (SequenceNumber32 (0));
+      NS_LOG_LOGIC ("No endpoints matched on TcpL4Protocol "<< this <<
+                    " destination IP: " << incomingIpHeader.GetDestinationAddress () <<
+                    " destination port: "<< incomingTcpHeader.GetDestinationPort () <<
+                    " source IP: " << incomingIpHeader.GetSourceAddress () <<
+                    " source port: "<< incomingTcpHeader.GetSourcePort ());
 
-  packet->AddHeader (tcpHeader);
+      NoEndPointsFound (incomingTcpHeader, incomingIpHeader.GetSourceAddress (),
+                        incomingIpHeader.GetDestinationAddress ());
 
-  Ptr<Ipv6L3Protocol> ipv6 = m_node->GetObject<Ipv6L3Protocol> ();
-  if (ipv6 != 0)
-    {
-      Ipv6Header header;
-      header.SetDestinationAddress (daddr);
-      header.SetNextHeader (PROT_NUMBER);
-      Socket::SocketErrno errno_;
-      Ptr<Ipv6Route> route;
-      Ptr<NetDevice> oif (0); //specify non-zero if bound to a source address
-      if (ipv6->GetRoutingProtocol () != 0)
-        {
-          route = ipv6->GetRoutingProtocol ()->RouteOutput (packet, header, oif, errno_);
-        }
-      else
-        {
-          NS_LOG_ERROR ("No IPV6 Routing Protocol");
-          route = 0;
-        }
-      ipv6->Send (packet, saddr, daddr, PROT_NUMBER, route);
+      return IpL4Protocol::RX_ENDPOINT_CLOSED;
     }
+
+  NS_ASSERT_MSG (endPoints.size () == 1, "Demux returned more than one endpoint");
+  NS_LOG_LOGIC ("TcpL4Protocol " << this << " forwarding up to endpoint/socket");
+
+  (*endPoints.begin ())->ForwardUp (packet, incomingIpHeader,
+                                    incomingTcpHeader.GetSourcePort (), interface);
+
+  return IpL4Protocol::RX_OK;
 }
 
 void
-TcpL4Protocol::SendPacket (Ptr<Packet> packet, const TcpHeader &outgoing,
-                           Ipv4Address saddr, Ipv4Address daddr, Ptr<NetDevice> oif)
+TcpL4Protocol::SendPacketV4 (Ptr<Packet> packet, const TcpHeader &outgoing,
+                             const Ipv4Address &saddr, const Ipv4Address &daddr,
+                             Ptr<NetDevice> oif) const
 {
   NS_LOG_LOGIC ("TcpL4Protocol " << this
                                  << " sending seq " << outgoing.GetSequenceNumber ()
                                  << " ack " << outgoing.GetAckNumber ()
-                                 << " flags " << std::hex << (int)outgoing.GetFlags () << std::dec
+                                 << " flags " << TcpHeader::FlagsToString (outgoing.GetFlags ())
                                  << " data size " << packet->GetSize ());
   NS_LOG_FUNCTION (this << packet << saddr << daddr << oif);
   // XXX outgoingHeader cannot be logged
@@ -614,7 +535,7 @@
   TcpHeader outgoingHeader = outgoing;
   /** \todo UrgentPointer */
   /* outgoingHeader.SetUrgentPointer (0); */
-  if(Node::ChecksumEnabled ())
+  if (Node::ChecksumEnabled ())
     {
       outgoingHeader.EnableChecksums ();
     }
@@ -622,11 +543,12 @@
 
   packet->AddHeader (outgoingHeader);
 
-  Ptr<Ipv4> ipv4 = 
+  Ptr<Ipv4> ipv4 =
     m_node->GetObject<Ipv4> ();
   if (ipv4 != 0)
     {
       Ipv4Header header;
+      header.SetSource (saddr);
       header.SetDestination (daddr);
       header.SetProtocol (PROT_NUMBER);
       Socket::SocketErrno errno_;
@@ -643,29 +565,32 @@
       m_downTarget (packet, saddr, daddr, PROT_NUMBER, route);
     }
   else
-    NS_FATAL_ERROR ("Trying to use Tcp on a node without an Ipv4 interface");
+    {
+      NS_FATAL_ERROR ("Trying to use Tcp on a node without an Ipv4 interface");
+    }
 }
 
 void
-TcpL4Protocol::SendPacket (Ptr<Packet> packet, const TcpHeader &outgoing,
-                           Ipv6Address saddr, Ipv6Address daddr, Ptr<NetDevice> oif)
+TcpL4Protocol::SendPacketV6 (Ptr<Packet> packet, const TcpHeader &outgoing,
+                             const Ipv6Address &saddr, const Ipv6Address &daddr,
+                             Ptr<NetDevice> oif) const
 {
   NS_LOG_LOGIC ("TcpL4Protocol " << this
                                  << " sending seq " << outgoing.GetSequenceNumber ()
                                  << " ack " << outgoing.GetAckNumber ()
-                                 << " flags " << std::hex << (int)outgoing.GetFlags () << std::dec
+                                 << " flags " << TcpHeader::FlagsToString (outgoing.GetFlags ())
                                  << " data size " << packet->GetSize ());
   NS_LOG_FUNCTION (this << packet << saddr << daddr << oif);
   // XXX outgoingHeader cannot be logged
 
   if (daddr.IsIpv4MappedAddress ())
     {
-      return (SendPacket (packet, outgoing, saddr.GetIpv4MappedAddress(), daddr.GetIpv4MappedAddress(), oif));
+      return (SendPacket (packet, outgoing, saddr.GetIpv4MappedAddress (), daddr.GetIpv4MappedAddress (), oif));
     }
   TcpHeader outgoingHeader = outgoing;
   /** \todo UrgentPointer */
   /* outgoingHeader.SetUrgentPointer (0); */
-  if(Node::ChecksumEnabled ())
+  if (Node::ChecksumEnabled ())
     {
       outgoingHeader.EnableChecksums ();
     }
@@ -677,8 +602,8 @@
   if (ipv6 != 0)
     {
       Ipv6Header header;
-      header.SetDestinationAddress (daddr);
       header.SetSourceAddress (saddr);
+      header.SetDestinationAddress (daddr);
       header.SetNextHeader (PROT_NUMBER);
       Socket::SocketErrno errno_;
       Ptr<Ipv6Route> route;
@@ -694,7 +619,91 @@
       m_downTarget6 (packet, saddr, daddr, PROT_NUMBER, route);
     }
   else
-    NS_FATAL_ERROR ("Trying to use Tcp on a node without an Ipv6 interface");
+    {
+      NS_FATAL_ERROR ("Trying to use Tcp on a node without an Ipv6 interface");
+    }
+}
+
+void
+TcpL4Protocol::SendPacket (Ptr<Packet> pkt, const TcpHeader &outgoing,
+                           const Address &saddr, const Address &daddr,
+                           Ptr<NetDevice> oif) const
+{
+  if (Ipv4Address::IsMatchingType (saddr))
+    {
+      NS_ASSERT (Ipv4Address::IsMatchingType (daddr));
+
+      SendPacketV4 (pkt, outgoing, Ipv4Address::ConvertFrom (saddr),
+                    Ipv4Address::ConvertFrom (daddr), oif);
+
+      return;
+    }
+  else if (Ipv6Address::IsMatchingType (saddr))
+    {
+      NS_ASSERT (Ipv6Address::IsMatchingType (daddr));
+
+      SendPacketV6 (pkt, outgoing, Ipv6Address::ConvertFrom (saddr),
+                    Ipv6Address::ConvertFrom (daddr), oif);
+
+      return;
+    }
+  else if (InetSocketAddress::IsMatchingType (saddr))
+    {
+      InetSocketAddress s = InetSocketAddress::ConvertFrom (saddr);
+      InetSocketAddress d = InetSocketAddress::ConvertFrom (daddr);
+
+      SendPacketV4 (pkt, outgoing, s.GetIpv4 (), d.GetIpv4 (), oif);
+
+      return;
+    }
+  else if (Inet6SocketAddress::IsMatchingType (saddr))
+    {
+      Inet6SocketAddress s = Inet6SocketAddress::ConvertFrom (saddr);
+      Inet6SocketAddress d = Inet6SocketAddress::ConvertFrom (daddr);
+
+      SendPacketV6 (pkt, outgoing, s.GetIpv6 (), d.GetIpv6 (), oif);
+
+      return;
+    }
+
+  NS_FATAL_ERROR ("Trying to send a packet without IP addresses");
+}
+
+void
+TcpL4Protocol::AddSocket (Ptr<TcpSocketBase> socket)
+{
+  std::vector<Ptr<TcpSocketBase> >::iterator it = m_sockets.begin ();
+
+  while (it != m_sockets.end ())
+    {
+      if (*it == socket)
+        {
+          return;
+        }
+
+      ++it;
+    }
+
+  m_sockets.push_back (socket);
+}
+
+bool
+TcpL4Protocol::RemoveSocket (Ptr<TcpSocketBase> socket)
+{
+  std::vector<Ptr<TcpSocketBase> >::iterator it = m_sockets.begin ();
+
+  while (it != m_sockets.end ())
+    {
+      if (*it == socket)
+        {
+          m_sockets.erase (it);
+          return true;
+        }
+
+      ++it;
+    }
+
+  return false;
 }
 
 void
diff -Naur ns-3.23/src/internet/model/tcp-l4-protocol.h ns-3.24/src/internet/model/tcp-l4-protocol.h
--- ns-3.23/src/internet/model/tcp-l4-protocol.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-l4-protocol.h	2015-09-15 11:18:44.000000000 -0700
@@ -23,13 +23,11 @@
 
 #include <stdint.h>
 
-#include "ns3/packet.h"
 #include "ns3/ipv4-address.h"
 #include "ns3/ipv6-address.h"
-#include "ns3/ptr.h"
-#include "ns3/object-factory.h"
+#include "ns3/sequence-number.h"
 #include "ip-l4-protocol.h"
-#include "ns3/net-device.h"
+
 
 namespace ns3 {
 
@@ -45,12 +43,24 @@
 
 /**
  * \ingroup tcp
- * \brief A layer between the sockets interface and IP
+ * \brief Tcp socket creation and multiplexing/demultiplexing
  * 
- * This class allocates "endpoint" objects (ns3::Ipv4EndPoint) for TCP,
+ * A single instance of this class is held by one instance of class Node.
+ *
+ * The creation of TcpSocket are handled in the method CreateSocket, which is
+ * called by TcpSocketFactory. Upon creation, this class is responsible to
+ * the socket initialization and handle multiplexing/demultiplexing of data
+ * between node's TCP sockets. Demultiplexing is done by receiving
+ * packets from IP, and forwards them up to the right socket. Multiplexing
+ * is done through the SendPacket function, which sends the packet down the stack.
+ *
+ * Moreover, this class allocates "endpoint" objects (ns3::Ipv4EndPoint) for TCP,
  * and SHOULD checksum packets its receives from the socket layer going down
- * the stack , but currently checksumming is disabled.  It also receives 
- * packets from IP, and forwards them up to the endpoints.
+ * the stack, but currently checksumming is disabled.
+ *
+ * \see CreateSocket
+ * \see NotifyNewAggregate
+ * \see SendPacket
 */
 
 class TcpL4Protocol : public IpL4Protocol {
@@ -71,16 +81,16 @@
    */
   void SetNode (Ptr<Node> node);
 
-  virtual int GetProtocolNumber (void) const;
-
   /**
-   * \brief Create a TCP socket
+   * \brief Create a TCP socket using the TypeId set by SocketType attribute
+   *
    * \return A smart Socket pointer to a TcpSocket allocated by this instance
    * of the TCP protocol
    */
   Ptr<Socket> CreateSocket (void);
   /**
-   * \brief Create a TCP socket
+   * \brief Create a TCP socket using the specified TypeId
+   *
    * \return A smart Socket pointer to a TcpSocket allocated by this instance
    * of the TCP protocol
    *
@@ -160,6 +170,36 @@
                            Ipv6Address peerAddress, uint16_t peerPort);
 
   /**
+   * \brief Send a packet via TCP (IP-agnostic)
+   *
+   * \param pkt The packet to send
+   * \param outgoing The packet header
+   * \param saddr The source Ipv4Address
+   * \param daddr The destination Ipv4Address
+   * \param oif The output interface bound. Defaults to null (unspecified).
+   */
+  void SendPacket (Ptr<Packet> pkt, const TcpHeader &outgoing,
+                   const Address &saddr, const Address &daddr,
+                   Ptr<NetDevice> oif = 0) const;
+
+  /**
+   * \brief Make a socket fully operational
+   *
+   * Called after a socket has been bound, it is inserted in an internal vector.
+   *
+   * \param socket Socket to be added
+   */
+  void AddSocket (Ptr<TcpSocketBase> socket);
+
+  /**
+   * \brief Remove a socket from the internal list
+   *
+   * \param socket socket to Remove
+   * \return true if the socket has been removed
+   */
+  bool RemoveSocket (Ptr<TcpSocketBase> socket);
+
+  /**
    * \brief Remove an IPv4 Endpoint.
    * \param endPoint the end point to remove
    */
@@ -170,37 +210,12 @@
    */
   void DeAllocate (Ipv6EndPoint *endPoint);
 
-  /**
-   * \brief Send a packet via TCP (IPv4)
-   * \param packet The packet to send
-   * \param saddr The source Ipv4Address
-   * \param daddr The destination Ipv4Address
-   * \param sport The source port number
-   * \param dport The destination port number
-   * \param oif The output interface bound. Defaults to null (unspecified).
-   */
-  void Send (Ptr<Packet> packet,
-             Ipv4Address saddr, Ipv4Address daddr, 
-             uint16_t sport, uint16_t dport, Ptr<NetDevice> oif = 0);
-  /**
-   * \brief Send a packet via TCP (IPv6)
-   * \param packet The packet to send
-   * \param saddr The source Ipv4Address
-   * \param daddr The destination Ipv4Address
-   * \param sport The source port number
-   * \param dport The destination port number
-   * \param oif The output interface bound. Defaults to null (unspecified).
-   */
-  void Send (Ptr<Packet> packet,
-             Ipv6Address saddr, Ipv6Address daddr, 
-             uint16_t sport, uint16_t dport, Ptr<NetDevice> oif = 0);
-
-
+  // From IpL4Protocol
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                               Ipv4Header const &header,
+                                               Ipv4Header const &incomingIpHeader,
                                                Ptr<Ipv4Interface> incomingInterface);
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                               Ipv6Header const &header,
+                                               Ipv6Header const &incomingIpHeader,
                                                Ptr<Ipv6Interface> incomingInterface);
 
   virtual void ReceiveIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,
@@ -212,32 +227,65 @@
                             Ipv6Address payloadSource,Ipv6Address payloadDestination,
                             const uint8_t payload[8]);
 
-  // From IpL4Protocol
   virtual void SetDownTarget (IpL4Protocol::DownTargetCallback cb);
   virtual void SetDownTarget6 (IpL4Protocol::DownTargetCallback6 cb);
-  // From IpL4Protocol
+  virtual int GetProtocolNumber (void) const;
   virtual IpL4Protocol::DownTargetCallback GetDownTarget (void) const;
   virtual IpL4Protocol::DownTargetCallback6 GetDownTarget6 (void) const;
 
 protected:
   virtual void DoDispose (void);
-  /* 
-   * This function will notify other components connected to the node that a new stack member is now connected
-   * This will be used to notify Layer 3 protocol of layer 4 protocol stack to connect them together.
+
+  /**
+   * \brief Setup socket factory and callbacks when aggregated to a node
+   *
+   * This function will notify other components connected to the node that a
+   * new stack member is now connected. This will be used to notify Layer 3
+   * protocol of layer 4 protocol stack to connect them together.
+   * The aggregation is completed by setting the node in the TCP stack, link
+   * it to the ipv4 or ipv6 stack and adding TCP socket factory to the node.
    */
   virtual void NotifyNewAggregate ();
+
+  /**
+   * \brief Get the tcp header of the incoming packet and checks its checksum if needed
+   *
+   * \param packet Received packet
+   * \param incomingTcpHeader Overwritten with the tcp header of the packet
+   * \param source Source address (an underlying Ipv4Address or Ipv6Address)
+   * \param destination Destination address (an underlying Ipv4Address or Ipv6Address)
+   *
+   * \return RX_CSUM_FAILED if the checksum check fails, RX_OK otherwise
+   */
+  enum IpL4Protocol::RxStatus
+  PacketReceived (Ptr<Packet> packet, TcpHeader &incomingTcpHeader,
+                  const Address &source, const Address &destination);
+
+  /**
+   * \brief Check if RST packet should be sent, and in case, send it
+   *
+   * The function is called when no endpoint is found for the received
+   * packet. So TcpL4Protocol do not know to who the packet should be
+   * given to. An RST packet is sent out as reply unless the received packet
+   * has the RST flag set.
+   *
+   * \param incomingHeader TCP header of the incoming packet
+   * \param incomingSAddr Source address of the incoming packet
+   * \param incomingDAddr Destination address of the incoming packet
+   *
+   */
+  void NoEndPointsFound (const TcpHeader &incomingHeader, const Address &incomingSAddr,
+                         const Address &incomingDAddr);
+
 private:
-  Ptr<Node> m_node; //!< the node this stack is associated with
-  Ipv4EndPointDemux *m_endPoints; //!< A list of IPv4 end points.
+  Ptr<Node> m_node;                //!< the node this stack is associated with
+  Ipv4EndPointDemux *m_endPoints;  //!< A list of IPv4 end points.
   Ipv6EndPointDemux *m_endPoints6; //!< A list of IPv6 end points.
-  TypeId m_rttTypeId; //!< The RTT Estimator TypeId
-  TypeId m_socketTypeId; //!< The socket TypeId
-private:
-  friend class TcpSocketBase;
-  void SendPacket (Ptr<Packet>, const TcpHeader &,
-                   Ipv4Address, Ipv4Address, Ptr<NetDevice> oif = 0);
-  void SendPacket (Ptr<Packet>, const TcpHeader &,
-                   Ipv6Address, Ipv6Address, Ptr<NetDevice> oif = 0);
+  TypeId m_rttTypeId;              //!< The RTT Estimator TypeId
+  TypeId m_socketTypeId;           //!< The socket TypeId
+  std::vector<Ptr<TcpSocketBase> > 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
 
   /**
    * \brief Copy constructor
@@ -253,9 +301,31 @@
    */
   TcpL4Protocol &operator = (const TcpL4Protocol &);
 
-  std::vector<Ptr<TcpSocketBase> > 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
+  /**
+   * \brief Send a packet via TCP (IPv4)
+   *
+   * \param pkt The packet to send
+   * \param outgoing The packet header
+   * \param saddr The source Ipv4Address
+   * \param daddr The destination Ipv4Address
+   * \param oif The output interface bound. Defaults to null (unspecified).
+   */
+  void SendPacketV4 (Ptr<Packet> pkt, const TcpHeader &outgoing,
+                     const Ipv4Address &saddr, const Ipv4Address &daddr,
+                     Ptr<NetDevice> oif = 0) const;
+
+  /**
+   * \brief Send a packet via TCP (IPv6)
+   *
+   * \param pkt The packet to send
+   * \param outgoing The packet header
+   * \param saddr The source Ipv4Address
+   * \param daddr The destination Ipv4Address
+   * \param oif The output interface bound. Defaults to null (unspecified).
+   */
+  void SendPacketV6 (Ptr<Packet> pkt, const TcpHeader &outgoing,
+                     const Ipv6Address &saddr, const Ipv6Address &daddr,
+                     Ptr<NetDevice> oif = 0) const;
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/internet/model/tcp-newreno.cc ns-3.24/src/internet/model/tcp-newreno.cc
--- ns-3.23/src/internet/model/tcp-newreno.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-newreno.cc	2015-09-15 11:18:44.000000000 -0700
@@ -49,14 +49,6 @@
                    BooleanValue (false),
                    MakeBooleanAccessor (&TcpNewReno::m_limitedTx),
                    MakeBooleanChecker ())
-    .AddTraceSource ("CongestionWindow",
-                     "The TCP connection's congestion window",
-                     MakeTraceSourceAccessor (&TcpNewReno::m_cWnd),
-                     "ns3::TracedValue::Uint32Callback")
-    .AddTraceSource ("SlowStartThreshold",
-                     "TCP slow start threshold (bytes)",
-                     MakeTraceSourceAccessor (&TcpNewReno::m_ssThresh),
-                     "ns3::TracedValue::Uint32Callback")
  ;
   return tid;
 }
@@ -71,10 +63,6 @@
 
 TcpNewReno::TcpNewReno (const TcpNewReno& sock)
   : TcpSocketBase (sock),
-    m_cWnd (sock.m_cWnd),
-    m_ssThresh (sock.m_ssThresh),
-    m_initialCWnd (sock.m_initialCWnd),
-    m_initialSsThresh (sock.m_initialSsThresh),
     m_retxThresh (sock.m_retxThresh),
     m_inFastRec (false),
     m_limitedTx (sock.m_limitedTx)
@@ -87,32 +75,6 @@
 {
 }
 
-/* We initialize m_cWnd from this function, after attributes initialized */
-int
-TcpNewReno::Listen (void)
-{
-  NS_LOG_FUNCTION (this);
-  InitializeCwnd ();
-  return TcpSocketBase::Listen ();
-}
-
-/* We initialize m_cWnd from this function, after attributes initialized */
-int
-TcpNewReno::Connect (const Address & address)
-{
-  NS_LOG_FUNCTION (this << address);
-  InitializeCwnd ();
-  return TcpSocketBase::Connect (address);
-}
-
-/* Limit the size of in-flight data by cwnd and receiver's rxwin */
-uint32_t
-TcpNewReno::Window (void)
-{
-  NS_LOG_FUNCTION (this);
-  return std::min (m_rWnd.Get (), m_cWnd.Get ());
-}
-
 Ptr<TcpSocketBase>
 TcpNewReno::Fork (void)
 {
@@ -220,55 +182,4 @@
   DoRetransmit ();                          // Retransmit the packet
 }
 
-void
-TcpNewReno::SetSegSize (uint32_t size)
-{
-  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpNewReno::SetSegSize() cannot change segment size after connection started.");
-  m_segmentSize = size;
-}
-
-void
-TcpNewReno::SetInitialSSThresh (uint32_t threshold)
-{
-  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpNewReno::SetSSThresh() cannot change initial ssThresh after connection started.");
-  m_initialSsThresh = threshold;
-}
-
-uint32_t
-TcpNewReno::GetInitialSSThresh (void) const
-{
-  return m_initialSsThresh;
-}
-
-void
-TcpNewReno::SetInitialCwnd (uint32_t cwnd)
-{
-  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpNewReno::SetInitialCwnd() cannot change initial cwnd after connection started.");
-  m_initialCWnd = cwnd;
-}
-
-uint32_t
-TcpNewReno::GetInitialCwnd (void) const
-{
-  return m_initialCWnd;
-}
-
-void 
-TcpNewReno::InitializeCwnd (void)
-{
-  /*
-   * Initialize congestion window, default to 1 MSS (RFC2001, sec.1) and must
-   * not be larger than 2 MSS (RFC2581, sec.3.1). Both m_initiaCWnd and
-   * m_segmentSize are set by the attribute system in ns3::TcpSocket.
-   */
-  m_cWnd = m_initialCWnd * m_segmentSize;
-  m_ssThresh = m_initialSsThresh;
-}
-
-void
-TcpNewReno::ScaleSsThresh (uint8_t scaleFactor)
-{
-  m_ssThresh <<= scaleFactor;
-}
-
 } // namespace ns3
diff -Naur ns-3.23/src/internet/model/tcp-newreno.h ns-3.24/src/internet/model/tcp-newreno.h
--- ns-3.23/src/internet/model/tcp-newreno.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-newreno.h	2015-09-15 11:18:44.000000000 -0700
@@ -52,36 +52,13 @@
   TcpNewReno (const TcpNewReno& sock);
   virtual ~TcpNewReno (void);
 
-  // From TcpSocketBase
-  virtual int Connect (const Address &address);
-  virtual int Listen (void);
-
 protected:
-  virtual uint32_t Window (void); // Return the max possible number of unacked bytes
   virtual Ptr<TcpSocketBase> Fork (void); // Call CopyObject<TcpNewReno> to clone me
   virtual void NewAck (SequenceNumber32 const& seq); // Inc cwnd and call NewAck() of parent
   virtual void DupAck (const TcpHeader& t, uint32_t count);  // Halving cwnd and reset nextTxSequence
   virtual void Retransmit (void); // Exit fast recovery upon retransmit timeout
 
-  // Implementing ns3::TcpSocket -- Attribute get/set
-  virtual void     SetSegSize (uint32_t size);
-  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 ScaleSsThresh (uint8_t scaleFactor);
-
-private:
-  /**
-   * \brief Set the congestion window when connection starts
-   */
-  void InitializeCwnd (void);
-
 protected:
-  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 value
   SequenceNumber32       m_recover;      //!< Previous highest Tx seqnum for fast recovery
   uint32_t               m_retxThresh;   //!< Fast Retransmit threshold
   bool                   m_inFastRec;    //!< currently in fast recovery
diff -Naur ns-3.23/src/internet/model/tcp-reno.cc ns-3.24/src/internet/model/tcp-reno.cc
--- ns-3.23/src/internet/model/tcp-reno.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-reno.cc	2015-09-15 11:18:44.000000000 -0700
@@ -45,14 +45,6 @@
                     UintegerValue (3),
                     MakeUintegerAccessor (&TcpReno::m_retxThresh),
                     MakeUintegerChecker<uint32_t> ())
-    .AddTraceSource ("CongestionWindow",
-                     "The TCP connection's congestion window",
-                     MakeTraceSourceAccessor (&TcpReno::m_cWnd),
-                     "ns3::TracedValue::Uint32Callback")
-    .AddTraceSource ("SlowStartThreshold",
-                     "TCP slow start threshold (bytes)",
-                     MakeTraceSourceAccessor (&TcpReno::m_ssThresh),
-                     "ns3::TracedValue::Uint32Callback")
   ;
   return tid;
 }
@@ -64,10 +56,6 @@
 
 TcpReno::TcpReno (const TcpReno& sock)
   : TcpSocketBase (sock),
-    m_cWnd (sock.m_cWnd),
-    m_ssThresh (sock.m_ssThresh),
-    m_initialCWnd (sock.m_initialCWnd),
-    m_initialSsThresh (sock.m_initialSsThresh),
     m_retxThresh (sock.m_retxThresh),
     m_inFastRec (false)
 {
@@ -79,32 +67,6 @@
 {
 }
 
-/* We initialize m_cWnd from this function, after attributes initialized */
-int
-TcpReno::Listen (void)
-{
-  NS_LOG_FUNCTION (this);
-  InitializeCwnd ();
-  return TcpSocketBase::Listen ();
-}
-
-/* We initialize m_cWnd from this function, after attributes initialized */
-int
-TcpReno::Connect (const Address & address)
-{
-  NS_LOG_FUNCTION (this << address);
-  InitializeCwnd ();
-  return TcpSocketBase::Connect (address);
-}
-
-/* Limit the size of in-flight data by cwnd and receiver's rxwin */
-uint32_t
-TcpReno::Window (void)
-{
-  NS_LOG_FUNCTION (this);
-  return std::min (m_rWnd.Get (), m_cWnd.Get ());
-}
-
 Ptr<TcpSocketBase>
 TcpReno::Fork (void)
 {
@@ -195,56 +157,4 @@
   DoRetransmit ();                          // Retransmit the packet
 }
 
-void
-TcpReno::SetSegSize (uint32_t size)
-{
-  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpReno::SetSegSize() cannot change segment size after connection started.");
-  m_segmentSize = size;
-}
-
-void
-TcpReno::SetInitialSSThresh (uint32_t threshold)
-{
-  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpReno::SetSSThresh() cannot change initial ssThresh after connection started.");
-  m_initialSsThresh = threshold;
-}
-
-uint32_t
-TcpReno::GetInitialSSThresh (void) const
-{
-  return m_initialSsThresh;
-}
-
-void
-TcpReno::SetInitialCwnd (uint32_t cwnd)
-{
-  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpReno::SetInitialCwnd() cannot change initial cwnd after connection started.");
-  m_initialCWnd = cwnd;
-}
-
-uint32_t
-TcpReno::GetInitialCwnd (void) const
-{
-  return m_initialCWnd;
-}
-
-void 
-TcpReno::InitializeCwnd (void)
-{
-  /*
-   * Initialize congestion window, default to 1 MSS (RFC2001, sec.1) and must
-   * not be larger than 2 MSS (RFC2581, sec.3.1). Both m_initiaCWnd and
-   * m_segmentSize are set by the attribute system in ns3::TcpSocket.
-   */
-  m_cWnd = m_initialCWnd * m_segmentSize;
-  m_ssThresh = m_initialSsThresh;
-}
-
-void
-TcpReno::ScaleSsThresh (uint8_t scaleFactor)
-{
-  m_ssThresh <<= scaleFactor;
-}
-
-
 } // namespace ns3
diff -Naur ns-3.23/src/internet/model/tcp-reno.h ns-3.24/src/internet/model/tcp-reno.h
--- ns-3.23/src/internet/model/tcp-reno.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-reno.h	2015-09-15 11:18:44.000000000 -0700
@@ -54,36 +54,13 @@
   TcpReno (const TcpReno& sock);
   virtual ~TcpReno (void);
 
-  // From TcpSocketBase
-  virtual int Connect (const Address &address);
-  virtual int Listen (void);
-
 protected:
-  virtual uint32_t Window (void); // Return the max possible number of unacked bytes
   virtual Ptr<TcpSocketBase> Fork (void); // Call CopyObject<TcpReno> to clone me
   virtual void NewAck (const SequenceNumber32& seq); // Inc cwnd and call NewAck() of parent
   virtual void DupAck (const TcpHeader& t, uint32_t count);  // Fast retransmit
   virtual void Retransmit (void); // Retransmit timeout
 
-  // Implementing ns3::TcpSocket -- Attribute get/set
-  virtual void     SetSegSize (uint32_t size);
-  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 ScaleSsThresh (uint8_t scaleFactor);
-
-private:
-  /**
-   * \brief Set the congestion window when connection starts
-   */
-  void InitializeCwnd (void);
-
 protected:
-  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 value
   uint32_t               m_retxThresh;   //!< Fast Retransmit threshold
   bool                   m_inFastRec;    //!< currently in fast recovery
 };
diff -Naur ns-3.23/src/internet/model/tcp-socket-base.cc ns-3.24/src/internet/model/tcp-socket-base.cc
--- ns-3.23/src/internet/model/tcp-socket-base.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-socket-base.cc	2015-09-15 11:18:44.000000000 -0700
@@ -141,7 +141,7 @@
     .AddTraceSource ("RWND",
                      "Remote side's flow control window",
                      MakeTraceSourceAccessor (&TcpSocketBase::m_rWnd),
-                     "ns3::TracedValue::Uint32Callback")
+                     "ns3::TracedValueCallback::Uint32")
     .AddTraceSource ("HighestRxSequence",
                      "Highest sequence number received from peer",
                      MakeTraceSourceAccessor (&TcpSocketBase::m_highRxMark),
@@ -150,6 +150,14 @@
                      "Highest ack received from peer",
                      MakeTraceSourceAccessor (&TcpSocketBase::m_highRxAckMark),
                      "ns3::SequenceNumber32TracedValueCallback")
+    .AddTraceSource ("CongestionWindow",
+                     "The TCP connection's congestion window",
+                     MakeTraceSourceAccessor (&TcpSocketBase::m_cWnd),
+                     "ns3::TracedValueCallback::Uint32")
+    .AddTraceSource ("SlowStartThreshold",
+                     "TCP slow start threshold (bytes)",
+                     MakeTraceSourceAccessor (&TcpSocketBase::m_ssThresh),
+                     "ns3::TracedValueCallback::Uint32")
   ;
   return tid;
 }
@@ -221,6 +229,10 @@
     m_rWnd (sock.m_rWnd),
     m_highRxMark (sock.m_highRxMark),
     m_highRxAckMark (sock.m_highRxAckMark),
+    m_cWnd (sock.m_cWnd),
+    m_ssThresh (sock.m_ssThresh),
+    m_initialCWnd (sock.m_initialCWnd),
+    m_initialSsThresh (sock.m_initialSsThresh),
     m_winScalingEnabled (sock.m_winScalingEnabled),
     m_sndScaleFactor (sock.m_sndScaleFactor),
     m_rcvScaleFactor (sock.m_rcvScaleFactor),
@@ -331,10 +343,8 @@
       return -1;
     }
 
-  if (std::find(m_tcp->m_sockets.begin(), m_tcp->m_sockets.end(), this) == m_tcp->m_sockets.end())
-    {
-      m_tcp->m_sockets.push_back (this);
-    }
+  m_tcp->AddSocket(this);
+
   return SetupCallback ();
 }
 
@@ -349,10 +359,8 @@
       return -1;
     }
 
-  if (std::find(m_tcp->m_sockets.begin(), m_tcp->m_sockets.end(), this) == m_tcp->m_sockets.end())
-    {
-      m_tcp->m_sockets.push_back (this);
-    }
+  m_tcp->AddSocket(this);
+
   return SetupCallback ();
 }
 
@@ -421,21 +429,64 @@
       return -1;
     }
 
-  if (std::find(m_tcp->m_sockets.begin(), m_tcp->m_sockets.end(), this) == m_tcp->m_sockets.end())
-    {
-      m_tcp->m_sockets.push_back (this);
-    }
+  m_tcp->AddSocket(this);
+
   NS_LOG_LOGIC ("TcpSocketBase " << this << " got an endpoint: " << m_endPoint);
 
   return SetupCallback ();
 }
 
+void
+TcpSocketBase::InitializeCwnd (void)
+{
+  m_cWnd = m_initialCWnd * m_segmentSize;
+  m_ssThresh = m_initialSsThresh;
+}
+
+void
+TcpSocketBase::SetInitialSSThresh (uint32_t threshold)
+{
+  NS_ABORT_MSG_UNLESS (m_state == CLOSED,
+    "TcpSocketBase::SetSSThresh() cannot change initial ssThresh after connection started.");
+
+  m_initialSsThresh = threshold;
+}
+
+uint32_t
+TcpSocketBase::GetInitialSSThresh (void) const
+{
+  return m_initialSsThresh;
+}
+
+void
+TcpSocketBase::SetInitialCwnd (uint32_t cwnd)
+{
+  NS_ABORT_MSG_UNLESS (m_state == CLOSED,
+    "TcpSocketBase::SetInitialCwnd() cannot change initial cwnd after connection started.");
+
+  m_initialCWnd = cwnd;
+}
+
+uint32_t
+TcpSocketBase::GetInitialCwnd (void) const
+{
+  return m_initialCWnd;
+}
+
+void
+TcpSocketBase::ScaleSsThresh (uint8_t scaleFactor)
+{
+  m_ssThresh <<= scaleFactor;
+}
+
 /* Inherit from Socket class: Initiate connection to a remote address:port */
 int
 TcpSocketBase::Connect (const Address & address)
 {
   NS_LOG_FUNCTION (this << address);
 
+  InitializeCwnd ();
+
   // If haven't do so, Bind() this socket first
   if (InetSocketAddress::IsMatchingType (address) && m_endPoint6 == 0)
     {
@@ -507,6 +558,9 @@
 TcpSocketBase::Listen (void)
 {
   NS_LOG_FUNCTION (this);
+
+  InitializeCwnd ();
+
   // Linux quits EINVAL if we're not in CLOSED state, so match what they do
   if (m_state != CLOSED)
     {
@@ -891,13 +945,34 @@
 TcpSocketBase::ForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16_t port,
                           Ptr<Ipv4Interface> incomingInterface)
 {
-  DoForwardUp (packet, header, port, incomingInterface);
+  NS_LOG_LOGIC ("Socket " << this << " forward up " <<
+                m_endPoint->GetPeerAddress () <<
+                ":" << m_endPoint->GetPeerPort () <<
+                " to " << m_endPoint->GetLocalAddress () <<
+                ":" << m_endPoint->GetLocalPort ());
+
+  Address fromAddress = InetSocketAddress (header.GetSource (), port);
+  Address toAddress = InetSocketAddress (header.GetDestination (),
+                                         m_endPoint->GetLocalPort ());
+
+  DoForwardUp (packet, fromAddress, toAddress);
 }
 
 void
-TcpSocketBase::ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface)
+TcpSocketBase::ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port,
+                           Ptr<Ipv6Interface> incomingInterface)
 {
-  DoForwardUp (packet, header, port);
+  NS_LOG_LOGIC ("Socket " << this << " forward up " <<
+                m_endPoint6->GetPeerAddress () <<
+                ":" << m_endPoint6->GetPeerPort () <<
+                " to " << m_endPoint6->GetLocalAddress () <<
+                ":" << m_endPoint6->GetLocalPort ());
+
+  Address fromAddress = Inet6SocketAddress (header.GetSourceAddress (), port);
+  Address toAddress = Inet6SocketAddress (header.GetDestinationAddress (),
+                                          m_endPoint6->GetLocalPort ());
+
+  DoForwardUp (packet, fromAddress, toAddress);
 }
 
 void
@@ -926,21 +1001,10 @@
     }
 }
 
-/* The real function to handle the incoming packet from lower layers. This is
-    wrapped by ForwardUp() so that this function can be overloaded by daughter
-    classes. */
 void
-TcpSocketBase::DoForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16_t port,
-                            Ptr<Ipv4Interface> incomingInterface)
+TcpSocketBase::DoForwardUp (Ptr<Packet> packet, const Address &fromAddress,
+                            const Address &toAddress)
 {
-  NS_LOG_LOGIC ("Socket " << this << " forward up " <<
-                m_endPoint->GetPeerAddress () <<
-                ":" << m_endPoint->GetPeerPort () <<
-                " to " << m_endPoint->GetLocalAddress () <<
-                ":" << m_endPoint->GetLocalPort ());
-  Address fromAddress = InetSocketAddress (header.GetSource (), port);
-  Address toAddress = InetSocketAddress (header.GetDestination (), m_endPoint->GetLocalPort ());
-
   // Peel off TCP header and do validity checking
   TcpHeader tcpHeader;
   uint32_t bytesRemoved = packet->RemoveHeader (tcpHeader);
@@ -984,112 +1048,13 @@
     {
       UpdateWindowSize (tcpHeader);
     }
-
-  // TCP state machine code in different process functions
-  // C.f.: tcp_rcv_state_process() in tcp_input.c in Linux kernel
-  switch (m_state)
+  else if (tcpHeader.GetFlags () & TcpHeader::SYN)
     {
-    case ESTABLISHED:
-      ProcessEstablished (packet, tcpHeader);
-      break;
-    case LISTEN:
-      ProcessListen (packet, tcpHeader, fromAddress, toAddress);
-      break;
-    case TIME_WAIT:
-      // Do nothing
-      break;
-    case CLOSED:
-      // Send RST if the incoming packet is not a RST
-      if ((tcpHeader.GetFlags () & ~(TcpHeader::PSH | TcpHeader::URG)) != TcpHeader::RST)
-        { // Since m_endPoint is not configured yet, we cannot use SendRST here
-          TcpHeader h;
-          h.SetFlags (TcpHeader::RST);
-          h.SetSequenceNumber (m_nextTxSequence);
-          h.SetAckNumber (m_rxBuffer->NextRxSequence ());
-          h.SetSourcePort (tcpHeader.GetDestinationPort ());
-          h.SetDestinationPort (tcpHeader.GetSourcePort ());
-          h.SetWindowSize (AdvertisedWindowSize ());
-          AddOptions (h);
-          m_tcp->SendPacket (Create<Packet> (), h, header.GetDestination (), header.GetSource (), m_boundnetdevice);
-        }
-      break;
-    case SYN_SENT:
-      ProcessSynSent (packet, tcpHeader);
-      break;
-    case SYN_RCVD:
-      ProcessSynRcvd (packet, tcpHeader, fromAddress, toAddress);
-      break;
-    case FIN_WAIT_1:
-    case FIN_WAIT_2:
-    case CLOSE_WAIT:
-      ProcessWait (packet, tcpHeader);
-      break;
-    case CLOSING:
-      ProcessClosing (packet, tcpHeader);
-      break;
-    case LAST_ACK:
-      ProcessLastAck (packet, tcpHeader);
-      break;
-    default: // mute compiler
-      break;
-    }
-}
-
-// XXX this is duplicate code with the other DoForwardUp()
-void
-TcpSocketBase::DoForwardUp (Ptr<Packet> packet, Ipv6Header header, uint16_t port)
-{
-  NS_LOG_LOGIC ("Socket " << this << " forward up " <<
-                m_endPoint6->GetPeerAddress () <<
-                ":" << m_endPoint6->GetPeerPort () <<
-                " to " << m_endPoint6->GetLocalAddress () <<
-                ":" << m_endPoint6->GetLocalPort ());
-  Address fromAddress = Inet6SocketAddress (header.GetSourceAddress (), port);
-  Address toAddress = Inet6SocketAddress (header.GetDestinationAddress (), m_endPoint6->GetLocalPort ());
-
-  // Peel off TCP header and do validity checking
-  TcpHeader tcpHeader;
-  uint32_t bytesRemoved = packet->RemoveHeader (tcpHeader);
-  if (bytesRemoved == 0 || bytesRemoved > 60)
-    {
-      NS_LOG_ERROR ("Bytes removed: " << bytesRemoved << " invalid");
-      return; // Discard invalid packet
-    }
-
-  ReadOptions (tcpHeader);
-
-  if (tcpHeader.GetFlags () & TcpHeader::ACK)
-    {
-      EstimateRtt (tcpHeader);
-    }
-
-  // Discard fully out of range packets
-  if (packet->GetSize ()
-      && OutOfRange (tcpHeader.GetSequenceNumber (), tcpHeader.GetSequenceNumber () + packet->GetSize ()))
-    {
-      NS_LOG_LOGIC ("At state " << TcpStateName[m_state] <<
-                    " received packet of seq [" << tcpHeader.GetSequenceNumber () <<
-                    ":" << tcpHeader.GetSequenceNumber () + packet->GetSize () <<
-                    ") out of range [" << m_rxBuffer->NextRxSequence () << ":" <<
-                    m_rxBuffer->MaxRxSequence () << ")");
-      // Acknowledgement should be sent for all unacceptable packets (RFC793, p.69)
-      if (m_state == ESTABLISHED && !(tcpHeader.GetFlags () & TcpHeader::RST))
-        {
-          SendEmptyPacket (TcpHeader::ACK);
-        }
-      return;
-    }
-
-  // Update Rx window size, i.e. the flow control window
-  if (m_rWnd.Get () == 0 && tcpHeader.GetWindowSize () != 0 && m_persistEvent.IsRunning ())
-    { // persist probes end
-      NS_LOG_LOGIC (this << " Leaving zerowindow persist state");
-      m_persistEvent.Cancel ();
-    }
-
-  if (tcpHeader.GetFlags () & TcpHeader::ACK)
-    {
-      UpdateWindowSize (tcpHeader);
+      /* The window field in a segment where the SYN bit is set (i.e., a <SYN>
+       * or <SYN,ACK>) MUST NOT be scaled (from RFC 7323 page 9). But should be
+       * saved anyway..
+       */
+      m_rWnd = tcpHeader.GetWindowSize ();
     }
 
   // TCP state machine code in different process functions
@@ -1117,7 +1082,7 @@
           h.SetDestinationPort (tcpHeader.GetSourcePort ());
           h.SetWindowSize (AdvertisedWindowSize ());
           AddOptions (h);
-          m_tcp->SendPacket (Create<Packet> (), h, header.GetDestinationAddress (), header.GetSourceAddress (), m_boundnetdevice);
+          m_tcp->SendPacket (Create<Packet> (), h, toAddress, fromAddress, m_boundnetdevice);
         }
       break;
     case SYN_SENT:
@@ -1181,7 +1146,7 @@
     { // Received RST or the TCP flags is invalid, in either case, terminate this socket
       if (tcpflags != TcpHeader::RST)
         { // this must be an invalid flag, send reset
-          NS_LOG_LOGIC ("Illegal flag " << tcpflags << " received. Reset packet is sent.");
+          NS_LOG_LOGIC ("Illegal flag " << TcpHeader::FlagsToString (tcpflags) << " received. Reset packet is sent.");
           SendRST ();
         }
       CloseAndNotify ();
@@ -1306,7 +1271,8 @@
     { // Other in-sequence input
       if (tcpflags != TcpHeader::RST)
         { // When (1) rx of FIN+ACK; (2) rx of FIN; (3) rx of bad flags
-          NS_LOG_LOGIC ("Illegal flag " << std::hex << static_cast<uint32_t> (tcpflags) << std::dec << " received. Reset packet is sent.");
+          NS_LOG_LOGIC ("Illegal flag " << TcpHeader::FlagsToString (tcpflags) <<
+                        " received. Reset packet is sent.");
           SendRST ();
         }
       CloseAndNotify ();
@@ -1386,7 +1352,8 @@
     { // Other in-sequence input
       if (tcpflags != TcpHeader::RST)
         { // When (1) rx of SYN+ACK; (2) rx of FIN; (3) rx of bad flags
-          NS_LOG_LOGIC ("Illegal flag " << tcpflags << " received. Reset packet is sent.");
+          NS_LOG_LOGIC ("Illegal flag " << TcpHeader::FlagsToString (tcpflags) <<
+                        " received. Reset packet is sent.");
           if (m_endPoint)
             {
               m_endPoint->SetPeer (InetSocketAddress::ConvertFrom (fromAddress).GetIpv4 (),
@@ -1442,7 +1409,8 @@
     { // This is a RST or bad flags
       if (tcpflags != TcpHeader::RST)
         {
-          NS_LOG_LOGIC ("Illegal flag " << tcpflags << " received. Reset packet is sent.");
+          NS_LOG_LOGIC ("Illegal flag " << TcpHeader::FlagsToString (tcpflags) <<
+                        " received. Reset packet is sent.");
           SendRST ();
         }
       CloseAndNotify ();
@@ -1499,7 +1467,7 @@
         }
       else if (tcpflags != TcpHeader::RST)
         { // Receive of SYN or SYN+ACK or bad flags or pure data
-          NS_LOG_LOGIC ("Illegal flag " << tcpflags << " received. Reset packet is sent.");
+          NS_LOG_LOGIC ("Illegal flag " << TcpHeader::FlagsToString (tcpflags) << " received. Reset packet is sent.");
           SendRST ();
         }
       CloseAndNotify ();
@@ -1536,7 +1504,7 @@
     }
   else
     { // Received a SYN or SYN+ACK or bad flags
-      NS_LOG_LOGIC ("Illegal flag " << tcpflags << " received. Reset packet is sent.");
+      NS_LOG_LOGIC ("Illegal flag " << TcpHeader::FlagsToString (tcpflags) << " received. Reset packet is sent.");
       SendRST ();
       CloseAndNotify ();
     }
@@ -1626,12 +1594,7 @@
   m_endPoint = 0;
   if (m_tcp != 0)
     {
-      std::vector<Ptr<TcpSocketBase> >::iterator it
-        = std::find (m_tcp->m_sockets.begin (), m_tcp->m_sockets.end (), this);
-      if (it != m_tcp->m_sockets.end ())
-        {
-          m_tcp->m_sockets.erase (it);
-        }
+      m_tcp->RemoveSocket(this);
     }
   NS_LOG_LOGIC (this << " Cancelled ReTxTimeout event which was set to expire at " <<
                 (Simulator::Now () + Simulator::GetDelayLeft (m_retxEvent)).GetSeconds ());
@@ -1647,12 +1610,7 @@
   m_endPoint6 = 0;
   if (m_tcp != 0)
     {
-      std::vector<Ptr<TcpSocketBase> >::iterator it
-        = std::find (m_tcp->m_sockets.begin (), m_tcp->m_sockets.end (), this);
-      if (it != m_tcp->m_sockets.end ())
-        {
-          m_tcp->m_sockets.erase (it);
-        }
+      m_tcp->RemoveSocket(this);
     }
   NS_LOG_LOGIC (this << " Cancelled ReTxTimeout event which was set to expire at " <<
                 (Simulator::Now () + Simulator::GetDelayLeft (m_retxEvent)).GetSeconds ());
@@ -1798,12 +1756,7 @@
       m_endPoint->SetDestroyCallback (MakeNullCallback<void> ());
       m_tcp->DeAllocate (m_endPoint);
       m_endPoint = 0;
-      std::vector<Ptr<TcpSocketBase> >::iterator it
-        = std::find (m_tcp->m_sockets.begin (), m_tcp->m_sockets.end (), this);
-      if (it != m_tcp->m_sockets.end ())
-        {
-          m_tcp->m_sockets.erase (it);
-        }
+      m_tcp->RemoveSocket(this);
     }
   else if (m_endPoint6 != 0)
     {
@@ -1811,12 +1764,7 @@
       m_endPoint6->SetDestroyCallback (MakeNullCallback<void> ());
       m_tcp->DeAllocate (m_endPoint6);
       m_endPoint6 = 0;
-      std::vector<Ptr<TcpSocketBase> >::iterator it
-        = std::find (m_tcp->m_sockets.begin (), m_tcp->m_sockets.end (), this);
-      if (it != m_tcp->m_sockets.end ())
-        {
-          m_tcp->m_sockets.erase (it);
-        }
+      m_tcp->RemoveSocket(this);
     }
 }
 
@@ -1905,7 +1853,7 @@
                                       Inet6SocketAddress::ConvertFrom (fromAddress).GetPort ());
       m_endPoint = 0;
     }
-  m_tcp->m_sockets.push_back (this);
+  m_tcp->AddSocket(this);
 
   // Change the cloned socket from LISTEN state to SYN_RCVD
   NS_LOG_INFO ("LISTEN -> SYN_RCVD");
@@ -2034,7 +1982,8 @@
                     (Simulator::Now () + m_rto.Get ()).GetSeconds () );
       m_retxEvent = Simulator::Schedule (m_rto, &TcpSocketBase::ReTxTimeout, this);
     }
-  NS_LOG_LOGIC ("Send packet via TcpL4Protocol with flags 0x" << std::hex << static_cast<uint32_t> (flags) << std::dec);
+  NS_LOG_LOGIC ("Send packet via TcpL4Protocol with flags" <<
+                TcpHeader::FlagsToString (flags));
   if (m_endPoint)
     {
       m_tcp->SendPacket (p, header, m_endPoint->GetLocalAddress (),
@@ -2140,6 +2089,13 @@
 }
 
 uint32_t
+TcpSocketBase::Window (void)
+{
+  NS_LOG_FUNCTION (this);
+  return std::min (m_rWnd.Get (), m_cWnd.Get ());
+}
+
+uint32_t
 TcpSocketBase::AvailableWindow ()
 {
   NS_LOG_FUNCTION_NOARGS ();
@@ -2627,9 +2583,10 @@
         }
     }
 
+  bool timestampAttribute = m_timestampEnabled;
   m_timestampEnabled = false;
 
-  if (header.HasOption (TcpOption::TS))
+  if (header.HasOption (TcpOption::TS) && timestampAttribute)
     {
       m_timestampEnabled = true;
       ProcessOptionTimestamp (header.GetOption (TcpOption::TS));
diff -Naur ns-3.23/src/internet/model/tcp-socket-base.h ns-3.24/src/internet/model/tcp-socket-base.h
--- ns-3.23/src/internet/model/tcp-socket-base.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-socket-base.h	2015-09-15 11:18:44.000000000 -0700
@@ -198,10 +198,10 @@
   virtual uint32_t GetRcvBufSize (void) const;
   virtual void     SetSegSize (uint32_t size);
   virtual uint32_t GetSegSize (void) const;
-  virtual void     SetInitialSSThresh (uint32_t threshold) = 0;
-  virtual uint32_t GetInitialSSThresh (void) const = 0;
-  virtual void     SetInitialCwnd (uint32_t cwnd) = 0;
-  virtual uint32_t GetInitialCwnd (void) const = 0;
+  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 void     SetConnCount (uint32_t count);
@@ -293,23 +293,19 @@
   void ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface);
 
   /**
-   * \brief Called by TcpSocketBase::ForwardUp().
+   * \brief Called by TcpSocketBase::ForwardUp{,6}().
    *
-   * \param packet the incoming packet
-   * \param header the packet's IPv4 header
-   * \param port the remote port
-   * \param incomingInterface the incoming interface
-   */
-  virtual void DoForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16_t port, Ptr<Ipv4Interface> incomingInterface); //Get a pkt from L3
-
-  /**
-   * \brief Called by TcpSocketBase::ForwardUp6().
+   * Get a packet from L3. This is the real function to handle the
+   * incoming packet from lower layers. This is
+   * wrapped by ForwardUp() so that this function can be overloaded by daughter
+   * classes.
    *
    * \param packet the incoming packet
-   * \param header the packet's IPv6 header
-   * \param port the remote port
+   * \param fromAddress the address of the sender of packet
+   * \param toAddress the address of the receiver of packet (hopefully, us)
    */
-  virtual void DoForwardUp (Ptr<Packet> packet, Ipv6Header header, uint16_t port);
+  virtual void DoForwardUp (Ptr<Packet> packet, const Address &fromAddress,
+                            const Address &toAddress);
 
   /**
    * \brief Called by the L3 protocol when it received an ICMP packet to pass on to TCP.
@@ -518,7 +514,7 @@
    * \brief Return the max possible number of unacked bytes
    * \returns the max possible number of unacked bytes
    */
-  virtual uint32_t Window (void) = 0;
+  virtual uint32_t Window (void);
 
   /**
    * \brief Return unfilled portion of window
@@ -697,7 +693,16 @@
    *
    * \param scaleFactor the sender scale factor
    */
-  virtual void ScaleSsThresh (uint8_t scaleFactor) = 0;
+  virtual void ScaleSsThresh (uint8_t scaleFactor);
+
+  /**
+   * \brief Initialize congestion window
+   *
+   * Default cWnd to 1 MSS (RFC2001, sec.1) and must
+   * not be larger than 2 MSS (RFC2581, sec.3.1). Both m_initiaCWnd and
+   * m_segmentSize are set by the attribute system in ns3::TcpSocket.
+   */
+  virtual void InitializeCwnd ();
 
 protected:
   // Counters and events
@@ -754,6 +759,12 @@
   TracedValue<SequenceNumber32> m_highRxMark;     //!< Highest seqno received
   TracedValue<SequenceNumber32> m_highRxAckMark;  //!< Highest ack received
 
+  // Congestion control
+  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 value
+
   // Options
   bool    m_winScalingEnabled;    //!< Window Scale option enabled
   uint8_t m_sndScaleFactor;       //!< Sent Window Scale (i.e., the one of the node)
diff -Naur ns-3.23/src/internet/model/tcp-socket.cc ns-3.24/src/internet/model/tcp-socket.cc
--- ns-3.23/src/internet/model/tcp-socket.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-socket.cc	2015-09-15 11:18:44.000000000 -0700
@@ -33,7 +33,11 @@
 
 NS_OBJECT_ENSURE_REGISTERED (TcpSocket);
 
-const char* const TcpSocket::TcpStateName[LAST_STATE] = { "CLOSED", "LISTEN", "SYN_SENT", "SYN_RCVD", "ESTABLISHED", "CLOSE_WAIT", "LAST_ACK", "FIN_WAIT_1", "FIN_WAIT_2", "CLOSING", "TIME_WAIT" };
+const char* const
+TcpSocket::TcpStateName[TcpSocket::LAST_STATE] = { "CLOSED", "LISTEN", "SYN_SENT",
+                                        "SYN_RCVD", "ESTABLISHED", "CLOSE_WAIT",
+                                        "LAST_ACK", "FIN_WAIT_1", "FIN_WAIT_2",
+                                        "CLOSING", "TIME_WAIT" };
 
 TypeId
 TcpSocket::GetTypeId (void)
diff -Naur ns-3.23/src/internet/model/tcp-socket.h ns-3.24/src/internet/model/tcp-socket.h
--- ns-3.23/src/internet/model/tcp-socket.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-socket.h	2015-09-15 11:18:44.000000000 -0700
@@ -36,37 +36,6 @@
 class Packet;
 
 /**
- * \ingroup tcp
- * \brief Names of the 11 TCP states
- *
- * \todo This should be a member of TcpSocket.
- */
-typedef enum {
-  CLOSED,       // 0
-  LISTEN,       // 1
-  SYN_SENT,     // 2
-  SYN_RCVD,     // 3
-  ESTABLISHED,  // 4
-  CLOSE_WAIT,   // 5
-  LAST_ACK,     // 6
-  FIN_WAIT_1,   // 7
-  FIN_WAIT_2,   // 8
-  CLOSING,      // 9
-  TIME_WAIT,   // 10
-  LAST_STATE
-} TcpStates_t;
-
-/**
- * \ingroup tcp
- * TracedValue Callback signature for TcpStates_t
- *
- * \param [in] oldValue original value of the traced variable
- * \param [in] newValue new value of the traced variable
- */
-typedef void (* TcpStatesTracedValueCallback)(const TcpStates_t oldValue,
-                                              const TcpStates_t newValue);
-
-/**
  * \ingroup socket
  *
  * \brief (abstract) base class of all TcpSockets
@@ -88,9 +57,40 @@
   virtual ~TcpSocket (void);
 
   /**
+   * \ingroup tcp
+   * \brief Names of the 11 TCP states
+   *
+   */
+  typedef enum {
+    CLOSED = 0,   /**< Socket is finished                                     */
+    LISTEN,       /**< Listening for a connection                             */
+    SYN_SENT,     /**< Sent a connection request, waiting for ack             */
+    SYN_RCVD,     /**< Received a connection request, sent ack,
+                    *  waiting for final ack in three-way handshake.          */
+    ESTABLISHED,  /**< Connection established                                 */
+    CLOSE_WAIT,   /**< Remote side has shutdown and is waiting for
+                    *  us to finish writing our data and to shutdown
+                    *  (we have to close() to move on to LAST_ACK)            */
+    LAST_ACK,     /**< Our side has shutdown after remote has
+                    *  shutdown.  There may still be data in our
+                    *  buffer that we have to finish sending                  */
+    FIN_WAIT_1,   /**< Our side has shutdown, waiting to complete
+                    *  transmission of remaining buffered data                */
+    FIN_WAIT_2,   /**< All buffered data sent, waiting for remote to shutdown */
+    CLOSING,      /**< Both sides have shutdown but we still have
+                    *  data we have to finish sending                         */
+    TIME_WAIT,    /**< Timeout to catch resent junk before entering
+                    *  closed, can only be entered from FIN_WAIT2
+                    *  or CLOSING.  Required because the other end
+                    *  may not have gotten our last ACK causing it
+                    *  to retransmit the data packet (which we ignore)        */
+    LAST_STATE    /**< Last state, used only in debug messages                */
+  } TcpStates_t;
+
+  /**
    * \brief Literal names of TCP states for use in log messages
    */
-  static const char* const TcpStateName[LAST_STATE];
+  static const char* const TcpStateName[TcpSocket::LAST_STATE];
 
 private:
   // Indirect the attribute setting and getting through private virtual methods
@@ -239,6 +239,16 @@
 
 };
 
+/**
+ * \ingroup tcp
+ * TracedValue Callback signature for TcpStates_t
+ *
+ * \param [in] oldValue original value of the traced variable
+ * \param [in] newValue new value of the traced variable
+ */
+typedef void (* TcpStatesTracedValueCallback)(const TcpSocket::TcpStates_t oldValue,
+                                              const TcpSocket::TcpStates_t newValue);
+
 } // namespace ns3
 
 #endif /* TCP_SOCKET_H */
diff -Naur ns-3.23/src/internet/model/tcp-tahoe.cc ns-3.24/src/internet/model/tcp-tahoe.cc
--- ns-3.23/src/internet/model/tcp-tahoe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-tahoe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -45,29 +45,17 @@
                     UintegerValue (3),
                     MakeUintegerAccessor (&TcpTahoe::m_retxThresh),
                     MakeUintegerChecker<uint32_t> ())
-    .AddTraceSource ("CongestionWindow",
-                     "The TCP connection's congestion window",
-                     MakeTraceSourceAccessor (&TcpTahoe::m_cWnd),
-                     "ns3::TracedValue::Uint32Callback")
-    .AddTraceSource ("SlowStartThreshold",
-                     "TCP slow start threshold (bytes)",
-                     MakeTraceSourceAccessor (&TcpTahoe::m_ssThresh),
-                     "ns3::TracedValue::Uint32Callback")
   ;
   return tid;
 }
 
-TcpTahoe::TcpTahoe (void) : m_initialCWnd (1), m_retxThresh (3)
+TcpTahoe::TcpTahoe (void) : m_retxThresh (3)
 {
   NS_LOG_FUNCTION (this);
 }
 
 TcpTahoe::TcpTahoe (const TcpTahoe& sock)
   : TcpSocketBase (sock),
-    m_cWnd (sock.m_cWnd),
-    m_ssThresh (sock.m_ssThresh),
-    m_initialCWnd (sock.m_initialCWnd),
-    m_initialSsThresh (sock.m_initialSsThresh),
     m_retxThresh (sock.m_retxThresh)
 {
   NS_LOG_FUNCTION (this);
@@ -78,32 +66,6 @@
 {
 }
 
-/* We initialize m_cWnd from this function, after attributes initialized */
-int
-TcpTahoe::Listen (void)
-{
-  NS_LOG_FUNCTION (this);
-  InitializeCwnd ();
-  return TcpSocketBase::Listen ();
-}
-
-/* We initialize m_cWnd from this function, after attributes initialized */
-int
-TcpTahoe::Connect (const Address & address)
-{
-  NS_LOG_FUNCTION (this << address);
-  InitializeCwnd ();
-  return TcpSocketBase::Connect (address);
-}
-
-/* Limit the size of in-flight data by cwnd and receiver's rxwin */
-uint32_t
-TcpTahoe::Window (void)
-{
-  NS_LOG_FUNCTION (this);
-  return std::min (m_rWnd.Get (), m_cWnd.Get ());
-}
-
 Ptr<TcpSocketBase>
 TcpTahoe::Fork (void)
 {
@@ -170,56 +132,4 @@
   DoRetransmit ();                          // Retransmit the packet
 }
 
-void
-TcpTahoe::SetSegSize (uint32_t size)
-{
-  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpTahoe::SetSegSize() cannot change segment size after connection started.");
-  m_segmentSize = size;
-}
-
-void
-TcpTahoe::SetInitialSSThresh (uint32_t threshold)
-{
-  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpTahoe::SetSSThresh() cannot change initial ssThresh after connection started.");
-  m_initialSsThresh = threshold;
-}
-
-uint32_t
-TcpTahoe::GetInitialSSThresh (void) const
-{
-  return m_initialSsThresh;
-}
-
-void
-TcpTahoe::SetInitialCwnd (uint32_t cwnd)
-{
-  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpTahoe::SetInitialCwnd() cannot change initial cwnd after connection started.");
-  m_initialCWnd = cwnd;
-}
-
-uint32_t
-TcpTahoe::GetInitialCwnd (void) const
-{
-  return m_initialCWnd;
-}
-
-void 
-TcpTahoe::InitializeCwnd (void)
-{
-  /*
-   * Initialize congestion window, default to 1 MSS (RFC2001, sec.1) and must
-   * not be larger than 2 MSS (RFC2581, sec.3.1). Both m_initiaCWnd and
-   * m_segmentSize are set by the attribute system in ns3::TcpSocket.
-   */
-  m_cWnd = m_initialCWnd * m_segmentSize;
-  m_ssThresh = m_initialSsThresh;
-}
-
-void
-TcpTahoe::ScaleSsThresh (uint8_t scaleFactor)
-{
-  m_ssThresh <<= scaleFactor;
-}
-
-
 } // namespace ns3
diff -Naur ns-3.23/src/internet/model/tcp-tahoe.h ns-3.24/src/internet/model/tcp-tahoe.h
--- ns-3.23/src/internet/model/tcp-tahoe.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-tahoe.h	2015-09-15 11:18:44.000000000 -0700
@@ -58,35 +58,13 @@
   TcpTahoe (const TcpTahoe& sock);
   virtual ~TcpTahoe (void);
 
-  // From TcpSocketBase
-  virtual int Connect (const Address &address);
-  virtual int Listen (void);
-
 protected:
-  virtual uint32_t Window (void); // Return the max possible number of unacked bytes
   virtual Ptr<TcpSocketBase> Fork (void); // Call CopyObject<TcpTahoe> to clone me
   virtual void NewAck (SequenceNumber32 const& seq); // Inc cwnd and call NewAck() of parent
   virtual void DupAck (const TcpHeader& t, uint32_t count);  // Treat 3 dupack as timeout
   virtual void Retransmit (void); // Retransmit time out
 
-  // Implementing ns3::TcpSocket -- Attribute get/set
-  virtual void     SetSegSize (uint32_t size);
-  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 ScaleSsThresh (uint8_t scaleFactor);
-private:
-  /**
-   * \brief Set the congestion window when connection starts
-   */
-  void InitializeCwnd (void);
-
 protected:
-  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 value
   uint32_t               m_retxThresh;   //!< Fast Retransmit threshold
 };
 
diff -Naur ns-3.23/src/internet/model/tcp-westwood.cc ns-3.24/src/internet/model/tcp-westwood.cc
--- ns-3.23/src/internet/model/tcp-westwood.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-westwood.cc	2015-09-15 11:18:44.000000000 -0700
@@ -55,13 +55,6 @@
       .SetParent<TcpSocketBase>()
       .SetGroupName ("Internet")
       .AddConstructor<TcpWestwood>()
-      .AddTraceSource("CongestionWindow", "The TCP connection's congestion window",
-                      MakeTraceSourceAccessor(&TcpWestwood::m_cWnd),
-                      "ns3::TracedValue::Uint32Callback")
-      .AddTraceSource ("SlowStartThreshold",
-                       "TCP slow start threshold (bytes)",
-                       MakeTraceSourceAccessor (&TcpWestwood::m_ssThresh),
-                       "ns3::TracedValue::Uint32Callback")
       .AddAttribute("FilterType", "Use this to choose no filter or Tustin's approximation filter",
                     EnumValue(TcpWestwood::TUSTIN), MakeEnumAccessor(&TcpWestwood::m_fType),
                     MakeEnumChecker(TcpWestwood::NONE, "None", TcpWestwood::TUSTIN, "Tustin"))
@@ -71,7 +64,7 @@
                     MakeEnumChecker(TcpWestwood::WESTWOOD, "Westwood",TcpWestwood::WESTWOODPLUS, "WestwoodPlus"))
       .AddTraceSource("EstimatedBW", "The estimated bandwidth",
                     MakeTraceSourceAccessor(&TcpWestwood::m_currentBW),
-                      "ns3::TracedValue::DoubleCallback");
+                      "ns3::TracedValueCallback::Double");
   return tid;
 }
 
@@ -92,10 +85,6 @@
 
 TcpWestwood::TcpWestwood (const TcpWestwood& sock) :
   TcpSocketBase(sock),
-  m_cWnd(sock.m_cWnd),
-  m_ssThresh(sock.m_ssThresh),
-  m_initialCWnd(sock.m_initialCWnd),
-  m_initialSsThresh (sock.m_initialSsThresh),
   m_inFastRec(false),
   m_currentBW(sock.m_currentBW),
   m_lastSampleBW(sock.m_lastSampleBW),
@@ -117,29 +106,6 @@
 {
 }
 
-int
-TcpWestwood::Listen (void)
-{
-  NS_LOG_FUNCTION (this);
-  InitializeCwnd();
-  return TcpSocketBase::Listen();
-}
-
-int
-TcpWestwood::Connect (const Address & address)
-{
-  NS_LOG_FUNCTION (this << address);
-  InitializeCwnd();
-  return TcpSocketBase::Connect(address);
-}
-
-uint32_t
-TcpWestwood::Window (void)
-{
-  NS_LOG_FUNCTION (this);
-  return std::min (m_rWnd.Get (), m_cWnd.Get ());
-}
-
 Ptr<TcpSocketBase>
 TcpWestwood::Fork (void)
 {
@@ -380,60 +346,4 @@
     }
 }
 
-void
-TcpWestwood::SetSegSize (uint32_t size)
-{
-  NS_ABORT_MSG_UNLESS(m_state == CLOSED, "TcpWestwood::SetSegSize() cannot change segment size after connection started.");
-  m_segmentSize = size;
-}
-
-void
-TcpWestwood::SetInitialSSThresh (uint32_t threshold)
-{
-  NS_LOG_FUNCTION (this);
-  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpWestwood::SetSSThresh() cannot change initial ssThresh after connection started.");
-  m_initialSsThresh = threshold;
-}
-
-uint32_t
-TcpWestwood::GetInitialSSThresh (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_initialSsThresh;
-}
-
-void
-TcpWestwood::SetInitialCwnd (uint32_t cwnd)
-{
-  NS_ABORT_MSG_UNLESS(m_state == CLOSED, "TcpWestwood::SetInitialCwnd() cannot change initial cwnd after connection started.");
-  m_initialCWnd = cwnd;
-}
-
-uint32_t
-TcpWestwood::GetInitialCwnd (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_initialCWnd;
-}
-
-void
-TcpWestwood::InitializeCwnd(void)
-{
-  NS_LOG_FUNCTION (this);
-  /*
-   * Initialize congestion window, default to 1 MSS (RFC2001, sec.1) and must
-   * not be larger than 2 MSS (RFC2581, sec.3.1). Both m_initiaCWnd and
-   * m_segmentSize are set by the attribute system in ns3::TcpSocket.
-   */
-  m_cWnd = m_initialCWnd * m_segmentSize;
-  m_ssThresh = m_initialSsThresh;
-}
-
-void
-TcpWestwood::ScaleSsThresh (uint8_t scaleFactor)
-{
-  m_ssThresh <<= scaleFactor;
-}
-
-
 } // namespace ns3
diff -Naur ns-3.23/src/internet/model/tcp-westwood.h ns-3.24/src/internet/model/tcp-westwood.h
--- ns-3.23/src/internet/model/tcp-westwood.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/tcp-westwood.h	2015-09-15 11:18:44.000000000 -0700
@@ -94,12 +94,7 @@
     TUSTIN
   };
 
-  // From TcpSocketBase
-  virtual int Connect (const Address &address);
-  virtual int Listen (void);
-
 protected:
-  virtual uint32_t Window (void); // Return the max possible number of unacked bytes
   virtual Ptr<TcpSocketBase> Fork (void); // Call CopyObject<TcpTahoe> to clone me
   virtual void NewAck (SequenceNumber32 const& seq); // Inc cwnd and call NewAck() of parent
   virtual void DupAck (const TcpHeader& t, uint32_t count);  // Treat 3 dupack as timeout
@@ -120,21 +115,8 @@
    */
   virtual void EstimateRtt (const TcpHeader& header);
 
-  // Implementing ns3::TcpSocket -- Attribute get/set
-  virtual void     SetSegSize (uint32_t size);
-  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 ScaleSsThresh (uint8_t scaleFactor);
-
 private:
   /**
-   * Initialize cwnd at the beginning of a connection
-   */
-  void InitializeCwnd (void);
-
-  /**
    * Calculate the number of acknowledged packets upon the receipt of an ACK packet
    *
    * \param tcpHeader the header of the received ACK packet
@@ -164,10 +146,6 @@
   void Filtering (void);
 
 protected:
-  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 value
   bool                   m_inFastRec;              //!< Currently in fast recovery if TRUE
 
   TracedValue<double>    m_currentBW;              //!< Current value of the estimated BW
diff -Naur ns-3.23/src/internet/model/udp-l4-protocol.cc ns-3.24/src/internet/model/udp-l4-protocol.cc
--- ns-3.23/src/internet/model/udp-l4-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/udp-l4-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -120,7 +120,7 @@
       ipv6->Insert (this);
       this->SetDownTarget6 (MakeCallback (&Ipv6L3Protocol::Send, ipv6));
     }
-  Object::NotifyNewAggregate ();
+  IpL4Protocol::NotifyNewAggregate ();
 }
 
 int 
diff -Naur ns-3.23/src/internet/model/udp-socket-impl.cc ns-3.24/src/internet/model/udp-socket-impl.cc
--- ns-3.23/src/internet/model/udp-socket-impl.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/model/udp-socket-impl.cc	2015-09-15 11:18:44.000000000 -0700
@@ -329,6 +329,14 @@
 {
   NS_LOG_FUNCTION_NOARGS ();
   m_shutdownRecv = true;
+  if (m_endPoint)
+    {
+      m_endPoint->SetRxEnabled (false);
+    }
+  if (m_endPoint6)
+    {
+      m_endPoint6->SetRxEnabled (false);
+    }
   return 0;
 }
 
diff -Naur ns-3.23/src/internet/test/ipv6-dual-stack-test-suite.cc ns-3.24/src/internet/test/ipv6-dual-stack-test-suite.cc
--- ns-3.23/src/internet/test/ipv6-dual-stack-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/test/ipv6-dual-stack-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -37,7 +37,6 @@
 #include "ns3/uinteger.h"
 #include "ns3/log.h"
 
-#include "ns3/ipv4-end-point.h"
 #include "ns3/arp-l3-protocol.h"
 #include "ns3/ipv4-l3-protocol.h"
 #include "ns3/ipv6-l3-protocol.h"
diff -Naur ns-3.23/src/internet/test/tcp-test.cc ns-3.24/src/internet/test/tcp-test.cc
--- ns-3.23/src/internet/test/tcp-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/test/tcp-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -38,7 +38,6 @@
 #include "ns3/uinteger.h"
 #include "ns3/log.h"
 
-#include "ns3/ipv4-end-point.h"
 #include "ns3/arp-l3-protocol.h"
 #include "ns3/ipv4-l3-protocol.h"
 #include "ns3/ipv6-l3-protocol.h"
diff -Naur ns-3.23/src/internet/test/tcp-timestamp-test.cc ns-3.24/src/internet/test/tcp-timestamp-test.cc
--- ns-3.23/src/internet/test/tcp-timestamp-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/test/tcp-timestamp-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -36,7 +36,6 @@
 #include "ns3/log.h"
 #include "ns3/tcp-socket-base.h"
 
-#include "ns3/ipv4-end-point.h"
 #include "ns3/arp-l3-protocol.h"
 #include "ns3/ipv4-l3-protocol.h"
 #include "ns3/ipv6-l3-protocol.h"
diff -Naur ns-3.23/src/internet/test/tcp-wscaling-test.cc ns-3.24/src/internet/test/tcp-wscaling-test.cc
--- ns-3.23/src/internet/test/tcp-wscaling-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/test/tcp-wscaling-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -39,7 +39,6 @@
 #include "ns3/uinteger.h"
 #include "ns3/log.h"
 
-#include "ns3/ipv4-end-point.h"
 #include "ns3/arp-l3-protocol.h"
 #include "ns3/ipv4-l3-protocol.h"
 #include "ns3/ipv6-l3-protocol.h"
diff -Naur ns-3.23/src/internet/wscript ns-3.24/src/internet/wscript
--- ns-3.23/src/internet/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/internet/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -65,7 +65,7 @@
         conf.msg("Checking for NSC location", False)
         conf.report_optional_feature("nsc", "Network Simulation Cradle", False,
                                      "NSC not found (see option --with-nsc)")
-	return
+        return
     
     if Options.platform in ['linux', 'freebsd']:
         arch = os.uname()[4]
@@ -263,7 +263,6 @@
         'model/ipv4-interface.h',
         'model/ipv4-l3-protocol.h',
         'model/ipv6-l3-protocol.h',
-        'model/ipv4-end-point.h',
         'model/ipv6-extension.h',
         'model/ipv6-extension-demux.h',
         'model/ipv6-extension-header.h',
diff -Naur ns-3.23/src/lr-wpan/bindings/modulegen__gcc_ILP32.py ns-3.24/src/lr-wpan/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/lr-wpan/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lr-wpan/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -20,20 +20,20 @@
 def register_types(module):
     root_module = module.get_root()
     
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanPhyEnumeration [enumeration]
+    module.add_enum('LrWpanPhyEnumeration', ['IEEE_802_15_4_PHY_BUSY', 'IEEE_802_15_4_PHY_BUSY_RX', 'IEEE_802_15_4_PHY_BUSY_TX', 'IEEE_802_15_4_PHY_FORCE_TRX_OFF', 'IEEE_802_15_4_PHY_IDLE', 'IEEE_802_15_4_PHY_INVALID_PARAMETER', 'IEEE_802_15_4_PHY_RX_ON', 'IEEE_802_15_4_PHY_SUCCESS', 'IEEE_802_15_4_PHY_TRX_OFF', 'IEEE_802_15_4_PHY_TX_ON', 'IEEE_802_15_4_PHY_UNSUPPORTED_ATTRIBUTE', 'IEEE_802_15_4_PHY_READ_ONLY', 'IEEE_802_15_4_PHY_UNSPECIFIED'])
     ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanTxOption [enumeration]
     module.add_enum('LrWpanTxOption', ['TX_OPTION_NONE', 'TX_OPTION_ACK', 'TX_OPTION_GTS', 'TX_OPTION_INDIRECT'])
     ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanMcpsDataConfirmStatus [enumeration]
     module.add_enum('LrWpanMcpsDataConfirmStatus', ['IEEE_802_15_4_SUCCESS', 'IEEE_802_15_4_TRANSACTION_OVERFLOW', 'IEEE_802_15_4_TRANSACTION_EXPIRED', 'IEEE_802_15_4_CHANNEL_ACCESS_FAILURE', 'IEEE_802_15_4_INVALID_ADDRESS', 'IEEE_802_15_4_INVALID_GTS', 'IEEE_802_15_4_NO_ACK', 'IEEE_802_15_4_COUNTER_ERROR', 'IEEE_802_15_4_FRAME_TOO_LONG', 'IEEE_802_15_4_UNAVAILABLE_KEY', 'IEEE_802_15_4_UNSUPPORTED_SECURITY', 'IEEE_802_15_4_INVALID_PARAMETER'])
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanPhyOption [enumeration]
-    module.add_enum('LrWpanPhyOption', ['IEEE_802_15_4_868MHZ_BPSK', 'IEEE_802_15_4_915MHZ_BPSK', 'IEEE_802_15_4_868MHZ_ASK', 'IEEE_802_15_4_915MHZ_ASK', 'IEEE_802_15_4_868MHZ_OQPSK', 'IEEE_802_15_4_915MHZ_OQPSK', 'IEEE_802_15_4_2_4GHZ_OQPSK', 'IEEE_802_15_4_INVALID_PHY_OPTION'])
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanPhyEnumeration [enumeration]
-    module.add_enum('LrWpanPhyEnumeration', ['IEEE_802_15_4_PHY_BUSY', 'IEEE_802_15_4_PHY_BUSY_RX', 'IEEE_802_15_4_PHY_BUSY_TX', 'IEEE_802_15_4_PHY_FORCE_TRX_OFF', 'IEEE_802_15_4_PHY_IDLE', 'IEEE_802_15_4_PHY_INVALID_PARAMETER', 'IEEE_802_15_4_PHY_RX_ON', 'IEEE_802_15_4_PHY_SUCCESS', 'IEEE_802_15_4_PHY_TRX_OFF', 'IEEE_802_15_4_PHY_TX_ON', 'IEEE_802_15_4_PHY_UNSUPPORTED_ATTRIBUTE', 'IEEE_802_15_4_PHY_READ_ONLY', 'IEEE_802_15_4_PHY_UNSPECIFIED'])
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanPibAttributeIdentifier [enumeration]
     module.add_enum('LrWpanPibAttributeIdentifier', ['phyCurrentChannel', 'phyChannelsSupported', 'phyTransmitPower', 'phyCCAMode', 'phyCurrentPage', 'phyMaxFrameDuration', 'phySHRDuration', 'phySymbolsPerOctet'])
-    ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanAssociationStatus [enumeration]
-    module.add_enum('LrWpanAssociationStatus', ['ASSOCIATED', 'PAN_AT_CAPACITY', 'PAN_ACCESS_DENIED', 'ASSOCIATED_WITHOUT_ADDRESS', 'DISASSOCIATED'])
     ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanMacState [enumeration]
     module.add_enum('LrWpanMacState', ['MAC_IDLE', 'MAC_CSMA', 'MAC_SENDING', 'MAC_ACK_PENDING', 'CHANNEL_ACCESS_FAILURE', 'CHANNEL_IDLE', 'SET_PHY_TX_ON'])
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanPhyOption [enumeration]
+    module.add_enum('LrWpanPhyOption', ['IEEE_802_15_4_868MHZ_BPSK', 'IEEE_802_15_4_915MHZ_BPSK', 'IEEE_802_15_4_868MHZ_ASK', 'IEEE_802_15_4_915MHZ_ASK', 'IEEE_802_15_4_868MHZ_OQPSK', 'IEEE_802_15_4_915MHZ_OQPSK', 'IEEE_802_15_4_2_4GHZ_OQPSK', 'IEEE_802_15_4_INVALID_PHY_OPTION'])
+    ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanAssociationStatus [enumeration]
+    module.add_enum('LrWpanAssociationStatus', ['ASSOCIATED', 'PAN_AT_CAPACITY', 'PAN_ACCESS_DENIED', 'ASSOCIATED_WITHOUT_ADDRESS', 'DISASSOCIATED'])
     ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanAddressMode [enumeration]
     module.add_enum('LrWpanAddressMode', ['NO_PANID_ADDR', 'ADDR_MODE_RESERVED', 'SHORT_ADDR', 'EXT_ADDR'])
     ## address.h (module 'network'): ns3::Address [class]
@@ -94,6 +94,10 @@
     module.add_class('Mac16Address', import_from_module='ns.network')
     ## mac16-address.h (module 'network'): ns3::Mac16Address [class]
     root_module['ns3::Mac16Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## mac64-address.h (module 'network'): ns3::Mac64Address [class]
     module.add_class('Mac64Address', import_from_module='ns.network')
     ## mac64-address.h (module 'network'): ns3::Mac64Address [class]
@@ -137,7 +141,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned char, signed char> [class]
@@ -152,6 +156,10 @@
     module.add_class('TagBuffer', import_from_module='ns.network')
     ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
     module.add_class('TimeWithUnit', import_from_module='ns.core')
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanMacState> [class]
+    module.add_class('TracedValue', template_parameters=['ns3::LrWpanMacState'])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanPhyEnumeration> [class]
+    module.add_class('TracedValue', template_parameters=['ns3::LrWpanPhyEnumeration'])
     ## 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]
@@ -232,16 +240,28 @@
     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> >'])
+    ## 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]
+    module.add_class('BooleanValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## callback.h (module 'core'): ns3::CallbackChecker [class]
     module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## callback.h (module 'core'): ns3::CallbackImplBase [class]
     module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
     ## callback.h (module 'core'): ns3::CallbackValue [class]
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## double.h (module 'core'): ns3::DoubleValue [class]
+    module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
     module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## enum.h (module 'core'): ns3::EnumChecker [class]
+    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'])
     ## 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> >'])
+    ## integer.h (module 'core'): ns3::IntegerValue [class]
+    module.add_class('IntegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
     module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
@@ -276,6 +296,10 @@
     module.add_class('Mac16AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac16-address.h (module 'network'): ns3::Mac16AddressValue [class]
     module.add_class('Mac16AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## mac64-address.h (module 'network'): ns3::Mac64AddressChecker [class]
     module.add_class('Mac64AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac64-address.h (module 'network'): ns3::Mac64AddressValue [class]
@@ -302,6 +326,8 @@
     module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdValue [class]
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## uinteger.h (module 'core'): ns3::UintegerValue [class]
+    module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## address.h (module 'network'): ns3::AddressChecker [class]
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
@@ -335,9 +361,6 @@
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataIndicationParams, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', u'ns3::McpsDataIndicationCallback')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataIndicationParams, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', u'ns3::McpsDataIndicationCallback*')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataIndicationParams, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', u'ns3::McpsDataIndicationCallback&')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::SequenceNumber32TracedValueCallback')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::SequenceNumber32TracedValueCallback*')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::SequenceNumber32TracedValueCallback&')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', u'ns3::McpsDataConfirmCallback')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', u'ns3::McpsDataConfirmCallback*')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', u'ns3::McpsDataConfirmCallback&')
@@ -362,6 +385,18 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
+    ## Register a nested module for the namespace internal
+    
+    nested_module = module.add_cpp_namespace('internal')
+    register_types_ns3_internal(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -397,6 +432,50 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration ) *', u'ns3::TracedValueCallback::LrWpanPhyEnumeration')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration ) **', u'ns3::TracedValueCallback::LrWpanPhyEnumeration*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration ) *&', u'ns3::TracedValueCallback::LrWpanPhyEnumeration&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState ) *', u'ns3::TracedValueCallback::LrWpanMacState')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState ) **', u'ns3::TracedValueCallback::LrWpanMacState*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState ) *&', u'ns3::TracedValueCallback::LrWpanMacState&')
+
+def register_types_ns3_internal(module):
+    root_module = module.get_root()
+    
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -423,6 +502,7 @@
     register_Ns3LrWpanPhyPpduHeaderSymbolNumber_methods(root_module, root_module['ns3::LrWpanPhyPpduHeaderSymbolNumber'])
     register_Ns3LrWpanSpectrumValueHelper_methods(root_module, root_module['ns3::LrWpanSpectrumValueHelper'])
     register_Ns3Mac16Address_methods(root_module, root_module['ns3::Mac16Address'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac64Address_methods(root_module, root_module['ns3::Mac64Address'])
     register_Ns3McpsDataConfirmParams_methods(root_module, root_module['ns3::McpsDataConfirmParams'])
     register_Ns3McpsDataIndicationParams_methods(root_module, root_module['ns3::McpsDataIndicationParams'])
@@ -448,6 +528,8 @@
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
+    register_Ns3TracedValue__Ns3LrWpanMacState_methods(root_module, root_module['ns3::TracedValue< ns3::LrWpanMacState >'])
+    register_Ns3TracedValue__Ns3LrWpanPhyEnumeration_methods(root_module, root_module['ns3::TracedValue< ns3::LrWpanPhyEnumeration >'])
     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'])
@@ -481,11 +563,17 @@
     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_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_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
     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_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3IntegerValue_methods(root_module, root_module['ns3::IntegerValue'])
     register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
     register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
     register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
@@ -503,6 +591,8 @@
     register_Ns3LrWpanSpectrumSignalParameters_methods(root_module, root_module['ns3::LrWpanSpectrumSignalParameters'])
     register_Ns3Mac16AddressChecker_methods(root_module, root_module['ns3::Mac16AddressChecker'])
     register_Ns3Mac16AddressValue_methods(root_module, root_module['ns3::Mac16AddressValue'])
+    register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     register_Ns3Mac64AddressChecker_methods(root_module, root_module['ns3::Mac64AddressChecker'])
     register_Ns3Mac64AddressValue_methods(root_module, root_module['ns3::Mac64AddressValue'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
@@ -515,6 +605,7 @@
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     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'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3LrWpanNetDevice_methods(root_module, root_module['ns3::LrWpanNetDevice'])
@@ -762,17 +853,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -794,11 +885,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -808,16 +894,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1055,14 +1131,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1123,11 +1203,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -1633,10 +1708,10 @@
     return
 
 def register_Ns3LrWpanEdPower_methods(root_module, cls):
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanEdPower::LrWpanEdPower() [constructor]
-    cls.add_constructor([])
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanEdPower::LrWpanEdPower(ns3::LrWpanEdPower const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::LrWpanEdPower const &', 'arg0')])
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanEdPower::LrWpanEdPower() [constructor]
+    cls.add_constructor([])
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanEdPower::averagePower [variable]
     cls.add_instance_attribute('averagePower', 'double', is_const=False)
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanEdPower::lastUpdate [variable]
@@ -1749,6 +1824,78 @@
                    is_static=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3Mac64Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('!=')
@@ -2241,7 +2388,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2259,10 +2406,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2326,10 +2473,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -2501,10 +2648,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -2611,6 +2758,74 @@
     cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
     return
 
+def register_Ns3TracedValue__Ns3LrWpanMacState_methods(root_module, cls):
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanMacState>::TracedValue() [constructor]
+    cls.add_constructor([])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanMacState>::TracedValue(ns3::TracedValue<ns3::LrWpanMacState> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TracedValue< ns3::LrWpanMacState > const &', 'o')])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanMacState>::TracedValue(ns3::LrWpanMacState const & v) [constructor]
+    cls.add_constructor([param('ns3::LrWpanMacState const &', 'v')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::LrWpanMacState>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::LrWpanMacState>::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::LrWpanMacState>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::LrWpanMacState>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb')])
+    ## traced-value.h (module 'core'): ns3::LrWpanMacState ns3::TracedValue<ns3::LrWpanMacState>::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::LrWpanMacState', 
+                   [], 
+                   is_const=True)
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::LrWpanMacState>::Set(ns3::LrWpanMacState const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::LrWpanMacState const &', 'v')])
+    return
+
+def register_Ns3TracedValue__Ns3LrWpanPhyEnumeration_methods(root_module, cls):
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanPhyEnumeration>::TracedValue() [constructor]
+    cls.add_constructor([])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanPhyEnumeration>::TracedValue(ns3::TracedValue<ns3::LrWpanPhyEnumeration> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TracedValue< ns3::LrWpanPhyEnumeration > const &', 'o')])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanPhyEnumeration>::TracedValue(ns3::LrWpanPhyEnumeration const & v) [constructor]
+    cls.add_constructor([param('ns3::LrWpanPhyEnumeration const &', 'v')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::LrWpanPhyEnumeration>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::LrWpanPhyEnumeration>::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::LrWpanPhyEnumeration>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::LrWpanPhyEnumeration>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb')])
+    ## traced-value.h (module 'core'): ns3::LrWpanPhyEnumeration ns3::TracedValue<ns3::LrWpanPhyEnumeration>::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::LrWpanPhyEnumeration', 
+                   [], 
+                   is_const=True)
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::LrWpanPhyEnumeration>::Set(ns3::LrWpanPhyEnumeration const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::LrWpanPhyEnumeration const &', 'v')])
+    return
+
 def register_Ns3TypeId_methods(root_module, cls):
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('!=')
@@ -3448,10 +3663,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -3643,11 +3858,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> m) [member function]
     cls.add_method('SetMobility', 
                    'void', 
@@ -4049,6 +4264,47 @@
                    is_pure_virtual=True, is_const=True, is_virtual=True)
     return
 
+def register_Ns3BooleanChecker_methods(root_module, cls):
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker(ns3::BooleanChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanChecker const &', 'arg0')])
+    return
+
+def register_Ns3BooleanValue_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(ns3::BooleanValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanValue const &', 'arg0')])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(bool value) [constructor]
+    cls.add_constructor([param('bool', 'value')])
+    ## boolean.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::BooleanValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('bool', 'value')])
+    return
+
 def register_Ns3CallbackChecker_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
     cls.add_constructor([])
@@ -4061,11 +4317,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4096,6 +4362,39 @@
                    [param('ns3::CallbackBase', 'base')])
     return
 
+def register_Ns3DoubleValue_methods(root_module, cls):
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
+    cls.add_constructor([])
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(ns3::DoubleValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DoubleValue const &', 'arg0')])
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(double const & value) [constructor]
+    cls.add_constructor([param('double const &', 'value')])
+    ## double.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::DoubleValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## double.h (module 'core'): bool ns3::DoubleValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## double.h (module 'core'): double ns3::DoubleValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## double.h (module 'core'): std::string ns3::DoubleValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## double.h (module 'core'): void ns3::DoubleValue::Set(double const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('double const &', 'value')])
+    return
+
 def register_Ns3EmptyAttributeValue_methods(root_module, cls):
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
@@ -4118,6 +4417,84 @@
                    is_const=True, visibility='private', is_virtual=True)
     return
 
+def register_Ns3EnumChecker_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker(ns3::EnumChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumChecker const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): void ns3::EnumChecker::Add(int value, std::string name) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): void ns3::EnumChecker::AddDefault(int value, std::string name) [member function]
+    cls.add_method('AddDefault', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Copy(ns3::AttributeValue const & src, ns3::AttributeValue & dst) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'src'), param('ns3::AttributeValue &', 'dst')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3EnumValue_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(ns3::EnumValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumValue const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(int value) [constructor]
+    cls.add_constructor([param('int', 'value')])
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## enum.h (module 'core'): int ns3::EnumValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int', 
+                   [], 
+                   is_const=True)
+    ## enum.h (module 'core'): std::string ns3::EnumValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): void ns3::EnumValue::Set(int value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int', 'value')])
+    return
+
 def register_Ns3EventImpl_methods(root_module, cls):
     ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
@@ -4142,6 +4519,39 @@
                    is_pure_virtual=True, visibility='protected', is_virtual=True)
     return
 
+def register_Ns3IntegerValue_methods(root_module, cls):
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue() [constructor]
+    cls.add_constructor([])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(ns3::IntegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::IntegerValue const &', 'arg0')])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(int64_t const & value) [constructor]
+    cls.add_constructor([param('int64_t const &', 'value')])
+    ## integer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::IntegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): bool ns3::IntegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## integer.h (module 'core'): int64_t ns3::IntegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## integer.h (module 'core'): std::string ns3::IntegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): void ns3::IntegerValue::Set(int64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int64_t const &', 'value')])
+    return
+
 def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
     cls.add_constructor([])
@@ -4723,11 +5133,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::NetDevice> ns3::LrWpanPhy::GetDevice() [member function]
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::NetDevice> ns3::LrWpanPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lr-wpan-phy.h (module 'lr-wpan'): void ns3::LrWpanPhy::SetAntenna(ns3::Ptr<ns3::AntennaModel> a) [member function]
     cls.add_method('SetAntenna', 
                    'void', 
@@ -4899,6 +5309,46 @@
                    [param('ns3::Mac16Address const &', 'value')])
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3Mac64AddressChecker_methods(root_module, cls):
     ## mac64-address.h (module 'network'): ns3::Mac64AddressChecker::Mac64AddressChecker() [constructor]
     cls.add_constructor([])
@@ -5509,6 +5959,39 @@
                    [param('ns3::TypeId const &', 'value')])
     return
 
+def register_Ns3UintegerValue_methods(root_module, cls):
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue() [constructor]
+    cls.add_constructor([])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(ns3::UintegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::UintegerValue const &', 'arg0')])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(uint64_t const & value) [constructor]
+    cls.add_constructor([param('uint64_t const &', 'value')])
+    ## uinteger.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::UintegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): bool ns3::UintegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## uinteger.h (module 'core'): uint64_t ns3::UintegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## uinteger.h (module 'core'): std::string ns3::UintegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): void ns3::UintegerValue::Set(uint64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint64_t const &', 'value')])
+    return
+
 def register_Ns3AddressChecker_methods(root_module, cls):
     ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
     cls.add_constructor([])
@@ -5839,6 +6322,8 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
+    register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5851,6 +6336,12 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
+def register_functions_ns3_internal(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/lr-wpan/bindings/modulegen__gcc_LP64.py ns-3.24/src/lr-wpan/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/lr-wpan/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lr-wpan/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -20,20 +20,20 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanPhyEnumeration [enumeration]
-    module.add_enum('LrWpanPhyEnumeration', ['IEEE_802_15_4_PHY_BUSY', 'IEEE_802_15_4_PHY_BUSY_RX', 'IEEE_802_15_4_PHY_BUSY_TX', 'IEEE_802_15_4_PHY_FORCE_TRX_OFF', 'IEEE_802_15_4_PHY_IDLE', 'IEEE_802_15_4_PHY_INVALID_PARAMETER', 'IEEE_802_15_4_PHY_RX_ON', 'IEEE_802_15_4_PHY_SUCCESS', 'IEEE_802_15_4_PHY_TRX_OFF', 'IEEE_802_15_4_PHY_TX_ON', 'IEEE_802_15_4_PHY_UNSUPPORTED_ATTRIBUTE', 'IEEE_802_15_4_PHY_READ_ONLY', 'IEEE_802_15_4_PHY_UNSPECIFIED'])
     ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanTxOption [enumeration]
     module.add_enum('LrWpanTxOption', ['TX_OPTION_NONE', 'TX_OPTION_ACK', 'TX_OPTION_GTS', 'TX_OPTION_INDIRECT'])
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanPhyOption [enumeration]
+    module.add_enum('LrWpanPhyOption', ['IEEE_802_15_4_868MHZ_BPSK', 'IEEE_802_15_4_915MHZ_BPSK', 'IEEE_802_15_4_868MHZ_ASK', 'IEEE_802_15_4_915MHZ_ASK', 'IEEE_802_15_4_868MHZ_OQPSK', 'IEEE_802_15_4_915MHZ_OQPSK', 'IEEE_802_15_4_2_4GHZ_OQPSK', 'IEEE_802_15_4_INVALID_PHY_OPTION'])
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanPhyEnumeration [enumeration]
+    module.add_enum('LrWpanPhyEnumeration', ['IEEE_802_15_4_PHY_BUSY', 'IEEE_802_15_4_PHY_BUSY_RX', 'IEEE_802_15_4_PHY_BUSY_TX', 'IEEE_802_15_4_PHY_FORCE_TRX_OFF', 'IEEE_802_15_4_PHY_IDLE', 'IEEE_802_15_4_PHY_INVALID_PARAMETER', 'IEEE_802_15_4_PHY_RX_ON', 'IEEE_802_15_4_PHY_SUCCESS', 'IEEE_802_15_4_PHY_TRX_OFF', 'IEEE_802_15_4_PHY_TX_ON', 'IEEE_802_15_4_PHY_UNSUPPORTED_ATTRIBUTE', 'IEEE_802_15_4_PHY_READ_ONLY', 'IEEE_802_15_4_PHY_UNSPECIFIED'])
     ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanMcpsDataConfirmStatus [enumeration]
     module.add_enum('LrWpanMcpsDataConfirmStatus', ['IEEE_802_15_4_SUCCESS', 'IEEE_802_15_4_TRANSACTION_OVERFLOW', 'IEEE_802_15_4_TRANSACTION_EXPIRED', 'IEEE_802_15_4_CHANNEL_ACCESS_FAILURE', 'IEEE_802_15_4_INVALID_ADDRESS', 'IEEE_802_15_4_INVALID_GTS', 'IEEE_802_15_4_NO_ACK', 'IEEE_802_15_4_COUNTER_ERROR', 'IEEE_802_15_4_FRAME_TOO_LONG', 'IEEE_802_15_4_UNAVAILABLE_KEY', 'IEEE_802_15_4_UNSUPPORTED_SECURITY', 'IEEE_802_15_4_INVALID_PARAMETER'])
+    ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanAssociationStatus [enumeration]
+    module.add_enum('LrWpanAssociationStatus', ['ASSOCIATED', 'PAN_AT_CAPACITY', 'PAN_ACCESS_DENIED', 'ASSOCIATED_WITHOUT_ADDRESS', 'DISASSOCIATED'])
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanPibAttributeIdentifier [enumeration]
     module.add_enum('LrWpanPibAttributeIdentifier', ['phyCurrentChannel', 'phyChannelsSupported', 'phyTransmitPower', 'phyCCAMode', 'phyCurrentPage', 'phyMaxFrameDuration', 'phySHRDuration', 'phySymbolsPerOctet'])
     ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanMacState [enumeration]
     module.add_enum('LrWpanMacState', ['MAC_IDLE', 'MAC_CSMA', 'MAC_SENDING', 'MAC_ACK_PENDING', 'CHANNEL_ACCESS_FAILURE', 'CHANNEL_IDLE', 'SET_PHY_TX_ON'])
-    ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanAssociationStatus [enumeration]
-    module.add_enum('LrWpanAssociationStatus', ['ASSOCIATED', 'PAN_AT_CAPACITY', 'PAN_ACCESS_DENIED', 'ASSOCIATED_WITHOUT_ADDRESS', 'DISASSOCIATED'])
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanPhyOption [enumeration]
-    module.add_enum('LrWpanPhyOption', ['IEEE_802_15_4_868MHZ_BPSK', 'IEEE_802_15_4_915MHZ_BPSK', 'IEEE_802_15_4_868MHZ_ASK', 'IEEE_802_15_4_915MHZ_ASK', 'IEEE_802_15_4_868MHZ_OQPSK', 'IEEE_802_15_4_915MHZ_OQPSK', 'IEEE_802_15_4_2_4GHZ_OQPSK', 'IEEE_802_15_4_INVALID_PHY_OPTION'])
     ## lr-wpan-mac.h (module 'lr-wpan'): ns3::LrWpanAddressMode [enumeration]
     module.add_enum('LrWpanAddressMode', ['NO_PANID_ADDR', 'ADDR_MODE_RESERVED', 'SHORT_ADDR', 'EXT_ADDR'])
     ## address.h (module 'network'): ns3::Address [class]
@@ -94,6 +94,10 @@
     module.add_class('Mac16Address', import_from_module='ns.network')
     ## mac16-address.h (module 'network'): ns3::Mac16Address [class]
     root_module['ns3::Mac16Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## mac64-address.h (module 'network'): ns3::Mac64Address [class]
     module.add_class('Mac64Address', import_from_module='ns.network')
     ## mac64-address.h (module 'network'): ns3::Mac64Address [class]
@@ -137,7 +141,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned char, signed char> [class]
@@ -152,6 +156,10 @@
     module.add_class('TagBuffer', import_from_module='ns.network')
     ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
     module.add_class('TimeWithUnit', import_from_module='ns.core')
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanMacState> [class]
+    module.add_class('TracedValue', template_parameters=['ns3::LrWpanMacState'])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanPhyEnumeration> [class]
+    module.add_class('TracedValue', template_parameters=['ns3::LrWpanPhyEnumeration'])
     ## 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]
@@ -232,16 +240,28 @@
     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> >'])
+    ## 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]
+    module.add_class('BooleanValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## callback.h (module 'core'): ns3::CallbackChecker [class]
     module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## callback.h (module 'core'): ns3::CallbackImplBase [class]
     module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
     ## callback.h (module 'core'): ns3::CallbackValue [class]
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## double.h (module 'core'): ns3::DoubleValue [class]
+    module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
     module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## enum.h (module 'core'): ns3::EnumChecker [class]
+    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'])
     ## 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> >'])
+    ## integer.h (module 'core'): ns3::IntegerValue [class]
+    module.add_class('IntegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
     module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
@@ -276,6 +296,10 @@
     module.add_class('Mac16AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac16-address.h (module 'network'): ns3::Mac16AddressValue [class]
     module.add_class('Mac16AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## mac64-address.h (module 'network'): ns3::Mac64AddressChecker [class]
     module.add_class('Mac64AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac64-address.h (module 'network'): ns3::Mac64AddressValue [class]
@@ -302,6 +326,8 @@
     module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdValue [class]
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## uinteger.h (module 'core'): ns3::UintegerValue [class]
+    module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## address.h (module 'network'): ns3::AddressChecker [class]
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
@@ -335,9 +361,6 @@
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataIndicationParams, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', u'ns3::McpsDataIndicationCallback')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataIndicationParams, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', u'ns3::McpsDataIndicationCallback*')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataIndicationParams, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', u'ns3::McpsDataIndicationCallback&')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::SequenceNumber32TracedValueCallback')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::SequenceNumber32TracedValueCallback*')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::SequenceNumber32TracedValueCallback&')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', u'ns3::McpsDataConfirmCallback')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', u'ns3::McpsDataConfirmCallback*')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::McpsDataConfirmParams, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', u'ns3::McpsDataConfirmCallback&')
@@ -362,6 +385,18 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
+    ## Register a nested module for the namespace internal
+    
+    nested_module = module.add_cpp_namespace('internal')
+    register_types_ns3_internal(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -397,6 +432,50 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration ) *', u'ns3::TracedValueCallback::LrWpanPhyEnumeration')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration ) **', u'ns3::TracedValueCallback::LrWpanPhyEnumeration*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration ) *&', u'ns3::TracedValueCallback::LrWpanPhyEnumeration&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState ) *', u'ns3::TracedValueCallback::LrWpanMacState')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState ) **', u'ns3::TracedValueCallback::LrWpanMacState*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::LrWpanMacState, ns3::LrWpanMacState ) *&', u'ns3::TracedValueCallback::LrWpanMacState&')
+
+def register_types_ns3_internal(module):
+    root_module = module.get_root()
+    
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -423,6 +502,7 @@
     register_Ns3LrWpanPhyPpduHeaderSymbolNumber_methods(root_module, root_module['ns3::LrWpanPhyPpduHeaderSymbolNumber'])
     register_Ns3LrWpanSpectrumValueHelper_methods(root_module, root_module['ns3::LrWpanSpectrumValueHelper'])
     register_Ns3Mac16Address_methods(root_module, root_module['ns3::Mac16Address'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac64Address_methods(root_module, root_module['ns3::Mac64Address'])
     register_Ns3McpsDataConfirmParams_methods(root_module, root_module['ns3::McpsDataConfirmParams'])
     register_Ns3McpsDataIndicationParams_methods(root_module, root_module['ns3::McpsDataIndicationParams'])
@@ -448,6 +528,8 @@
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
+    register_Ns3TracedValue__Ns3LrWpanMacState_methods(root_module, root_module['ns3::TracedValue< ns3::LrWpanMacState >'])
+    register_Ns3TracedValue__Ns3LrWpanPhyEnumeration_methods(root_module, root_module['ns3::TracedValue< ns3::LrWpanPhyEnumeration >'])
     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'])
@@ -481,11 +563,17 @@
     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_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_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
     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_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3IntegerValue_methods(root_module, root_module['ns3::IntegerValue'])
     register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
     register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
     register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
@@ -503,6 +591,8 @@
     register_Ns3LrWpanSpectrumSignalParameters_methods(root_module, root_module['ns3::LrWpanSpectrumSignalParameters'])
     register_Ns3Mac16AddressChecker_methods(root_module, root_module['ns3::Mac16AddressChecker'])
     register_Ns3Mac16AddressValue_methods(root_module, root_module['ns3::Mac16AddressValue'])
+    register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     register_Ns3Mac64AddressChecker_methods(root_module, root_module['ns3::Mac64AddressChecker'])
     register_Ns3Mac64AddressValue_methods(root_module, root_module['ns3::Mac64AddressValue'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
@@ -515,6 +605,7 @@
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     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'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3LrWpanNetDevice_methods(root_module, root_module['ns3::LrWpanNetDevice'])
@@ -762,17 +853,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -794,11 +885,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -808,16 +894,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1055,14 +1131,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1123,11 +1203,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -1633,10 +1708,10 @@
     return
 
 def register_Ns3LrWpanEdPower_methods(root_module, cls):
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanEdPower::LrWpanEdPower(ns3::LrWpanEdPower const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::LrWpanEdPower const &', 'arg0')])
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanEdPower::LrWpanEdPower() [constructor]
     cls.add_constructor([])
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanEdPower::LrWpanEdPower(ns3::LrWpanEdPower const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LrWpanEdPower const &', 'arg0')])
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanEdPower::averagePower [variable]
     cls.add_instance_attribute('averagePower', 'double', is_const=False)
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::LrWpanEdPower::lastUpdate [variable]
@@ -1749,6 +1824,78 @@
                    is_static=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3Mac64Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('!=')
@@ -2241,7 +2388,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2259,10 +2406,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2326,10 +2473,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -2501,10 +2648,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -2611,6 +2758,74 @@
     cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
     return
 
+def register_Ns3TracedValue__Ns3LrWpanMacState_methods(root_module, cls):
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanMacState>::TracedValue() [constructor]
+    cls.add_constructor([])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanMacState>::TracedValue(ns3::TracedValue<ns3::LrWpanMacState> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TracedValue< ns3::LrWpanMacState > const &', 'o')])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanMacState>::TracedValue(ns3::LrWpanMacState const & v) [constructor]
+    cls.add_constructor([param('ns3::LrWpanMacState const &', 'v')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::LrWpanMacState>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::LrWpanMacState>::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::LrWpanMacState>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::LrWpanMacState>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb')])
+    ## traced-value.h (module 'core'): ns3::LrWpanMacState ns3::TracedValue<ns3::LrWpanMacState>::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::LrWpanMacState', 
+                   [], 
+                   is_const=True)
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::LrWpanMacState>::Set(ns3::LrWpanMacState const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::LrWpanMacState const &', 'v')])
+    return
+
+def register_Ns3TracedValue__Ns3LrWpanPhyEnumeration_methods(root_module, cls):
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanPhyEnumeration>::TracedValue() [constructor]
+    cls.add_constructor([])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanPhyEnumeration>::TracedValue(ns3::TracedValue<ns3::LrWpanPhyEnumeration> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TracedValue< ns3::LrWpanPhyEnumeration > const &', 'o')])
+    ## traced-value.h (module 'core'): ns3::TracedValue<ns3::LrWpanPhyEnumeration>::TracedValue(ns3::LrWpanPhyEnumeration const & v) [constructor]
+    cls.add_constructor([param('ns3::LrWpanPhyEnumeration const &', 'v')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::LrWpanPhyEnumeration>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::LrWpanPhyEnumeration>::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::LrWpanPhyEnumeration>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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::LrWpanPhyEnumeration>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb')])
+    ## traced-value.h (module 'core'): ns3::LrWpanPhyEnumeration ns3::TracedValue<ns3::LrWpanPhyEnumeration>::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::LrWpanPhyEnumeration', 
+                   [], 
+                   is_const=True)
+    ## traced-value.h (module 'core'): void ns3::TracedValue<ns3::LrWpanPhyEnumeration>::Set(ns3::LrWpanPhyEnumeration const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::LrWpanPhyEnumeration const &', 'v')])
+    return
+
 def register_Ns3TypeId_methods(root_module, cls):
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('!=')
@@ -3448,10 +3663,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -3643,11 +3858,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> m) [member function]
     cls.add_method('SetMobility', 
                    'void', 
@@ -4049,6 +4264,47 @@
                    is_pure_virtual=True, is_const=True, is_virtual=True)
     return
 
+def register_Ns3BooleanChecker_methods(root_module, cls):
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker(ns3::BooleanChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanChecker const &', 'arg0')])
+    return
+
+def register_Ns3BooleanValue_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(ns3::BooleanValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanValue const &', 'arg0')])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(bool value) [constructor]
+    cls.add_constructor([param('bool', 'value')])
+    ## boolean.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::BooleanValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('bool', 'value')])
+    return
+
 def register_Ns3CallbackChecker_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
     cls.add_constructor([])
@@ -4061,11 +4317,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4096,6 +4362,39 @@
                    [param('ns3::CallbackBase', 'base')])
     return
 
+def register_Ns3DoubleValue_methods(root_module, cls):
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
+    cls.add_constructor([])
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(ns3::DoubleValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DoubleValue const &', 'arg0')])
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(double const & value) [constructor]
+    cls.add_constructor([param('double const &', 'value')])
+    ## double.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::DoubleValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## double.h (module 'core'): bool ns3::DoubleValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## double.h (module 'core'): double ns3::DoubleValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## double.h (module 'core'): std::string ns3::DoubleValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## double.h (module 'core'): void ns3::DoubleValue::Set(double const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('double const &', 'value')])
+    return
+
 def register_Ns3EmptyAttributeValue_methods(root_module, cls):
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
@@ -4118,6 +4417,84 @@
                    is_const=True, visibility='private', is_virtual=True)
     return
 
+def register_Ns3EnumChecker_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker(ns3::EnumChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumChecker const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): void ns3::EnumChecker::Add(int value, std::string name) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): void ns3::EnumChecker::AddDefault(int value, std::string name) [member function]
+    cls.add_method('AddDefault', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Copy(ns3::AttributeValue const & src, ns3::AttributeValue & dst) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'src'), param('ns3::AttributeValue &', 'dst')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3EnumValue_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(ns3::EnumValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumValue const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(int value) [constructor]
+    cls.add_constructor([param('int', 'value')])
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## enum.h (module 'core'): int ns3::EnumValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int', 
+                   [], 
+                   is_const=True)
+    ## enum.h (module 'core'): std::string ns3::EnumValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): void ns3::EnumValue::Set(int value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int', 'value')])
+    return
+
 def register_Ns3EventImpl_methods(root_module, cls):
     ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
@@ -4142,6 +4519,39 @@
                    is_pure_virtual=True, visibility='protected', is_virtual=True)
     return
 
+def register_Ns3IntegerValue_methods(root_module, cls):
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue() [constructor]
+    cls.add_constructor([])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(ns3::IntegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::IntegerValue const &', 'arg0')])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(int64_t const & value) [constructor]
+    cls.add_constructor([param('int64_t const &', 'value')])
+    ## integer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::IntegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): bool ns3::IntegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## integer.h (module 'core'): int64_t ns3::IntegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## integer.h (module 'core'): std::string ns3::IntegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): void ns3::IntegerValue::Set(int64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int64_t const &', 'value')])
+    return
+
 def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
     cls.add_constructor([])
@@ -4723,11 +5133,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::NetDevice> ns3::LrWpanPhy::GetDevice() [member function]
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::NetDevice> ns3::LrWpanPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lr-wpan-phy.h (module 'lr-wpan'): void ns3::LrWpanPhy::SetAntenna(ns3::Ptr<ns3::AntennaModel> a) [member function]
     cls.add_method('SetAntenna', 
                    'void', 
@@ -4899,6 +5309,46 @@
                    [param('ns3::Mac16Address const &', 'value')])
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3Mac64AddressChecker_methods(root_module, cls):
     ## mac64-address.h (module 'network'): ns3::Mac64AddressChecker::Mac64AddressChecker() [constructor]
     cls.add_constructor([])
@@ -5509,6 +5959,39 @@
                    [param('ns3::TypeId const &', 'value')])
     return
 
+def register_Ns3UintegerValue_methods(root_module, cls):
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue() [constructor]
+    cls.add_constructor([])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(ns3::UintegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::UintegerValue const &', 'arg0')])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(uint64_t const & value) [constructor]
+    cls.add_constructor([param('uint64_t const &', 'value')])
+    ## uinteger.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::UintegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): bool ns3::UintegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## uinteger.h (module 'core'): uint64_t ns3::UintegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## uinteger.h (module 'core'): std::string ns3::UintegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): void ns3::UintegerValue::Set(uint64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint64_t const &', 'value')])
+    return
+
 def register_Ns3AddressChecker_methods(root_module, cls):
     ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
     cls.add_constructor([])
@@ -5839,6 +6322,8 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
+    register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5851,6 +6336,12 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
+def register_functions_ns3_internal(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/lr-wpan/model/lr-wpan-mac.cc ns-3.24/src/lr-wpan/model/lr-wpan-mac.cc
--- ns-3.23/src/lr-wpan/model/lr-wpan-mac.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lr-wpan/model/lr-wpan-mac.cc	2015-09-15 11:18:44.000000000 -0700
@@ -111,6 +111,10 @@
                      "packet sniffer attached to the device",
                      MakeTraceSourceAccessor (&LrWpanMac::m_promiscSnifferTrace),
                      "ns3::Packet::TracedCallback")
+    .AddTraceSource ("MacStateValue",
+                     "The state of LrWpan Mac",
+                     MakeTraceSourceAccessor (&LrWpanMac::m_lrWpanMacState),
+                     "ns3::TracedValueCallback::LrWpanMacState")
     .AddTraceSource ("MacState",
                      "The state of LrWpan Mac",
                      MakeTraceSourceAccessor (&LrWpanMac::m_macStateLogger),
diff -Naur ns-3.23/src/lr-wpan/model/lr-wpan-mac.h ns-3.24/src/lr-wpan/model/lr-wpan-mac.h
--- ns-3.23/src/lr-wpan/model/lr-wpan-mac.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lr-wpan/model/lr-wpan-mac.h	2015-09-15 11:18:44.000000000 -0700
@@ -26,6 +26,7 @@
 
 #include <ns3/object.h>
 #include <ns3/traced-callback.h>
+#include <ns3/traced-value.h>
 #include <ns3/mac16-address.h>
 #include <ns3/mac64-address.h>
 #include <ns3/sequence-number.h>
@@ -74,6 +75,20 @@
   SET_PHY_TX_ON          //!< SET_PHY_TX_ON
 } LrWpanMacState;
 
+namespace TracedValueCallback {
+
+/**
+ * \ingroup lr-wpan
+ * TracedValue callback signature for LrWpanMacState.
+ *
+ * \param [in] oldValue original value of the traced variable
+ * \param [in] newValue new value of the traced variable
+ */
+  typedef void (* LrWpanMacState)(LrWpanMacState oldValue,
+                                  LrWpanMacState newValue);
+
+}  // namespace TracedValueCallback
+
 /**
  * \ingroup lr-wpan
  *
@@ -526,17 +541,19 @@
    * \param [in] backoffs The number of CSMA backoffs.
    */
   typedef void (* SentTracedCallback)
-    (const Ptr<const Packet> packet, const uint8_t retries,
-     const uint8_t backoffs);
+    (Ptr<const Packet> packet, uint8_t retries, uint8_t backoffs);
 
   /**
    * TracedCallback signature for LrWpanMacState change events.
    *
    * \param [in] oldValue The original state value.
    * \param [in] newValue The new state value.
+   * \deprecated The LrWpanMacState is now accessible as the
+   * TracedValue \c MacStateValue. The \c MacState TracedCallback will
+   * be removed in a future release.
    */
   typedef void (* StateTracedCallback)
-    (const LrWpanMacState oldState, const LrWpanMacState newState);
+    (LrWpanMacState oldState, LrWpanMacState newState);
   
 protected:
   // Inherited from Object.
@@ -717,7 +734,9 @@
    * A trace source that fires when the LrWpanMac changes states.
    * Parameters are the old mac state and the new mac state.
    *
-   * \todo This should be a TracedValue
+   * \deprecated This TracedCallback is deprecated and will be
+   * removed in a future release,  Instead, use the \c MacStateValue
+   * TracedValue.
    */
   TracedCallback<LrWpanMacState, LrWpanMacState> m_macStateLogger;
 
@@ -747,7 +766,7 @@
   /**
    * The current state of the MAC layer.
    */
-  LrWpanMacState m_lrWpanMacState;
+  TracedValue<LrWpanMacState> m_lrWpanMacState;
 
   /**
    * The current association status of the MAC layer.
diff -Naur ns-3.23/src/lr-wpan/model/lr-wpan-net-device.cc ns-3.24/src/lr-wpan/model/lr-wpan-net-device.cc
--- ns-3.23/src/lr-wpan/model/lr-wpan-net-device.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lr-wpan/model/lr-wpan-net-device.cc	2015-09-15 11:18:44.000000000 -0700
@@ -128,7 +128,12 @@
   m_mac->SetMcpsDataIndicationCallback (MakeCallback (&LrWpanNetDevice::McpsDataIndication, this));
   m_csmaca->SetMac (m_mac);
 
-  m_phy->SetMobility (m_node->GetObject<MobilityModel> ());
+  Ptr<MobilityModel> mobility = m_node->GetObject<MobilityModel> ();
+  if (!mobility)
+    {
+      NS_LOG_WARN ("LrWpanNetDevice: no Mobility found on the node, probably it's not a good idea.");
+    }
+  m_phy->SetMobility (mobility);
   Ptr<LrWpanErrorModel> model = CreateObject<LrWpanErrorModel> ();
   m_phy->SetErrorModel (model);
   m_phy->SetDevice (this);
diff -Naur ns-3.23/src/lr-wpan/model/lr-wpan-phy.cc ns-3.24/src/lr-wpan/model/lr-wpan-phy.cc
--- ns-3.23/src/lr-wpan/model/lr-wpan-phy.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lr-wpan/model/lr-wpan-phy.cc	2015-09-15 11:18:44.000000000 -0700
@@ -74,9 +74,13 @@
 LrWpanPhy::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::LrWpanPhy")
-    .SetParent<Object> ()
+    .SetParent<SpectrumPhy> ()
     .SetGroupName ("LrWpan")
     .AddConstructor<LrWpanPhy> ()
+    .AddTraceSource ("TrxStateValue",
+                     "The state of the transceiver",
+                     MakeTraceSourceAccessor (&LrWpanPhy::m_trxState),
+                     "ns3::TracedValueCallback::LrWpanPhyEnumeration")
     .AddTraceSource ("TrxState",
                      "The state of the transceiver",
                      MakeTraceSourceAccessor (&LrWpanPhy::m_trxStateLogger),
@@ -106,7 +110,7 @@
                      "completely received from the channel medium "
                      "by the device",
                      MakeTraceSourceAccessor (&LrWpanPhy::m_phyRxEndTrace),
-                     "ns3::LrWpanPhy::RxEndTracedCallback")
+                     "ns3::Packet::SinrTracedCallback")
     .AddTraceSource ("PhyRxDrop",
                      "Trace source indicating a packet has been "
                      "dropped by the device during reception",
@@ -194,7 +198,7 @@
 }
 
 Ptr<NetDevice>
-LrWpanPhy::GetDevice (void)
+LrWpanPhy::GetDevice (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_device;
diff -Naur ns-3.23/src/lr-wpan/model/lr-wpan-phy.h ns-3.24/src/lr-wpan/model/lr-wpan-phy.h
--- ns-3.23/src/lr-wpan/model/lr-wpan-phy.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lr-wpan/model/lr-wpan-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -26,6 +26,7 @@
 
 #include <ns3/spectrum-phy.h>
 #include <ns3/traced-callback.h>
+#include <ns3/traced-value.h>
 #include <ns3/event-id.h>
 
 namespace ns3 {
@@ -118,6 +119,19 @@
   IEEE_802_15_4_PHY_UNSPECIFIED = 0xc // all cases not covered by ieee802.15.4
 } LrWpanPhyEnumeration;
 
+namespace TracedValueCallback
+{
+/**
+ * \ingroup lr-wpan
+ * TracedValue callback signature for LrWpanPhyEnumeration.
+ *
+ * \param [in] oldValue original value of the traced variable
+ * \param [in] newValue new value of the traced variable
+ */
+  typedef void (* LrWpanPhyEnumeration)(LrWpanPhyEnumeration oldValue,
+                                        LrWpanPhyEnumeration newValue);
+}  // namespace TracedValueCallback
+
 /**
  * \ingroup lr-wpan
  *
@@ -272,7 +286,7 @@
    */
   Ptr<SpectrumChannel> GetChannel (void);
   void SetDevice (Ptr<NetDevice> d);
-  Ptr<NetDevice> GetDevice (void);
+  Ptr<NetDevice> GetDevice (void) const;
 
   /**
    * Set the attached antenna.
@@ -468,20 +482,13 @@
    * \param [in] time The time of the state change.
    * \param [in] oldState The old state.
    * \param [in] newState The new state.
+   * \deprecated The LrWpanPhyEnumeration state is now accessible as the
+   * TracedValue \c TrxStateValue.  The \c TrxState TracedCallback will
+   * be removed in a future release.
    */
   typedef void (* StateTracedCallback)
-    (const Time time,
-     const LrWpanPhyEnumeration oldState, const LrWpanPhyEnumeration newState);
+    (Time time, LrWpanPhyEnumeration oldState, LrWpanPhyEnumeration newState);
 
-  /**
-   * TracedCallback signature for end receive events.
-   *
-   * \param [in] packet The packet.
-   * \param [in] sinr The received SINR.
-   */
-  typedef void (* RxEndTracedCallback)
-    (const Ptr<const Packet> packet, const double sinr);
-    
 protected:
   /**
    * The data and symbol rates for the different PHY options.
@@ -659,6 +666,9 @@
    * The trace source fired when the phy layer changes the transceiver state.
    *
    * \see class CallBackTraceSource
+   * \deprecated The LrWpanPhyEnumeration state is now accessible as the
+   * TracedValue \c TrxStateValue.  This TracedCallback will
+   * be removed in a future release.
    */
   TracedCallback<Time, LrWpanPhyEnumeration, LrWpanPhyEnumeration> m_trxStateLogger;
 
@@ -706,7 +716,7 @@
   /**
    * The current transceiver state.
    */
-  LrWpanPhyEnumeration m_trxState;
+  TracedValue<LrWpanPhyEnumeration> m_trxState;
 
   /**
    * The next pending state to applied after the current action of the PHY is
diff -Naur ns-3.23/src/lte/bindings/modulegen__gcc_ILP32.py ns-3.24/src/lte/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/lte/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lte/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -1515,6 +1515,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -1563,6 +1569,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -2280,17 +2317,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -2312,11 +2349,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -2326,16 +2358,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -2646,14 +2668,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -2714,11 +2740,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CqasFlowPerf_t_methods(root_module, cls):
@@ -7873,7 +7894,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -8220,10 +8241,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -8615,6 +8636,11 @@
     cls.add_method('SetParent', 
                    'ns3::TypeId', 
                    [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent() [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   template_parameters=['ns3::Object'])
     ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetSize(std::size_t size) [member function]
     cls.add_method('SetSize', 
                    'ns3::TypeId', 
@@ -11140,6 +11166,11 @@
     cls.add_method('EndRx', 
                    'bool', 
                    [])
+    ## spectrum-interference.h (module 'spectrum'): static ns3::TypeId ns3::SpectrumInterference::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## spectrum-interference.h (module 'spectrum'): void ns3::SpectrumInterference::SetErrorModel(ns3::Ptr<ns3::SpectrumErrorModel> e) [member function]
     cls.add_method('SetErrorModel', 
                    'void', 
@@ -11202,11 +11233,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> m) [member function]
     cls.add_method('SetMobility', 
                    'void', 
@@ -12516,11 +12547,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -12639,6 +12680,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-calculator.h (module 'stats'): static ns3::TypeId ns3::DataCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-calculator.h (module 'stats'): void ns3::DataCalculator::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -12679,6 +12725,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-output-interface.h (module 'stats'): static ns3::TypeId ns3::DataOutputInterface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-output-interface.h (module 'stats'): void ns3::DataOutputInterface::Output(ns3::DataCollector & dc) [member function]
     cls.add_method('Output', 
                    'void', 
@@ -12814,10 +12865,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -16539,10 +16590,11 @@
     cls.add_method('GetControlMessages', 
                    'std::list< ns3::Ptr< ns3::LteControlMessage > >', 
                    [])
-    ## lte-phy.h (module 'lte'): ns3::Ptr<ns3::LteNetDevice> ns3::LtePhy::GetDevice() [member function]
+    ## lte-phy.h (module 'lte'): ns3::Ptr<ns3::LteNetDevice> ns3::LtePhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::LteNetDevice >', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-phy.h (module 'lte'): ns3::Ptr<ns3::LteSpectrumPhy> ns3::LtePhy::GetDownlinkSpectrumPhy() [member function]
     cls.add_method('GetDownlinkSpectrumPhy', 
                    'ns3::Ptr< ns3::LteSpectrumPhy >', 
@@ -16895,11 +16947,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::LteSpectrumPhy::GetDevice() [member function]
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::LteSpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::SpectrumModel const> ns3::LteSpectrumPhy::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -19045,11 +19097,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::RemSpectrumPhy::GetDevice() [member function]
+    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::RemSpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::SpectrumModel const> ns3::RemSpectrumPhy::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -21824,6 +21876,7 @@
     register_functions_ns3_Config(module.get_submodule('Config'), root_module)
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -21840,6 +21893,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/lte/bindings/modulegen__gcc_LP64.py ns-3.24/src/lte/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/lte/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lte/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -1515,6 +1515,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -1563,6 +1569,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -2280,17 +2317,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -2312,11 +2349,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -2326,16 +2358,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -2646,14 +2668,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -2714,11 +2740,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CqasFlowPerf_t_methods(root_module, cls):
@@ -7873,7 +7894,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -8220,10 +8241,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -8615,6 +8636,11 @@
     cls.add_method('SetParent', 
                    'ns3::TypeId', 
                    [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent() [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   template_parameters=['ns3::Object'])
     ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetSize(std::size_t size) [member function]
     cls.add_method('SetSize', 
                    'ns3::TypeId', 
@@ -11140,6 +11166,11 @@
     cls.add_method('EndRx', 
                    'bool', 
                    [])
+    ## spectrum-interference.h (module 'spectrum'): static ns3::TypeId ns3::SpectrumInterference::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## spectrum-interference.h (module 'spectrum'): void ns3::SpectrumInterference::SetErrorModel(ns3::Ptr<ns3::SpectrumErrorModel> e) [member function]
     cls.add_method('SetErrorModel', 
                    'void', 
@@ -11202,11 +11233,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> m) [member function]
     cls.add_method('SetMobility', 
                    'void', 
@@ -12516,11 +12547,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -12639,6 +12680,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-calculator.h (module 'stats'): static ns3::TypeId ns3::DataCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-calculator.h (module 'stats'): void ns3::DataCalculator::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -12679,6 +12725,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-output-interface.h (module 'stats'): static ns3::TypeId ns3::DataOutputInterface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-output-interface.h (module 'stats'): void ns3::DataOutputInterface::Output(ns3::DataCollector & dc) [member function]
     cls.add_method('Output', 
                    'void', 
@@ -12814,10 +12865,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -16539,10 +16590,11 @@
     cls.add_method('GetControlMessages', 
                    'std::list< ns3::Ptr< ns3::LteControlMessage > >', 
                    [])
-    ## lte-phy.h (module 'lte'): ns3::Ptr<ns3::LteNetDevice> ns3::LtePhy::GetDevice() [member function]
+    ## lte-phy.h (module 'lte'): ns3::Ptr<ns3::LteNetDevice> ns3::LtePhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::LteNetDevice >', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-phy.h (module 'lte'): ns3::Ptr<ns3::LteSpectrumPhy> ns3::LtePhy::GetDownlinkSpectrumPhy() [member function]
     cls.add_method('GetDownlinkSpectrumPhy', 
                    'ns3::Ptr< ns3::LteSpectrumPhy >', 
@@ -16895,11 +16947,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::LteSpectrumPhy::GetDevice() [member function]
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::LteSpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::SpectrumModel const> ns3::LteSpectrumPhy::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -19045,11 +19097,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::RemSpectrumPhy::GetDevice() [member function]
+    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::RemSpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::SpectrumModel const> ns3::RemSpectrumPhy::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -21824,6 +21876,7 @@
     register_functions_ns3_Config(module.get_submodule('Config'), root_module)
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -21840,6 +21893,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/lte/examples/lena-deactivate-bearer.cc ns-3.24/src/lte/examples/lena-deactivate-bearer.cc
--- ns-3.23/src/lte/examples/lena-deactivate-bearer.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lte/examples/lena-deactivate-bearer.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,238 +1,238 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (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: Gaurav Sathe <gaurav.sathe@tcs.com>
- */
-
-#include "ns3/lte-helper.h"
-#include "ns3/epc-helper.h"
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/ipv4-global-routing-helper.h"
-#include "ns3/internet-module.h"
-#include "ns3/mobility-module.h"
-#include "ns3/lte-module.h"
-#include "ns3/applications-module.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/config-store.h"
-//#include "ns3/gtk-config-store.h"
-
-using namespace ns3;
-
-/**
- * Sample simulation script for LTE+EPC. It instantiates one eNodeB,
- * attaches three UE to eNodeB starts a flow for each UE to  and from a remote host.
- * It also instantiates one dedicated bearer per UE
- */
-NS_LOG_COMPONENT_DEFINE ("BearerDeactivateExample");
-int
-main (int argc, char *argv[])
-{
-
-  uint16_t numberOfNodes = 1;
-  uint16_t numberOfUeNodes = 3;
-  double simTime = 1.1;
-  double distance = 60.0;
-  double interPacketInterval = 100;
-
-  // Command line arguments
-  CommandLine cmd;
-  cmd.AddValue ("numberOfNodes", "Number of eNodeBs + UE pairs", numberOfNodes);
-  cmd.AddValue ("simTime", "Total duration of the simulation [s])", simTime);
-  cmd.AddValue ("distance", "Distance between eNBs [m]", distance);
-  cmd.AddValue ("interPacketInterval", "Inter packet interval [ms])", interPacketInterval);
-  cmd.Parse (argc, argv);
-
-  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
-  lteHelper->SetEpcHelper (epcHelper);
-
-  ConfigStore inputConfig;
-  inputConfig.ConfigureDefaults ();
-
-  // parse again so you can override default values from the command line
-  cmd.Parse (argc, argv);
-
-  Ptr<Node> pgw = epcHelper->GetPgwNode ();
-
-  // Enable Logging
-  LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
-
-  LogComponentEnable ("BearerDeactivateExample", LOG_LEVEL_ALL);
-  LogComponentEnable ("LteHelper", logLevel);
-  LogComponentEnable ("EpcHelper", logLevel);
-  LogComponentEnable ("EpcEnbApplication", logLevel);
-  LogComponentEnable ("EpcSgwPgwApplication", logLevel);
-  LogComponentEnable ("EpcMme", logLevel);
-  LogComponentEnable ("LteEnbRrc", logLevel);
-
-
-  // Create a single RemoteHost
-  NodeContainer remoteHostContainer;
-  remoteHostContainer.Create (1);
-  Ptr<Node> remoteHost = remoteHostContainer.Get (0);
-  InternetStackHelper internet;
-  internet.Install (remoteHostContainer);
-
-  // Create the Internet
-  PointToPointHelper p2ph;
-  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
-  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500));
-  p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.010)));
-  NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
-  Ipv4AddressHelper ipv4h;
-  ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
-  Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
-  // interface 0 is localhost, 1 is the p2p device
-  Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress (1);
-
-  Ipv4StaticRoutingHelper ipv4RoutingHelper;
-  Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
-  remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
-
-  NodeContainer ueNodes;
-  NodeContainer enbNodes;
-  enbNodes.Create (numberOfNodes);
-  ueNodes.Create (numberOfUeNodes);
-
-  // Install Mobility Model
-  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
-  for (uint16_t i = 0; i < numberOfNodes; i++)
-    {
-      positionAlloc->Add (Vector (distance * i, 0, 0));
-    }
-  MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
-  mobility.SetPositionAllocator (positionAlloc);
-  mobility.Install (enbNodes);
-  mobility.Install (ueNodes);
-
-  // Install LTE Devices to the nodes
-  NetDeviceContainer enbLteDevs = lteHelper->InstallEnbDevice (enbNodes);
-  NetDeviceContainer ueLteDevs = lteHelper->InstallUeDevice (ueNodes);
-
-  // Install the IP stack on the UEs
-  internet.Install (ueNodes);
-  Ipv4InterfaceContainer ueIpIface;
-  ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueLteDevs));
-  // Assign IP address to UEs, and install applications
-  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
-    {
-      Ptr<Node> ueNode = ueNodes.Get (u);
-      // Set the default gateway for the UE
-      Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
-      ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
-    }
-
-  // Attach a UE to a eNB
-  lteHelper->Attach (ueLteDevs, enbLteDevs.Get (0));
-
-  // Activate an EPS bearer on all UEs
-
-  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
-    {
-      Ptr<NetDevice> ueDevice = ueLteDevs.Get (u);
-      GbrQosInformation qos;
-      qos.gbrDl = 132;  // bit/s, considering IP, UDP, RLC, PDCP header size
-      qos.gbrUl = 132;
-      qos.mbrDl = qos.gbrDl;
-      qos.mbrUl = qos.gbrUl;
-
-      enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
-      EpsBearer bearer (q, qos);
-      bearer.arp.priorityLevel = 15 - (u + 1);
-      bearer.arp.preemptionCapability = true;
-      bearer.arp.preemptionVulnerability = true;
-      lteHelper->ActivateDedicatedEpsBearer (ueDevice, bearer, EpcTft::Default ());
-    }
-
-
-  // Install and start applications on UEs and remote host
-  uint16_t dlPort = 1234;
-  uint16_t ulPort = 2000;
-  uint16_t otherPort = 3000;
-  ApplicationContainer clientApps;
-  ApplicationContainer serverApps;
-  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
-    {
-      ++ulPort;
-      ++otherPort;
-      PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), dlPort));
-      PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), ulPort));
-      PacketSinkHelper packetSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), otherPort));
-      serverApps.Add (dlPacketSinkHelper.Install (ueNodes.Get (u)));
-      serverApps.Add (ulPacketSinkHelper.Install (remoteHost));
-      serverApps.Add (packetSinkHelper.Install (ueNodes.Get (u)));
-
-      UdpClientHelper dlClient (ueIpIface.GetAddress (u), dlPort);
-      dlClient.SetAttribute ("Interval", TimeValue (MilliSeconds (interPacketInterval)));
-      dlClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
-
-      UdpClientHelper ulClient (remoteHostAddr, ulPort);
-      ulClient.SetAttribute ("Interval", TimeValue (MilliSeconds (interPacketInterval)));
-      ulClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
-
-      UdpClientHelper client (ueIpIface.GetAddress (u), otherPort);
-      client.SetAttribute ("Interval", TimeValue (MilliSeconds (interPacketInterval)));
-      client.SetAttribute ("MaxPackets", UintegerValue (1000000));
-
-      clientApps.Add (dlClient.Install (remoteHost));
-      clientApps.Add (ulClient.Install (ueNodes.Get (u)));
-      if (u + 1 < ueNodes.GetN ())
-        {
-          clientApps.Add (client.Install (ueNodes.Get (u + 1)));
-        }
-      else
-        {
-          clientApps.Add (client.Install (ueNodes.Get (0)));
-        }
-    }
-
-  serverApps.Start (Seconds (0.030));
-  clientApps.Start (Seconds (0.030));
-
-  double statsStartTime = 0.04; // need to allow for RRC connection establishment + SRS
-  double statsDuration = 1.0;
-
-  lteHelper->EnableRlcTraces ();
-  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
-  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
-  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
-
-  //get ue device pointer for UE-ID 0 IMSI 1 and enb device pointer
-  Ptr<NetDevice> ueDevice = ueLteDevs.Get (0);
-  Ptr<NetDevice> enbDevice = enbLteDevs.Get (0);
-
-  /*
-   *   Instantiate De-activation using Simulator::Schedule() method which will initiate bearer de-activation after deActivateTime
-   *   Instantiate De-activation in sequence (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3)
-   */
-  Time deActivateTime (Seconds (1.5));
-  Simulator::Schedule (deActivateTime, &LteHelper::DeActivateDedicatedEpsBearer, lteHelper, ueDevice, enbDevice, 2);
-
-  //stop simulation after 3 seconds
-  Simulator::Stop (Seconds (3.0));
-
-  Simulator::Run ();
-  /*GtkConfigStore config;
-  config.ConfigureAttributes();*/
-
-  Simulator::Destroy ();
-  return 0;
-
-}
-
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (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: Gaurav Sathe <gaurav.sathe@tcs.com>
+ */
+
+#include "ns3/lte-helper.h"
+#include "ns3/epc-helper.h"
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/internet-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/lte-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/config-store.h"
+//#include "ns3/gtk-config-store.h"
+
+using namespace ns3;
+
+/**
+ * Sample simulation script for LTE+EPC. It instantiates one eNodeB,
+ * attaches three UE to eNodeB starts a flow for each UE to  and from a remote host.
+ * It also instantiates one dedicated bearer per UE
+ */
+NS_LOG_COMPONENT_DEFINE ("BearerDeactivateExample");
+int
+main (int argc, char *argv[])
+{
+
+  uint16_t numberOfNodes = 1;
+  uint16_t numberOfUeNodes = 3;
+  double simTime = 1.1;
+  double distance = 60.0;
+  double interPacketInterval = 100;
+
+  // Command line arguments
+  CommandLine cmd;
+  cmd.AddValue ("numberOfNodes", "Number of eNodeBs + UE pairs", numberOfNodes);
+  cmd.AddValue ("simTime", "Total duration of the simulation [s])", simTime);
+  cmd.AddValue ("distance", "Distance between eNBs [m]", distance);
+  cmd.AddValue ("interPacketInterval", "Inter packet interval [ms])", interPacketInterval);
+  cmd.Parse (argc, argv);
+
+  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+  Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
+  lteHelper->SetEpcHelper (epcHelper);
+
+  ConfigStore inputConfig;
+  inputConfig.ConfigureDefaults ();
+
+  // parse again so you can override default values from the command line
+  cmd.Parse (argc, argv);
+
+  Ptr<Node> pgw = epcHelper->GetPgwNode ();
+
+  // Enable Logging
+  LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
+
+  LogComponentEnable ("BearerDeactivateExample", LOG_LEVEL_ALL);
+  LogComponentEnable ("LteHelper", logLevel);
+  LogComponentEnable ("EpcHelper", logLevel);
+  LogComponentEnable ("EpcEnbApplication", logLevel);
+  LogComponentEnable ("EpcSgwPgwApplication", logLevel);
+  LogComponentEnable ("EpcMme", logLevel);
+  LogComponentEnable ("LteEnbRrc", logLevel);
+
+
+  // Create a single RemoteHost
+  NodeContainer remoteHostContainer;
+  remoteHostContainer.Create (1);
+  Ptr<Node> remoteHost = remoteHostContainer.Get (0);
+  InternetStackHelper internet;
+  internet.Install (remoteHostContainer);
+
+  // Create the Internet
+  PointToPointHelper p2ph;
+  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
+  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500));
+  p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.010)));
+  NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
+  Ipv4AddressHelper ipv4h;
+  ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
+  Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
+  // interface 0 is localhost, 1 is the p2p device
+  Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress (1);
+
+  Ipv4StaticRoutingHelper ipv4RoutingHelper;
+  Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
+  remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
+
+  NodeContainer ueNodes;
+  NodeContainer enbNodes;
+  enbNodes.Create (numberOfNodes);
+  ueNodes.Create (numberOfUeNodes);
+
+  // Install Mobility Model
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+  for (uint16_t i = 0; i < numberOfNodes; i++)
+    {
+      positionAlloc->Add (Vector (distance * i, 0, 0));
+    }
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.SetPositionAllocator (positionAlloc);
+  mobility.Install (enbNodes);
+  mobility.Install (ueNodes);
+
+  // Install LTE Devices to the nodes
+  NetDeviceContainer enbLteDevs = lteHelper->InstallEnbDevice (enbNodes);
+  NetDeviceContainer ueLteDevs = lteHelper->InstallUeDevice (ueNodes);
+
+  // Install the IP stack on the UEs
+  internet.Install (ueNodes);
+  Ipv4InterfaceContainer ueIpIface;
+  ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueLteDevs));
+  // Assign IP address to UEs, and install applications
+  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
+    {
+      Ptr<Node> ueNode = ueNodes.Get (u);
+      // Set the default gateway for the UE
+      Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
+      ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
+    }
+
+  // Attach a UE to a eNB
+  lteHelper->Attach (ueLteDevs, enbLteDevs.Get (0));
+
+  // Activate an EPS bearer on all UEs
+
+  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
+    {
+      Ptr<NetDevice> ueDevice = ueLteDevs.Get (u);
+      GbrQosInformation qos;
+      qos.gbrDl = 132;  // bit/s, considering IP, UDP, RLC, PDCP header size
+      qos.gbrUl = 132;
+      qos.mbrDl = qos.gbrDl;
+      qos.mbrUl = qos.gbrUl;
+
+      enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
+      EpsBearer bearer (q, qos);
+      bearer.arp.priorityLevel = 15 - (u + 1);
+      bearer.arp.preemptionCapability = true;
+      bearer.arp.preemptionVulnerability = true;
+      lteHelper->ActivateDedicatedEpsBearer (ueDevice, bearer, EpcTft::Default ());
+    }
+
+
+  // Install and start applications on UEs and remote host
+  uint16_t dlPort = 1234;
+  uint16_t ulPort = 2000;
+  uint16_t otherPort = 3000;
+  ApplicationContainer clientApps;
+  ApplicationContainer serverApps;
+  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
+    {
+      ++ulPort;
+      ++otherPort;
+      PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), dlPort));
+      PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), ulPort));
+      PacketSinkHelper packetSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), otherPort));
+      serverApps.Add (dlPacketSinkHelper.Install (ueNodes.Get (u)));
+      serverApps.Add (ulPacketSinkHelper.Install (remoteHost));
+      serverApps.Add (packetSinkHelper.Install (ueNodes.Get (u)));
+
+      UdpClientHelper dlClient (ueIpIface.GetAddress (u), dlPort);
+      dlClient.SetAttribute ("Interval", TimeValue (MilliSeconds (interPacketInterval)));
+      dlClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
+
+      UdpClientHelper ulClient (remoteHostAddr, ulPort);
+      ulClient.SetAttribute ("Interval", TimeValue (MilliSeconds (interPacketInterval)));
+      ulClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
+
+      UdpClientHelper client (ueIpIface.GetAddress (u), otherPort);
+      client.SetAttribute ("Interval", TimeValue (MilliSeconds (interPacketInterval)));
+      client.SetAttribute ("MaxPackets", UintegerValue (1000000));
+
+      clientApps.Add (dlClient.Install (remoteHost));
+      clientApps.Add (ulClient.Install (ueNodes.Get (u)));
+      if (u + 1 < ueNodes.GetN ())
+        {
+          clientApps.Add (client.Install (ueNodes.Get (u + 1)));
+        }
+      else
+        {
+          clientApps.Add (client.Install (ueNodes.Get (0)));
+        }
+    }
+
+  serverApps.Start (Seconds (0.030));
+  clientApps.Start (Seconds (0.030));
+
+  double statsStartTime = 0.04; // need to allow for RRC connection establishment + SRS
+  double statsDuration = 1.0;
+
+  lteHelper->EnableRlcTraces ();
+  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
+  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
+  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
+
+  //get ue device pointer for UE-ID 0 IMSI 1 and enb device pointer
+  Ptr<NetDevice> ueDevice = ueLteDevs.Get (0);
+  Ptr<NetDevice> enbDevice = enbLteDevs.Get (0);
+
+  /*
+   *   Instantiate De-activation using Simulator::Schedule() method which will initiate bearer de-activation after deActivateTime
+   *   Instantiate De-activation in sequence (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3)
+   */
+  Time deActivateTime (Seconds (1.5));
+  Simulator::Schedule (deActivateTime, &LteHelper::DeActivateDedicatedEpsBearer, lteHelper, ueDevice, enbDevice, 2);
+
+  //stop simulation after 3 seconds
+  Simulator::Stop (Seconds (3.0));
+
+  Simulator::Run ();
+  /*GtkConfigStore config;
+  config.ConfigureAttributes();*/
+
+  Simulator::Destroy ();
+  return 0;
+
+}
+
diff -Naur ns-3.23/src/lte/helper/radio-bearer-stats-connector.cc ns-3.24/src/lte/helper/radio-bearer-stats-connector.cc
--- ns-3.23/src/lte/helper/radio-bearer-stats-connector.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lte/helper/radio-bearer-stats-connector.cc	2015-09-15 11:18:44.000000000 -0700
@@ -68,7 +68,7 @@
 DlTxPduCallback (Ptr<BoundCallbackArgument> arg, std::string path,
                  uint16_t rnti, uint8_t lcid, uint32_t packetSize)
 {
-  NS_LOG_LOGIC (path << rnti << (uint16_t)lcid << packetSize);
+  NS_LOG_FUNCTION (path << rnti << (uint16_t)lcid << packetSize);
   arg->stats->DlTxPdu (arg->cellId, arg->imsi, rnti, lcid, packetSize);
 }
 
@@ -85,7 +85,7 @@
 DlRxPduCallback (Ptr<BoundCallbackArgument> arg, std::string path,
                  uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
 {
-  NS_LOG_LOGIC (path << rnti << (uint16_t)lcid << packetSize << delay);
+  NS_LOG_FUNCTION (path << rnti << (uint16_t)lcid << packetSize << delay);
   arg->stats->DlRxPdu (arg->cellId, arg->imsi, rnti, lcid, packetSize, delay);
 }
 
@@ -101,7 +101,7 @@
 UlTxPduCallback (Ptr<BoundCallbackArgument> arg, std::string path,
                  uint16_t rnti, uint8_t lcid, uint32_t packetSize)
 {
-  NS_LOG_LOGIC (path << rnti << (uint16_t)lcid << packetSize);
+  NS_LOG_FUNCTION (path << rnti << (uint16_t)lcid << packetSize);
  
   arg->stats->UlTxPdu (arg->cellId, arg->imsi, rnti, lcid, packetSize);
 }
@@ -119,7 +119,7 @@
 UlRxPduCallback (Ptr<BoundCallbackArgument> arg, std::string path,
                  uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
 {
-  NS_LOG_LOGIC (path << rnti << (uint16_t)lcid << packetSize << delay);
+  NS_LOG_FUNCTION (path << rnti << (uint16_t)lcid << packetSize << delay);
  
   arg->stats->UlRxPdu (arg->cellId, arg->imsi, rnti, lcid, packetSize, delay);
 }
diff -Naur ns-3.23/src/lte/model/epc-x2.cc ns-3.24/src/lte/model/epc-x2.cc
--- ns-3.23/src/lte/model/epc-x2.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lte/model/epc-x2.cc	2015-09-15 11:18:44.000000000 -0700
@@ -348,6 +348,7 @@
           NS_LOG_INFO ("X2 ResourceStatusUpdate header: " << x2ResStatUpdHeader);
 
           EpcX2SapUser::ResourceStatusUpdateParams params;
+          params.targetCellId = 0;
           params.enb1MeasurementId = x2ResStatUpdHeader.GetEnb1MeasurementId ();
           params.enb2MeasurementId = x2ResStatUpdHeader.GetEnb2MeasurementId ();
           params.cellMeasurementResultList = x2ResStatUpdHeader.GetCellMeasurementResultList ();
diff -Naur ns-3.23/src/lte/model/lte-common.h ns-3.24/src/lte/model/lte-common.h
--- ns-3.23/src/lte/model/lte-common.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lte/model/lte-common.h	2015-09-15 11:18:45.000000000 -0700
@@ -132,6 +132,7 @@
    *  TracedCallback signature.
    *
    * \param [in] params Value of the PhyTransmissionionStatParameters.
+   * \todo The argument should be passed by const reference, since it's large.
    */
   typedef void (* TracedCallback)(const PhyTransmissionStatParameters params);
   
@@ -156,6 +157,7 @@
    *  TracedCallback signature.
    *
    * \param [in] params Value of the PhyReceptionStatParameters.
+   * \todo The argument should be passed by const reference, since it's large.
    */
   typedef void (* TracedCallback)(const PhyReceptionStatParameters params);
   
diff -Naur ns-3.23/src/lte/model/lte-enb-mac.h ns-3.24/src/lte/model/lte-enb-mac.h
--- ns-3.23/src/lte/model/lte-enb-mac.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lte/model/lte-enb-mac.h	2015-09-15 11:18:45.000000000 -0700
@@ -132,9 +132,9 @@
    * \param [in] tbs1Size
    */
   typedef void (* DlSchedulingTracedCallback)
-    (const uint32_t frame, const uint32_t subframe, const uint16_t rnti,
-     const uint8_t mcs0, const uint16_t tbs0Size,
-     const uint8_t mcs1, const uint16_t tbs1Size);
+    (uint32_t frame, uint32_t subframe,  uint16_t rnti,
+     uint8_t mcs0, uint16_t tbs0Size,
+     uint8_t mcs1, uint16_t tbs1Size);
 
   /**
    *  TracedCallback signature for UL scheduling events.
@@ -146,8 +146,8 @@
    * \param [in] tbsSize
    */
   typedef void (* UlSchedulingTracedCallback)
-    (const uint32_t frame, const uint32_t subframe, const uint16_t rnti,
-     const uint8_t mcs, const uint16_t tbsSize);
+    (uint32_t frame, uint32_t subframe, uint16_t rnti,
+     uint8_t mcs, uint16_t tbsSize);
   
 private:
 
@@ -252,12 +252,14 @@
    * Frame number, Subframe number, RNTI, MCS of TB1, size of TB1,
    * MCS of TB2 (0 if not present), size of TB2 (0 if not present)
    */
-  TracedCallback<uint32_t, uint32_t, uint16_t, uint8_t, uint16_t, uint8_t, uint16_t> m_dlScheduling;
+  TracedCallback<uint32_t, uint32_t, uint16_t,
+                 uint8_t, uint16_t, uint8_t, uint16_t> m_dlScheduling;
   /**
    * Trace information regarding UL scheduling
    * Frame number, Subframe number, RNTI, MCS of TB, size of TB
    */
-  TracedCallback<uint32_t, uint32_t, uint16_t, uint8_t, uint16_t> m_ulScheduling;
+  TracedCallback<uint32_t, uint32_t, uint16_t,
+                 uint8_t, uint16_t> m_ulScheduling;
   
   uint8_t m_macChTtiDelay; // delay of MAC, PHY and channel in terms of TTIs
 
diff -Naur ns-3.23/src/lte/model/lte-enb-phy.h ns-3.24/src/lte/model/lte-enb-phy.h
--- ns-3.23/src/lte/model/lte-enb-phy.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-enb-phy.h	2015-09-15 11:18:45.000000000 -0700
@@ -291,17 +291,18 @@
    * \param [in] sinrLinear
    */
   typedef void (* ReportUeSinrTracedCallback)
-    (const uint16_t cellId, const uint16_t rnti, const double sinrLinear);
+    (uint16_t cellId, uint16_t rnti, double sinrLinear);
 
   /**
    * TracedCallback signature for the linear average of SRS SINRs.
    *
    * \param [in] cellId
    * \param [in] spectrumValue
+   * \deprecated The non-const \c Ptr<SpectrumValue> argument is deprecated
+   * and will be changed to \c Ptr<const SpectrumValue> in a future release.
    */
   typedef void (* ReportInterferenceTracedCallback)
-    (const uint16_t cellId, const Ptr<const SpectrumValue> spectrumValue);
-
+    (uint16_t cellId, Ptr<SpectrumValue> spectrumValue);
 
 private:
 
@@ -416,6 +417,8 @@
    * The `ReportInterference` trace source. Reporting the interference per PHY
    * RB (TS 36.214 section 5.2.2, measured on DATA). Exporting cell ID and
    * interference linear power per RB basis.
+   * \deprecated The non-const \c Ptr<SpectrumValue> argument is deprecated
+   * and will be changed to \c Ptr<const SpectrumValue> in a future release.
    */
   TracedCallback<uint16_t, Ptr<SpectrumValue> > m_reportInterferenceTrace;
   /**
diff -Naur ns-3.23/src/lte/model/lte-enb-rrc.h ns-3.24/src/lte/model/lte-enb-rrc.h
--- ns-3.23/src/lte/model/lte-enb-rrc.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-enb-rrc.h	2015-09-15 11:18:45.000000000 -0700
@@ -314,8 +314,8 @@
    * \param [in] newState
    */
   typedef void (* StateTracedCallback)
-    (const uint64_t imsi, const uint16_t cellId, const uint16_t rnti,
-     const State oldState, const State newState);
+    (uint64_t imsi, uint16_t cellId, uint16_t rnti,
+     State oldState, State newState);
 
 private:
 
@@ -827,7 +827,7 @@
    * \param [in] rnti
    */
   typedef void (* NewUeContextTracedCallback)
-    (const uint16_t cellId, const uint16_t rnti);
+    (uint16_t cellId, uint16_t rnti);
 
   /**
    * TracedCallback signature for connection and handover end events.
@@ -837,7 +837,7 @@
    * \param [in] rnti
    */
   typedef void (* ConnectionHandoverTracedCallback)
-    (const uint64_t imsi, const uint16_t cellId, const uint16_t rnti);
+    (uint64_t imsi, uint16_t cellId, uint16_t rnti);
   
   /**
    * TracedCallback signature for handover start events.
@@ -848,8 +848,7 @@
    * \param [in] targetCid
    */
   typedef void (* HandoverStartTracedCallback)
-    (const uint64_t imsi, const uint16_t cellId, const uint16_t rnti,
-     const uint16_t targetCid);
+    (uint64_t imsi, uint16_t cellId, uint16_t rnti, uint16_t targetCid);
 
   /**
    * TracedCallback signature for receive measurement report events.
@@ -858,10 +857,12 @@
    * \param [in] cellId
    * \param [in] rnti
    * \param [in] report
+   * \todo The \c LteRrcSap::MeasurementReport argument should be
+   * changed to a const reference since the argument is large.
    */
   typedef void (* ReceiveReportTracedCallback)
-    (const uint64_t imsi, const uint16_t cellId, const uint16_t rnti,
-     const LteRrcSap::MeasurementReport report);
+    (uint64_t imsi, uint16_t cellId, uint16_t rnti,
+     LteRrcSap::MeasurementReport report);
   
 private:
 
diff -Naur ns-3.23/src/lte/model/lte-harq-phy.cc ns-3.24/src/lte/model/lte-harq-phy.cc
--- ns-3.23/src/lte/model/lte-harq-phy.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-harq-phy.cc	2015-09-15 11:18:44.000000000 -0700
@@ -56,7 +56,7 @@
   NS_LOG_FUNCTION (this);
 
   // left shift UL HARQ buffers
-  std::map <uint16_t, std::vector <HarqProcessInfoList_t> >:: iterator it;
+  std::map <uint16_t, std::vector <HarqProcessInfoList_t> >::iterator it;
   for (it = m_miUlHarqProcessesInfoMap.begin (); it != m_miUlHarqProcessesInfoMap.end (); it++)
     {
       (*it).second.erase ((*it).second.begin ());
diff -Naur ns-3.23/src/lte/model/lte-pdcp.h ns-3.24/src/lte/model/lte-pdcp.h
--- ns-3.23/src/lte/model/lte-pdcp.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-pdcp.h	2015-09-15 11:18:44.000000000 -0700
@@ -120,7 +120,7 @@
    * \param [in] size Packet size.
    */
   typedef void (* PduTxTracedCallback)
-    (const uint16_t rnti, const uint8_t lcid, const uint32_t size);
+    (uint16_t rnti, uint8_t lcid, uint32_t size);
 
   /**
    * TracedCallback signature for PDU receive event.
diff -Naur ns-3.23/src/lte/model/lte-phy.cc ns-3.24/src/lte/model/lte-phy.cc
--- ns-3.23/src/lte/model/lte-phy.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-phy.cc	2015-09-15 11:18:44.000000000 -0700
@@ -94,7 +94,7 @@
 
 
 Ptr<LteNetDevice>
-LtePhy::GetDevice ()
+LtePhy::GetDevice () const
 {
   NS_LOG_FUNCTION (this);
   return m_netDevice;
diff -Naur ns-3.23/src/lte/model/lte-phy.h ns-3.24/src/lte/model/lte-phy.h
--- ns-3.23/src/lte/model/lte-phy.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -78,7 +78,7 @@
    * \brief Get the device where the phy layer is attached
    * \return the pointer to the device
    */
-  Ptr<LteNetDevice> GetDevice ();
+  Ptr<LteNetDevice> GetDevice () const;
 
   /** 
    * 
diff -Naur ns-3.23/src/lte/model/lte-rlc.h ns-3.24/src/lte/model/lte-rlc.h
--- ns-3.23/src/lte/model/lte-rlc.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-rlc.h	2015-09-15 11:18:44.000000000 -0700
@@ -109,7 +109,7 @@
    * \param [in] bytes The number of bytes to transmit
    */
   typedef void (* NotifyTxTracedCallback)
-    (const uint16_t rnti, const uint8_t lcid, const uint32_t bytes);
+    (uint16_t rnti, uint8_t lcid, uint32_t bytes);
 
   /**
    * TracedCallback signature for
@@ -121,8 +121,7 @@
    * \param [in] delay Delay since sender timestamp, in ns.
    */
   typedef void (* ReceiveTracedCallback)
-    (const uint16_t rnti, const uint8_t lcid,
-     const uint32_t bytes, const uint64_t delay);
+    (uint16_t rnti, uint8_t lcid, uint32_t bytes, uint64_t delay);
 
   /// \todo MRE What is the sense to duplicate all the interfaces here???
   // NB to avoid the use of multiple inheritance
diff -Naur ns-3.23/src/lte/model/lte-spectrum-phy.cc ns-3.24/src/lte/model/lte-spectrum-phy.cc
--- ns-3.23/src/lte/model/lte-spectrum-phy.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-spectrum-phy.cc	2015-09-15 11:18:44.000000000 -0700
@@ -238,7 +238,7 @@
 
 
 Ptr<NetDevice>
-LteSpectrumPhy::GetDevice ()
+LteSpectrumPhy::GetDevice () const
 {
   NS_LOG_FUNCTION (this);
   return m_device;
@@ -1150,7 +1150,6 @@
   if (m_ctrlErrorModelEnabled)
     {
       double  errorRate = LteMiErrorModel::GetPcfichPdcchError (m_sinrPerceived);
-      errorRate = LteMiErrorModel::GetPcfichPdcchError (m_sinrPerceived);
       error = m_random->GetValue () > errorRate ? false : true;
       NS_LOG_DEBUG (this << " PCFICH-PDCCH Decodification, errorRate " << errorRate << " error " << error);
     }
diff -Naur ns-3.23/src/lte/model/lte-spectrum-phy.h ns-3.24/src/lte/model/lte-spectrum-phy.h
--- ns-3.23/src/lte/model/lte-spectrum-phy.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-spectrum-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -174,7 +174,7 @@
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
   Ptr<MobilityModel> GetMobility ();
-  Ptr<NetDevice> GetDevice ();
+  Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
   Ptr<AntennaModel> GetRxAntenna ();
   void StartRx (Ptr<SpectrumSignalParameters> params);
@@ -453,8 +453,8 @@
   TracedCallback<Ptr<const PacketBurst> > m_phyTxStartTrace;
   TracedCallback<Ptr<const PacketBurst> > m_phyTxEndTrace;
   TracedCallback<Ptr<const PacketBurst> > m_phyRxStartTrace;
-  TracedCallback<Ptr<const Packet> > m_phyRxEndOkTrace;
-  TracedCallback<Ptr<const Packet> > m_phyRxEndErrorTrace;
+  TracedCallback<Ptr<const Packet> >      m_phyRxEndOkTrace;
+  TracedCallback<Ptr<const Packet> >      m_phyRxEndErrorTrace;
 
   LtePhyRxDataEndErrorCallback   m_ltePhyRxDataEndErrorCallback;
   LtePhyRxDataEndOkCallback      m_ltePhyRxDataEndOkCallback;
diff -Naur ns-3.23/src/lte/model/lte-ue-phy.h ns-3.24/src/lte/model/lte-ue-phy.h
--- ns-3.23/src/lte/model/lte-ue-phy.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-ue-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -244,8 +244,7 @@
    * \param [in] newState
    */
   typedef void (* StateTracedCallback)
-    (const uint16_t cellId, const uint16_t rnti,
-     const State oldState, const State newState);
+    (uint16_t cellId, uint16_t rnti, State oldState, State newState);
 
   /**
    * TracedCallback signature for cell RSRP and SINR report.
@@ -256,8 +255,7 @@
    * \param [in] sinr
    */
   typedef void (* RsrpSinrTracedCallback)
-    (const uint16_t cellId, const uint16_t rnti,
-     const double rsrp, const double sinr);
+    (uint16_t cellId, uint16_t rnti, double rsrp, double sinr);
 
   /**
    * TracedCallback signature for cell RSRP and RSRQ.
@@ -269,8 +267,8 @@
    * \param [in] isServingCell
    */
   typedef void (* RsrpRsrqTracedCallback)
-    (const uint16_t rnti, const uint16_t cellId,
-     const double rsrp, const double rsrq, const bool isServingCell);
+    (uint16_t rnti, uint16_t cellId, double rsrp, double rsrq,
+     bool isServingCell);
 
 private:
 
diff -Naur ns-3.23/src/lte/model/lte-ue-power-control.h ns-3.24/src/lte/model/lte-ue-power-control.h
--- ns-3.23/src/lte/model/lte-ue-power-control.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-ue-power-control.h	2015-09-15 11:18:44.000000000 -0700
@@ -95,7 +95,7 @@
    * \param [in] power The current TX power.
    */
   typedef void (* TxPowerTracedCallback)
-    (const uint16_t cellId, const uint16_t rnti, const double power);
+    (uint16_t cellId, uint16_t rnti, double power);
 
 private:
   void SetSubChannelMask (std::vector <int> mask);
diff -Naur ns-3.23/src/lte/model/lte-ue-rrc.h ns-3.24/src/lte/model/lte-ue-rrc.h
--- ns-3.23/src/lte/model/lte-ue-rrc.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/lte-ue-rrc.h	2015-09-15 11:18:44.000000000 -0700
@@ -254,7 +254,7 @@
    * \param [in] cellId
    */
   typedef void (* CellSelectionTracedCallback)
-    (const uint64_t imsi, const uint16_t cellId);
+    (uint64_t imsi, uint16_t cellId);
 
   /**
    * TracedCallback signature for imsi, cellId and rnti events.
@@ -264,7 +264,7 @@
    * \param [in] rnti
    */
   typedef void (* ImsiCidRntiTracedCallback)
-    (const uint64_t imsi, const uint16_t cellId, const uint16_t rnti);
+    (uint64_t imsi, uint16_t cellId, uint16_t rnti);
 
   /**
    * TracedCallback signature for MIBRecieved, Sib1Received and
@@ -276,8 +276,7 @@
    * \param [in] otherCid
    */
   typedef void (* MibSibHandoverTracedCallback)
-    (const uint64_t imsi, const uint16_t cellId, const uint16_t rnti,
-     const uint16_t otherCid);
+    (uint64_t imsi, uint16_t cellId, uint16_t rnti, uint16_t otherCid);
 
   /**
    * TracedCallback signature for state transition events.
@@ -289,8 +288,8 @@
    * \param [in] newState
    */
   typedef void (* StateTracedCallback)
-    (const uint64_t imsi, const uint16_t cellId, const uint16_t rnti,
-     const State oldState, const State newState);
+    (uint64_t imsi, uint16_t cellId, uint16_t rnti,
+     State oldState, State newState);
 
 
 private:
diff -Naur ns-3.23/src/lte/model/rem-spectrum-phy.cc ns-3.24/src/lte/model/rem-spectrum-phy.cc
--- ns-3.23/src/lte/model/rem-spectrum-phy.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/rem-spectrum-phy.cc	2015-09-15 11:18:44.000000000 -0700
@@ -103,7 +103,7 @@
 }
 
 Ptr<NetDevice>
-RemSpectrumPhy::GetDevice ()
+RemSpectrumPhy::GetDevice () const
 {
   return 0;
 }
diff -Naur ns-3.23/src/lte/model/rem-spectrum-phy.h ns-3.24/src/lte/model/rem-spectrum-phy.h
--- ns-3.23/src/lte/model/rem-spectrum-phy.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/model/rem-spectrum-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -64,7 +64,7 @@
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
   Ptr<MobilityModel> GetMobility ();
-  Ptr<NetDevice> GetDevice ();
+  Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
   Ptr<AntennaModel> GetRxAntenna ();
   void StartRx (Ptr<SpectrumSignalParameters> params);
diff -Naur ns-3.23/src/lte/test/lte-ffr-simple.h ns-3.24/src/lte/test/lte-ffr-simple.h
--- ns-3.23/src/lte/test/lte-ffr-simple.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/test/lte-ffr-simple.h	2015-09-15 11:18:44.000000000 -0700
@@ -68,6 +68,14 @@
   friend class MemberLteFfrSapProvider<LteFfrSimple>;
   friend class MemberLteFfrRrcSapProvider<LteFfrSimple>;
 
+  /**
+   * TracedCallback signature for change of PdschConfigDedicated.
+   *
+   * \param [in] rnti
+   * \param [in] pdschPa PdschConfiDedicated.pa
+   */
+  typedef void (* PdschTracedCallback)(uint16_t rnti, uint8_t pdschPa);
+
 protected:
   // inherited from Object
   virtual void DoInitialize ();
@@ -120,8 +128,6 @@
 
   LteRrcSap::PdschConfigDedicated m_pdschConfigDedicated;
 
-  typedef void (* PdschTracedCallback)(uint16_t, uint8_t);
-
   TracedCallback<uint16_t, uint8_t> m_changePdschConfigDedicatedTrace;
 
 
diff -Naur ns-3.23/src/lte/test/lte-simple-spectrum-phy.cc ns-3.24/src/lte/test/lte-simple-spectrum-phy.cc
--- ns-3.23/src/lte/test/lte-simple-spectrum-phy.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/test/lte-simple-spectrum-phy.cc	2015-09-15 11:18:44.000000000 -0700
@@ -73,7 +73,7 @@
 
 
 Ptr<NetDevice>
-LteSimpleSpectrumPhy::GetDevice ()
+LteSimpleSpectrumPhy::GetDevice () const
 {
   NS_LOG_FUNCTION (this);
   return m_device;
diff -Naur ns-3.23/src/lte/test/lte-simple-spectrum-phy.h ns-3.24/src/lte/test/lte-simple-spectrum-phy.h
--- ns-3.23/src/lte/test/lte-simple-spectrum-phy.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/test/lte-simple-spectrum-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -60,7 +60,7 @@
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
   Ptr<MobilityModel> GetMobility ();
-  Ptr<NetDevice> GetDevice ();
+  Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
   Ptr<AntennaModel> GetRxAntenna ();
   void StartRx (Ptr<SpectrumSignalParameters> params);
diff -Naur ns-3.23/src/lte/test/lte-test-deactivate-bearer.cc ns-3.24/src/lte/test/lte-test-deactivate-bearer.cc
--- ns-3.23/src/lte/test/lte-test-deactivate-bearer.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/test/lte-test-deactivate-bearer.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,347 +1,347 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (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:Gaurav Sathe <gaurav.sathe@tcs.com>
- */
-
-#include <iostream>
-#include <sstream>
-#include <string>
-
-#include <ns3/object.h>
-#include <ns3/spectrum-interference.h>
-#include <ns3/spectrum-error-model.h>
-#include <ns3/log.h>
-#include <ns3/test.h>
-#include <ns3/simulator.h>
-#include <ns3/packet.h>
-#include <ns3/ptr.h>
-#include "ns3/radio-bearer-stats-calculator.h"
-#include <ns3/constant-position-mobility-model.h>
-#include <ns3/eps-bearer.h>
-#include <ns3/node-container.h>
-#include <ns3/mobility-helper.h>
-#include <ns3/net-device-container.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-ue-rrc.h>
-#include <ns3/lte-helper.h>
-#include "ns3/string.h"
-#include "ns3/double.h"
-#include <ns3/lte-enb-phy.h>
-#include <ns3/lte-ue-phy.h>
-#include <ns3/boolean.h>
-#include <ns3/enum.h>
-
-#include "ns3/point-to-point-epc-helper.h"
-#include "ns3/network-module.h"
-#include "ns3/ipv4-global-routing-helper.h"
-#include "ns3/internet-module.h"
-#include "ns3/applications-module.h"
-#include "ns3/point-to-point-helper.h"
-
-#include "lte-test-deactivate-bearer.h"
-
-NS_LOG_COMPONENT_DEFINE ("LenaTestDeactivateBearer");
-
-namespace ns3 {
-
-LenaTestBearerDeactivateSuite::LenaTestBearerDeactivateSuite ()
-  : TestSuite ("lte-test-deactivate-bearer", SYSTEM)
-{
-  NS_LOG_INFO ("creating LenaTestPssFfMacSchedulerSuite");
-
-  bool errorModel = false;
-
-  // Test Case: homogeneous flow test in PSS (different distance)
-  // Traffic1 info
-  //   UDP traffic: payload size = 100 bytes, interval = 1 ms
-  //   UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000 byte/sec -> 132000 byte/rate
-  // Maximum throughput = 3 / ( 1/2196000 + 1/1191000 + 1/1383000) = 1486569 byte/s
-  // 132000 * 3 = 396000 < 1209046 -> estimated throughput in downlink = 132000 byte/sec
-  std::vector<uint16_t> dist_1;
-
-  dist_1.push_back (0);       // User 0 distance --> MCS 28
-  dist_1.push_back (0);    // User 1 distance --> MCS 22
-  dist_1.push_back (0);    // User 2 distance --> MCS 20
-
-  std::vector<uint16_t> packetSize_1;
-
-  packetSize_1.push_back (100); //1
-  packetSize_1.push_back (100); //2
-  packetSize_1.push_back (100); //3
-
-  std::vector<uint32_t> estThrPssDl_1;
-
-  estThrPssDl_1.push_back (132000); // User 0 estimated TTI throughput from PSS
-  estThrPssDl_1.push_back (132000); // User 1 estimated TTI throughput from PSS
-  estThrPssDl_1.push_back (132000); // User 2 estimated TTI throughput from PSS
-
-  AddTestCase (new LenaDeactivateBearerTestCase (dist_1,estThrPssDl_1,packetSize_1,1,errorModel,true), TestCase::QUICK);
-}
-
-static LenaTestBearerDeactivateSuite lenaTestBearerDeactivateSuite;
-
-
-std::string
-LenaDeactivateBearerTestCase::BuildNameString (uint16_t nUser, std::vector<uint16_t> dist)
-{
-  std::ostringstream oss;
-  oss << "distances (m) = [ ";
-  for (std::vector<uint16_t>::iterator it = dist.begin (); it != dist.end (); ++it)
-    {
-      oss << *it << " ";
-    }
-  oss << "]";
-  return oss.str ();
-}
-
-LenaDeactivateBearerTestCase::LenaDeactivateBearerTestCase (std::vector<uint16_t> dist, std::vector<uint32_t> estThrPssDl, std::vector<uint16_t> packetSize, uint16_t interval,bool errorModelEnabled, bool useIdealRrc)
-  : TestCase (BuildNameString (dist.size (), dist)),
-    m_nUser (dist.size ()),
-    m_dist (dist),
-    m_packetSize (packetSize),
-    m_interval (interval),
-    m_estThrPssDl (estThrPssDl),
-    m_errorModelEnabled (errorModelEnabled)
-{
-}
-
-LenaDeactivateBearerTestCase::~LenaDeactivateBearerTestCase ()
-{
-}
-
-void
-LenaDeactivateBearerTestCase::DoRun (void)
-{
-  if (!m_errorModelEnabled)
-    {
-      Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
-      Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
-    }
-
-  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
-
-
-  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
-  lteHelper->SetEpcHelper (epcHelper);
-
-  Ptr<Node> pgw = epcHelper->GetPgwNode ();
-
-  // Create a single RemoteHost
-  NodeContainer remoteHostContainer;
-  remoteHostContainer.Create (1);
-  Ptr<Node> remoteHost = remoteHostContainer.Get (0);
-  InternetStackHelper internet;
-  internet.Install (remoteHostContainer);
-
-  // Create the Internet
-  PointToPointHelper p2ph;
-  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
-  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500));
-  p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.001)));
-  NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
-  Ipv4AddressHelper ipv4h;
-  ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
-  Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
-  // interface 0 is localhost, 1 is the p2p device
-  Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress (1);
-
-  Ipv4StaticRoutingHelper ipv4RoutingHelper;
-  Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
-  remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
-
-  // LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
-
-  // LogComponentEnable ("LenaTestDeactivateBearer", LOG_LEVEL_ALL);
-  // LogComponentEnable ("LteHelper", logLevel);
-  // LogComponentEnable ("EpcHelper", logLevel);
-  // LogComponentEnable ("EpcEnbApplication", logLevel);
-  // LogComponentEnable ("EpcSgwPgwApplication", logLevel);
-  // LogComponentEnable ("EpcMme", logLevel);
-  // LogComponentEnable ("LteEnbRrc", logLevel);
-
-  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
-
-  // Create Nodes: eNodeB and UE
-  NodeContainer enbNodes;
-  NodeContainer ueNodes;
-  enbNodes.Create (1);
-  ueNodes.Create (m_nUser);
-
-  // Install Mobility Model
-  MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
-  mobility.Install (enbNodes);
-  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
-  mobility.Install (ueNodes);
-
-  // Create Devices and install them in the Nodes (eNB and UE)
-  NetDeviceContainer enbDevs;
-  NetDeviceContainer ueDevs;
-  lteHelper->SetSchedulerType ("ns3::PssFfMacScheduler");
-  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
-  ueDevs = lteHelper->InstallUeDevice (ueNodes);
-
-  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
-  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
-  enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
-  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
-
-  // Set UEs' position and power
-  for (int i = 0; i < m_nUser; i++)
-    {
-      Ptr<ConstantPositionMobilityModel> mm = ueNodes.Get (i)->GetObject<ConstantPositionMobilityModel> ();
-      mm->SetPosition (Vector (m_dist.at (i), 0.0, 0.0));
-      Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
-      Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
-      uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
-      uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
-    }
-
-  // Install the IP stack on the UEs
-  internet.Install (ueNodes);
-  Ipv4InterfaceContainer ueIpIface;
-  ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueDevs));
-
-  // Assign IP address to UEs
-  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
-    {
-      Ptr<Node> ueNode = ueNodes.Get (u);
-      // Set the default gateway for the UE
-      Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
-      ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
-    }
-
-  // Attach a UE to a eNB
-  lteHelper->Attach (ueDevs, enbDevs.Get (0));
-
-  // Activate an EPS bearer on all UEs
-
-  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
-    {
-      Ptr<NetDevice> ueDevice = ueDevs.Get (u);
-      GbrQosInformation qos;
-      qos.gbrDl = (m_packetSize.at (u) + 32) * (1000 / m_interval) * 8;  // bit/s, considering IP, UDP, RLC, PDCP header size
-      qos.gbrUl = (m_packetSize.at (u) + 32) * (1000 / m_interval) * 8;
-      qos.mbrDl = qos.gbrDl;
-      qos.mbrUl = qos.gbrUl;
-
-      enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
-      EpsBearer bearer (q, qos);
-      bearer.arp.priorityLevel = 15 - (u + 1);
-      bearer.arp.preemptionCapability = true;
-      bearer.arp.preemptionVulnerability = true;
-      lteHelper->ActivateDedicatedEpsBearer (ueDevice, bearer, EpcTft::Default ());
-    }
-
-
-  // Install downlink and uplink applications
-  uint16_t dlPort = 1234;
-  uint16_t ulPort = 2000;
-  PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), dlPort));
-  PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), ulPort));
-  ApplicationContainer clientApps;
-  ApplicationContainer serverApps;
-  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
-    {
-      ++ulPort;
-      serverApps.Add (dlPacketSinkHelper.Install (ueNodes.Get (u))); // receive packets from remotehost
-      serverApps.Add (ulPacketSinkHelper.Install (remoteHost));  // receive packets from UEs
-
-      UdpClientHelper dlClient (ueIpIface.GetAddress (u), dlPort); // uplink packets generator
-      dlClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
-      dlClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
-      dlClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize.at (u)));
-
-      UdpClientHelper ulClient (remoteHostAddr, ulPort);           // downlink packets generator
-      ulClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
-      ulClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
-      ulClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize.at (u)));
-
-      clientApps.Add (dlClient.Install (remoteHost));
-      clientApps.Add (ulClient.Install (ueNodes.Get (u)));
-    }
-
-
-  serverApps.Start (Seconds (0.030));
-  clientApps.Start (Seconds (0.030));
-
-  double statsStartTime = 0.04; // need to allow for RRC connection establishment + SRS
-  double statsDuration = 1.0;
-  double tolerance = 0.1;
-
-  lteHelper->EnableRlcTraces ();
-  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
-  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
-  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
-
-
-  //get ue device pointer for UE-ID 0 IMSI 1 and enb device pointer
-  Ptr<NetDevice> ueDevice = ueDevs.Get (0);
-  Ptr<NetDevice> enbDevice = enbDevs.Get (0);
-
-  /*
-   *   Instantiate De-activation using Simulator::Schedule() method which will initiate bearer de-activation after deActivateTime
-   *   Instantiate De-activation in sequence (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3)
-   */
-  Time deActivateTime (Seconds (1.5));
-  Simulator::Schedule (deActivateTime, &LteHelper::DeActivateDedicatedEpsBearer, lteHelper, ueDevice, enbDevice, 2);
-
-  //stop simulation after 3 seconds
-  Simulator::Stop (Seconds (3.0));
-
-  Simulator::Run ();
-
-  NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s)");
-  std::vector <uint64_t> dlDataRxed;
-  std::vector <uint64_t> dlDataTxed;
-  for (int i = 0; i < m_nUser; i++)
-    {
-      // get the imsi
-      uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
-      // get the lcId
-      // lcId is hard-coded, since only one dedicated bearer is added
-      uint8_t lcId = 4;
-      dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
-      dlDataTxed.push_back (rlcStats->GetDlTxData (imsi, lcId));
-      NS_LOG_INFO ("\tUser " << i << " dist " << m_dist.at (i) << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at (i) << "  thr " << (double)dlDataRxed.at (i) / statsDuration << " ref " << m_estThrPssDl.at (i));
-      NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes txed " << (double)dlDataTxed.at (i) << "  thr " << (double)dlDataTxed.at (i) / statsDuration);
-    }
-
-  for (int i = 0; i < m_nUser; i++)
-    {
-      uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
-
-      /*
-       * For UE ID-0 IMSI 1, LCID=4 is deactivated hence If traffic seen on it, test case should fail
-       * Else For other UE's, test case should validate throughput
-       */
-      if (imsi == 1)
-        {
-          NS_TEST_ASSERT_MSG_EQ ((double)dlDataTxed.at (i), 0, "Invalid LCID in Statistics ");
-        }
-      else
-        {
-          NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataTxed.at (i) / statsDuration, m_estThrPssDl.at (i), m_estThrPssDl.at (i) * tolerance, " Unfair Throughput!");
-        }
-    }
-
-  Simulator::Destroy ();
-}
-}
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (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:Gaurav Sathe <gaurav.sathe@tcs.com>
+ */
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+#include <ns3/object.h>
+#include <ns3/spectrum-interference.h>
+#include <ns3/spectrum-error-model.h>
+#include <ns3/log.h>
+#include <ns3/test.h>
+#include <ns3/simulator.h>
+#include <ns3/packet.h>
+#include <ns3/ptr.h>
+#include "ns3/radio-bearer-stats-calculator.h"
+#include <ns3/constant-position-mobility-model.h>
+#include <ns3/eps-bearer.h>
+#include <ns3/node-container.h>
+#include <ns3/mobility-helper.h>
+#include <ns3/net-device-container.h>
+#include <ns3/lte-ue-net-device.h>
+#include <ns3/lte-enb-net-device.h>
+#include <ns3/lte-ue-rrc.h>
+#include <ns3/lte-helper.h>
+#include "ns3/string.h"
+#include "ns3/double.h"
+#include <ns3/lte-enb-phy.h>
+#include <ns3/lte-ue-phy.h>
+#include <ns3/boolean.h>
+#include <ns3/enum.h>
+
+#include "ns3/point-to-point-epc-helper.h"
+#include "ns3/network-module.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/internet-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/point-to-point-helper.h"
+
+#include "lte-test-deactivate-bearer.h"
+
+NS_LOG_COMPONENT_DEFINE ("LenaTestDeactivateBearer");
+
+namespace ns3 {
+
+LenaTestBearerDeactivateSuite::LenaTestBearerDeactivateSuite ()
+  : TestSuite ("lte-test-deactivate-bearer", SYSTEM)
+{
+  NS_LOG_INFO ("creating LenaTestPssFfMacSchedulerSuite");
+
+  bool errorModel = false;
+
+  // Test Case: homogeneous flow test in PSS (different distance)
+  // Traffic1 info
+  //   UDP traffic: payload size = 100 bytes, interval = 1 ms
+  //   UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000 byte/sec -> 132000 byte/rate
+  // Maximum throughput = 3 / ( 1/2196000 + 1/1191000 + 1/1383000) = 1486569 byte/s
+  // 132000 * 3 = 396000 < 1209046 -> estimated throughput in downlink = 132000 byte/sec
+  std::vector<uint16_t> dist_1;
+
+  dist_1.push_back (0);       // User 0 distance --> MCS 28
+  dist_1.push_back (0);    // User 1 distance --> MCS 22
+  dist_1.push_back (0);    // User 2 distance --> MCS 20
+
+  std::vector<uint16_t> packetSize_1;
+
+  packetSize_1.push_back (100); //1
+  packetSize_1.push_back (100); //2
+  packetSize_1.push_back (100); //3
+
+  std::vector<uint32_t> estThrPssDl_1;
+
+  estThrPssDl_1.push_back (132000); // User 0 estimated TTI throughput from PSS
+  estThrPssDl_1.push_back (132000); // User 1 estimated TTI throughput from PSS
+  estThrPssDl_1.push_back (132000); // User 2 estimated TTI throughput from PSS
+
+  AddTestCase (new LenaDeactivateBearerTestCase (dist_1,estThrPssDl_1,packetSize_1,1,errorModel,true), TestCase::QUICK);
+}
+
+static LenaTestBearerDeactivateSuite lenaTestBearerDeactivateSuite;
+
+
+std::string
+LenaDeactivateBearerTestCase::BuildNameString (uint16_t nUser, std::vector<uint16_t> dist)
+{
+  std::ostringstream oss;
+  oss << "distances (m) = [ ";
+  for (std::vector<uint16_t>::iterator it = dist.begin (); it != dist.end (); ++it)
+    {
+      oss << *it << " ";
+    }
+  oss << "]";
+  return oss.str ();
+}
+
+LenaDeactivateBearerTestCase::LenaDeactivateBearerTestCase (std::vector<uint16_t> dist, std::vector<uint32_t> estThrPssDl, std::vector<uint16_t> packetSize, uint16_t interval,bool errorModelEnabled, bool useIdealRrc)
+  : TestCase (BuildNameString (dist.size (), dist)),
+    m_nUser (dist.size ()),
+    m_dist (dist),
+    m_packetSize (packetSize),
+    m_interval (interval),
+    m_estThrPssDl (estThrPssDl),
+    m_errorModelEnabled (errorModelEnabled)
+{
+}
+
+LenaDeactivateBearerTestCase::~LenaDeactivateBearerTestCase ()
+{
+}
+
+void
+LenaDeactivateBearerTestCase::DoRun (void)
+{
+  if (!m_errorModelEnabled)
+    {
+      Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
+      Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
+    }
+
+  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
+
+
+  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+  Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
+  lteHelper->SetEpcHelper (epcHelper);
+
+  Ptr<Node> pgw = epcHelper->GetPgwNode ();
+
+  // Create a single RemoteHost
+  NodeContainer remoteHostContainer;
+  remoteHostContainer.Create (1);
+  Ptr<Node> remoteHost = remoteHostContainer.Get (0);
+  InternetStackHelper internet;
+  internet.Install (remoteHostContainer);
+
+  // Create the Internet
+  PointToPointHelper p2ph;
+  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
+  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500));
+  p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.001)));
+  NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
+  Ipv4AddressHelper ipv4h;
+  ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
+  Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
+  // interface 0 is localhost, 1 is the p2p device
+  Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress (1);
+
+  Ipv4StaticRoutingHelper ipv4RoutingHelper;
+  Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
+  remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
+
+  // LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
+
+  // LogComponentEnable ("LenaTestDeactivateBearer", LOG_LEVEL_ALL);
+  // LogComponentEnable ("LteHelper", logLevel);
+  // LogComponentEnable ("EpcHelper", logLevel);
+  // LogComponentEnable ("EpcEnbApplication", logLevel);
+  // LogComponentEnable ("EpcSgwPgwApplication", logLevel);
+  // LogComponentEnable ("EpcMme", logLevel);
+  // LogComponentEnable ("LteEnbRrc", logLevel);
+
+  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
+
+  // Create Nodes: eNodeB and UE
+  NodeContainer enbNodes;
+  NodeContainer ueNodes;
+  enbNodes.Create (1);
+  ueNodes.Create (m_nUser);
+
+  // Install Mobility Model
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (enbNodes);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (ueNodes);
+
+  // Create Devices and install them in the Nodes (eNB and UE)
+  NetDeviceContainer enbDevs;
+  NetDeviceContainer ueDevs;
+  lteHelper->SetSchedulerType ("ns3::PssFfMacScheduler");
+  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
+  ueDevs = lteHelper->InstallUeDevice (ueNodes);
+
+  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
+  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
+  enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
+  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
+
+  // Set UEs' position and power
+  for (int i = 0; i < m_nUser; i++)
+    {
+      Ptr<ConstantPositionMobilityModel> mm = ueNodes.Get (i)->GetObject<ConstantPositionMobilityModel> ();
+      mm->SetPosition (Vector (m_dist.at (i), 0.0, 0.0));
+      Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
+      Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
+      uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
+      uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
+    }
+
+  // Install the IP stack on the UEs
+  internet.Install (ueNodes);
+  Ipv4InterfaceContainer ueIpIface;
+  ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueDevs));
+
+  // Assign IP address to UEs
+  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
+    {
+      Ptr<Node> ueNode = ueNodes.Get (u);
+      // Set the default gateway for the UE
+      Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
+      ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
+    }
+
+  // Attach a UE to a eNB
+  lteHelper->Attach (ueDevs, enbDevs.Get (0));
+
+  // Activate an EPS bearer on all UEs
+
+  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
+    {
+      Ptr<NetDevice> ueDevice = ueDevs.Get (u);
+      GbrQosInformation qos;
+      qos.gbrDl = (m_packetSize.at (u) + 32) * (1000 / m_interval) * 8;  // bit/s, considering IP, UDP, RLC, PDCP header size
+      qos.gbrUl = (m_packetSize.at (u) + 32) * (1000 / m_interval) * 8;
+      qos.mbrDl = qos.gbrDl;
+      qos.mbrUl = qos.gbrUl;
+
+      enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
+      EpsBearer bearer (q, qos);
+      bearer.arp.priorityLevel = 15 - (u + 1);
+      bearer.arp.preemptionCapability = true;
+      bearer.arp.preemptionVulnerability = true;
+      lteHelper->ActivateDedicatedEpsBearer (ueDevice, bearer, EpcTft::Default ());
+    }
+
+
+  // Install downlink and uplink applications
+  uint16_t dlPort = 1234;
+  uint16_t ulPort = 2000;
+  PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), dlPort));
+  PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), ulPort));
+  ApplicationContainer clientApps;
+  ApplicationContainer serverApps;
+  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
+    {
+      ++ulPort;
+      serverApps.Add (dlPacketSinkHelper.Install (ueNodes.Get (u))); // receive packets from remotehost
+      serverApps.Add (ulPacketSinkHelper.Install (remoteHost));  // receive packets from UEs
+
+      UdpClientHelper dlClient (ueIpIface.GetAddress (u), dlPort); // uplink packets generator
+      dlClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
+      dlClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
+      dlClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize.at (u)));
+
+      UdpClientHelper ulClient (remoteHostAddr, ulPort);           // downlink packets generator
+      ulClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
+      ulClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
+      ulClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize.at (u)));
+
+      clientApps.Add (dlClient.Install (remoteHost));
+      clientApps.Add (ulClient.Install (ueNodes.Get (u)));
+    }
+
+
+  serverApps.Start (Seconds (0.030));
+  clientApps.Start (Seconds (0.030));
+
+  double statsStartTime = 0.04; // need to allow for RRC connection establishment + SRS
+  double statsDuration = 1.0;
+  double tolerance = 0.1;
+
+  lteHelper->EnableRlcTraces ();
+  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
+  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
+  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
+
+
+  //get ue device pointer for UE-ID 0 IMSI 1 and enb device pointer
+  Ptr<NetDevice> ueDevice = ueDevs.Get (0);
+  Ptr<NetDevice> enbDevice = enbDevs.Get (0);
+
+  /*
+   *   Instantiate De-activation using Simulator::Schedule() method which will initiate bearer de-activation after deActivateTime
+   *   Instantiate De-activation in sequence (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3)
+   */
+  Time deActivateTime (Seconds (1.5));
+  Simulator::Schedule (deActivateTime, &LteHelper::DeActivateDedicatedEpsBearer, lteHelper, ueDevice, enbDevice, 2);
+
+  //stop simulation after 3 seconds
+  Simulator::Stop (Seconds (3.0));
+
+  Simulator::Run ();
+
+  NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s)");
+  std::vector <uint64_t> dlDataRxed;
+  std::vector <uint64_t> dlDataTxed;
+  for (int i = 0; i < m_nUser; i++)
+    {
+      // get the imsi
+      uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
+      // get the lcId
+      // lcId is hard-coded, since only one dedicated bearer is added
+      uint8_t lcId = 4;
+      dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
+      dlDataTxed.push_back (rlcStats->GetDlTxData (imsi, lcId));
+      NS_LOG_INFO ("\tUser " << i << " dist " << m_dist.at (i) << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at (i) << "  thr " << (double)dlDataRxed.at (i) / statsDuration << " ref " << m_estThrPssDl.at (i));
+      NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes txed " << (double)dlDataTxed.at (i) << "  thr " << (double)dlDataTxed.at (i) / statsDuration);
+    }
+
+  for (int i = 0; i < m_nUser; i++)
+    {
+      uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
+
+      /*
+       * For UE ID-0 IMSI 1, LCID=4 is deactivated hence If traffic seen on it, test case should fail
+       * Else For other UE's, test case should validate throughput
+       */
+      if (imsi == 1)
+        {
+          NS_TEST_ASSERT_MSG_EQ ((double)dlDataTxed.at (i), 0, "Invalid LCID in Statistics ");
+        }
+      else
+        {
+          NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataTxed.at (i) / statsDuration, m_estThrPssDl.at (i), m_estThrPssDl.at (i) * tolerance, " Unfair Throughput!");
+        }
+    }
+
+  Simulator::Destroy ();
+}
+}
diff -Naur ns-3.23/src/lte/test/lte-test-deactivate-bearer.h ns-3.24/src/lte/test/lte-test-deactivate-bearer.h
--- ns-3.23/src/lte/test/lte-test-deactivate-bearer.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/lte/test/lte-test-deactivate-bearer.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,37 +1,39 @@
-#ifndef LENA_TEST_DEACTIVATE_BEARER_H
-#define LENA_TEST_DEACTIVATE_BEARER_H
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 
-#include "ns3/simulator.h"
-#include "ns3/test.h"
-
-
-namespace ns3 {
-
-class LenaDeactivateBearerTestCase : public TestCase
-{
-public:
-  LenaDeactivateBearerTestCase (std::vector<uint16_t> dist, std::vector<uint32_t> estThrPssDl, std::vector<uint16_t> packetSize, uint16_t interval, bool  errorModelEnabled, bool useIdealRrc);
-  virtual ~LenaDeactivateBearerTestCase ();
-
-private:
-  static std::string BuildNameString (uint16_t nUser, std::vector<uint16_t> dist);
-  virtual void DoRun (void);
-  uint16_t m_nUser;
-  std::vector<uint16_t> m_dist;
-  std::vector<uint16_t> m_packetSize;  // byte
-  uint16_t m_interval;    // ms
-  std::vector<uint32_t> m_estThrPssDl;
-  bool m_errorModelEnabled;
-};
-
-
-
-class LenaTestBearerDeactivateSuite : public TestSuite
-{
-public:
-  LenaTestBearerDeactivateSuite ();
-};
-
-} // namespace ns3
-
-#endif
+#ifndef LENA_TEST_DEACTIVATE_BEARER_H
+#define LENA_TEST_DEACTIVATE_BEARER_H
+
+#include "ns3/simulator.h"
+#include "ns3/test.h"
+
+
+namespace ns3 {
+
+class LenaDeactivateBearerTestCase : public TestCase
+{
+public:
+  LenaDeactivateBearerTestCase (std::vector<uint16_t> dist, std::vector<uint32_t> estThrPssDl, std::vector<uint16_t> packetSize, uint16_t interval, bool  errorModelEnabled, bool useIdealRrc);
+  virtual ~LenaDeactivateBearerTestCase ();
+
+private:
+  static std::string BuildNameString (uint16_t nUser, std::vector<uint16_t> dist);
+  virtual void DoRun (void);
+  uint16_t m_nUser;
+  std::vector<uint16_t> m_dist;
+  std::vector<uint16_t> m_packetSize;  // byte
+  uint16_t m_interval;    // ms
+  std::vector<uint32_t> m_estThrPssDl;
+  bool m_errorModelEnabled;
+};
+
+
+
+class LenaTestBearerDeactivateSuite : public TestSuite
+{
+public:
+  LenaTestBearerDeactivateSuite ();
+};
+
+} // namespace ns3
+
+#endif
diff -Naur ns-3.23/src/lte/test/test-asn1-encoding.cc ns-3.24/src/lte/test/test-asn1-encoding.cc
--- ns-3.23/src/lte/test/test-asn1-encoding.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/lte/test/test-asn1-encoding.cc	2015-09-15 11:18:44.000000000 -0700
@@ -100,12 +100,12 @@
   Ptr<Packet> packet;
 };
 
-RrcHeaderTestCase :: RrcHeaderTestCase (std::string s) : TestCase (s)
+RrcHeaderTestCase::RrcHeaderTestCase (std::string s) : TestCase (s)
 {
 }
 
 LteRrcSap::RadioResourceConfigDedicated
-RrcHeaderTestCase :: CreateRadioResourceConfigDedicated ()
+RrcHeaderTestCase::CreateRadioResourceConfigDedicated ()
 {
   LteRrcSap::RadioResourceConfigDedicated rrd;
 
@@ -159,7 +159,7 @@
 }
 
 void
-RrcHeaderTestCase :: AssertEqualRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated rrcd1, LteRrcSap::RadioResourceConfigDedicated rrcd2)
+RrcHeaderTestCase::AssertEqualRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated rrcd1, LteRrcSap::RadioResourceConfigDedicated rrcd2)
 {
   NS_TEST_ASSERT_MSG_EQ (rrcd1.srbToAddModList.size (), rrcd2.srbToAddModList.size (),"SrbToAddModList different sizes");
 
diff -Naur ns-3.23/src/mesh/bindings/modulegen__gcc_ILP32.py ns-3.24/src/mesh/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/mesh/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -23,11 +23,11 @@
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
     module.add_enum('WifiMacType', ['WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_CTLWRAPPER', '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-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'], import_from_module='ns.wifi')
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT'], import_from_module='ns.wifi')
     ## wifi-phy-standard.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_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211ac'], import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
     module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
     ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
@@ -135,7 +135,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
@@ -186,6 +186,10 @@
     module.add_class('int64x64_t', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
     module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo [struct]
+    module.add_class('mpduInfo', import_from_module='ns.wifi')
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm [struct]
+    module.add_class('signalNoiseDbm', import_from_module='ns.wifi')
     ## chunk.h (module 'network'): ns3::Chunk [class]
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
@@ -390,6 +394,12 @@
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## uinteger.h (module 'core'): ns3::UintegerValue [class]
     module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities [class]
+    module.add_class('VhtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker [class]
+    module.add_class('VhtCapabilitiesChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue [class]
+    module.add_class('VhtCapabilitiesValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker [class]
     module.add_class('WifiModeChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue [class]
@@ -411,23 +421,16 @@
     ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac [class]
     module.add_class('MeshWifiInterfaceMac', parent=root_module['ns3::RegularWifiMac'])
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type=u'vector')
-    module.add_container('ns3::WifiMcsList', 'unsigned char', container_type=u'vector')
     module.add_container('std::vector< ns3::Ptr< ns3::NetDevice > >', 'ns3::Ptr< ns3::NetDevice >', container_type=u'vector')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >', u'ns3::WifiMcsList')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >*', u'ns3::WifiMcsList*')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >&', u'ns3::WifiMcsList&')
     typehandlers.add_type_alias(u'uint8_t', u'ns3::WifiInformationElementId')
     typehandlers.add_type_alias(u'uint8_t*', u'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias(u'uint8_t&', u'ns3::WifiInformationElementId&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >', u'ns3::WifiModeList')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >*', u'ns3::WifiModeList*')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >&', u'ns3::WifiModeList&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', u'ns3::WifiMcsListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', u'ns3::WifiMcsListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', u'ns3::WifiMcsListIterator&')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -441,6 +444,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace dot11s
     
     nested_module = module.add_cpp_namespace('dot11s')
@@ -493,6 +502,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_dot11s(module):
     root_module = module.get_root()
     
@@ -554,10 +594,18 @@
     module.add_class('PeerLink', parent=root_module['ns3::Object'])
     ## peer-link.h (module 'mesh'): ns3::dot11s::PeerLink::PeerState [enumeration]
     module.add_enum('PeerState', ['IDLE', 'OPN_SNT', 'CNF_RCVD', 'OPN_RCVD', 'ESTAB', 'HOLDING'], outer_class=root_module['ns3::dot11s::PeerLink'])
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart [class]
-    module.add_class('PeerLinkFrameStart', parent=root_module['ns3::Header'])
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields [struct]
-    module.add_class('PlinkFrameStartFields', outer_class=root_module['ns3::dot11s::PeerLinkFrameStart'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart [class]
+    module.add_class('PeerLinkCloseStart', parent=root_module['ns3::Header'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields [struct]
+    module.add_class('PlinkCloseStartFields', outer_class=root_module['ns3::dot11s::PeerLinkCloseStart'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart [class]
+    module.add_class('PeerLinkConfirmStart', parent=root_module['ns3::Header'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields [struct]
+    module.add_class('PlinkConfirmStartFields', outer_class=root_module['ns3::dot11s::PeerLinkConfirmStart'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart [class]
+    module.add_class('PeerLinkOpenStart', parent=root_module['ns3::Header'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields [struct]
+    module.add_class('PlinkOpenStartFields', outer_class=root_module['ns3::dot11s::PeerLinkOpenStart'])
     ## peer-management-protocol.h (module 'mesh'): ns3::dot11s::PeerManagementProtocol [class]
     module.add_class('PeerManagementProtocol', parent=root_module['ns3::Object'])
     module.add_container('std::vector< std::pair< unsigned int, ns3::Mac48Address > >', 'std::pair< unsigned int, ns3::Mac48Address >', container_type=u'vector')
@@ -651,6 +699,8 @@
     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_Ns3MpduInfo_methods(root_module, root_module['ns3::mpduInfo'])
+    register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::signalNoiseDbm'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3MgtAddBaRequestHeader_methods(root_module, root_module['ns3::MgtAddBaRequestHeader'])
@@ -742,6 +792,9 @@
     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'])
+    register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
+    register_Ns3VhtCapabilitiesChecker_methods(root_module, root_module['ns3::VhtCapabilitiesChecker'])
+    register_Ns3VhtCapabilitiesValue_methods(root_module, root_module['ns3::VhtCapabilitiesValue'])
     register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
@@ -778,8 +831,12 @@
     register_Ns3Dot11sIeRann_methods(root_module, root_module['ns3::dot11s::IeRann'])
     register_Ns3Dot11sMeshHeader_methods(root_module, root_module['ns3::dot11s::MeshHeader'])
     register_Ns3Dot11sPeerLink_methods(root_module, root_module['ns3::dot11s::PeerLink'])
-    register_Ns3Dot11sPeerLinkFrameStart_methods(root_module, root_module['ns3::dot11s::PeerLinkFrameStart'])
-    register_Ns3Dot11sPeerLinkFrameStartPlinkFrameStartFields_methods(root_module, root_module['ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields'])
+    register_Ns3Dot11sPeerLinkCloseStart_methods(root_module, root_module['ns3::dot11s::PeerLinkCloseStart'])
+    register_Ns3Dot11sPeerLinkCloseStartPlinkCloseStartFields_methods(root_module, root_module['ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields'])
+    register_Ns3Dot11sPeerLinkConfirmStart_methods(root_module, root_module['ns3::dot11s::PeerLinkConfirmStart'])
+    register_Ns3Dot11sPeerLinkConfirmStartPlinkConfirmStartFields_methods(root_module, root_module['ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields'])
+    register_Ns3Dot11sPeerLinkOpenStart_methods(root_module, root_module['ns3::dot11s::PeerLinkOpenStart'])
+    register_Ns3Dot11sPeerLinkOpenStartPlinkOpenStartFields_methods(root_module, root_module['ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields'])
     register_Ns3Dot11sPeerManagementProtocol_methods(root_module, root_module['ns3::dot11s::PeerManagementProtocol'])
     register_Ns3FlameFlameHeader_methods(root_module, root_module['ns3::flame::FlameHeader'])
     register_Ns3FlameFlameProtocol_methods(root_module, root_module['ns3::flame::FlameProtocol'])
@@ -1115,6 +1172,10 @@
     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', 
@@ -1291,17 +1352,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1323,11 +1384,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1337,16 +1393,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1584,14 +1630,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1652,11 +1702,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CapabilityInformation_methods(root_module, cls):
@@ -2802,7 +2847,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2820,10 +2865,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2887,10 +2932,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3037,10 +3082,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3453,24 +3498,24 @@
     cls.add_constructor([])
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
     cls.add_constructor([param('std::string', 'name')])
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate(uint8_t nss) const [member function]
     cls.add_method('GetCodeRate', 
                    'ns3::WifiCodeRate', 
-                   [], 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint16_t ns3::WifiMode::GetConstellationSize(uint8_t nss) const [member function]
     cls.add_method('GetConstellationSize', 
-                   'uint8_t', 
-                   [], 
+                   'uint16_t', 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetMcsValue() const [member function]
+    cls.add_method('GetMcsValue', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
@@ -3478,10 +3523,10 @@
                    'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [], 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -3503,10 +3548,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    cls.add_method('CreateWifiMcs', 
+                   'ns3::WifiMode', 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   is_static=True)
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
                    is_static=True)
     return
 
@@ -3611,6 +3661,10 @@
     cls.add_constructor([param('ns3::WifiRemoteStationState const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_address [variable]
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
+    cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
+    cls.add_instance_attribute('m_channelWidth', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_greenfield [variable]
     cls.add_instance_attribute('m_greenfield', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_info [variable]
@@ -3618,7 +3672,7 @@
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
-    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiMcsList', is_const=False)
+    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
     cls.add_instance_attribute('m_operationalRateSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_rx [variable]
@@ -3637,8 +3691,13 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## 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, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, uint32_t channelWidth, bool aggregation, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint32_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): uint32_t ns3::WifiTxVector::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -3664,6 +3723,11 @@
                    '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::IsShortGuardInterval() const [member function]
     cls.add_method('IsShortGuardInterval', 
                    'bool', 
@@ -3674,6 +3738,14 @@
                    '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::SetChannelWidth(uint32_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelWidth')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -3778,6 +3850,28 @@
     cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
 
+def register_Ns3MpduInfo_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo(ns3::mpduInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::mpduInfo const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::packetType [variable]
+    cls.add_instance_attribute('packetType', 'uint8_t', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::referenceNumber [variable]
+    cls.add_instance_attribute('referenceNumber', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3SignalNoiseDbm_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm(ns3::signalNoiseDbm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::signalNoiseDbm const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::noise [variable]
+    cls.add_instance_attribute('noise', 'double', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signal [variable]
+    cls.add_instance_attribute('signal', 'double', is_const=False)
+    return
+
 def register_Ns3Chunk_methods(root_module, cls):
     ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
     cls.add_constructor([])
@@ -4068,6 +4162,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4094,6 +4193,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtAssocResponseHeader_methods(root_module, cls):
@@ -4134,6 +4237,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4156,6 +4264,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtDelBaHeader_methods(root_module, cls):
@@ -4257,6 +4369,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4279,6 +4396,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtProbeResponseHeader_methods(root_module, cls):
@@ -4330,6 +4451,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4356,6 +4482,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3Object_methods(root_module, cls):
@@ -4462,10 +4592,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -5727,6 +5857,10 @@
     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::SetQosNoAck() [member function]
     cls.add_method('SetQosNoAck', 
                    'void', 
@@ -5739,6 +5873,10 @@
     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::SetQosNormalAck() [member function]
     cls.add_method('SetQosNormalAck', 
                    'void', 
@@ -5783,19 +5921,19 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuration(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('CalculatePlcpDuration', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpPreambleAndHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('CalculatePlcpPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
                    [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('ConfigureStandard', 
                    'void', 
@@ -5811,11 +5949,6 @@
                    'ns3::Ptr< ns3::WifiChannel >', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint16_t', 
@@ -5826,6 +5959,11 @@
                    'ns3::Time', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -5906,6 +6044,171 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
+    cls.add_method('GetHtMcs0', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
+    cls.add_method('GetHtMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
+    cls.add_method('GetHtMcs10', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
+    cls.add_method('GetHtMcs11', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
+    cls.add_method('GetHtMcs12', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
+    cls.add_method('GetHtMcs13', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
+    cls.add_method('GetHtMcs14', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
+    cls.add_method('GetHtMcs15', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
+    cls.add_method('GetHtMcs16', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
+    cls.add_method('GetHtMcs17', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
+    cls.add_method('GetHtMcs18', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
+    cls.add_method('GetHtMcs19', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
+    cls.add_method('GetHtMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
+    cls.add_method('GetHtMcs20', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
+    cls.add_method('GetHtMcs21', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
+    cls.add_method('GetHtMcs22', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
+    cls.add_method('GetHtMcs23', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
+    cls.add_method('GetHtMcs24', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
+    cls.add_method('GetHtMcs25', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
+    cls.add_method('GetHtMcs26', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
+    cls.add_method('GetHtMcs27', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
+    cls.add_method('GetHtMcs28', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
+    cls.add_method('GetHtMcs29', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
+    cls.add_method('GetHtMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
+    cls.add_method('GetHtMcs30', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
+    cls.add_method('GetHtMcs31', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
+    cls.add_method('GetHtMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
+    cls.add_method('GetHtMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
+    cls.add_method('GetHtMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
+    cls.add_method('GetHtMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
+    cls.add_method('GetHtMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
+    cls.add_method('GetHtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetHtPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
     cls.add_method('GetLastRxStartTime', 
                    'ns3::Time', 
@@ -5916,14 +6219,9 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetMFPlcpHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
     cls.add_method('GetMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint8_t', 'mcs')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
@@ -5966,21 +6264,6 @@
                    'uint32_t', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
     cls.add_method('GetOfdmRate12Mbps', 
                    'ns3::WifiMode', 
@@ -5996,46 +6279,11 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
     cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
     cls.add_method('GetOfdmRate18Mbps', 
                    'ns3::WifiMode', 
@@ -6046,21 +6294,11 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
     cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
     cls.add_method('GetOfdmRate24Mbps', 
                    'ns3::WifiMode', 
@@ -6071,46 +6309,21 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
     cls.add_method('GetOfdmRate27MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
     cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
     cls.add_method('GetOfdmRate36Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
     cls.add_method('GetOfdmRate3MbpsBW10MHz', 
                    'ns3::WifiMode', 
@@ -6121,21 +6334,6 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
     cls.add_method('GetOfdmRate48Mbps', 
                    'ns3::WifiMode', 
@@ -6151,129 +6349,84 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
     cls.add_method('GetOfdmRate54Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
+    cls.add_method('GetOfdmRate9Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
-    cls.add_method('GetOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
                    [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHtTrainingSymbolDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpPreambleDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA1Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA1Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA2Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA2Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigBDuration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
     cls.add_method('GetStateDuration', 
@@ -6300,6 +6453,61 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
+    cls.add_method('GetVhtMcs0', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
+    cls.add_method('GetVhtMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
+    cls.add_method('GetVhtMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
+    cls.add_method('GetVhtMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
+    cls.add_method('GetVhtMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
+    cls.add_method('GetVhtMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
+    cls.add_method('GetVhtMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
+    cls.add_method('GetVhtMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
+    cls.add_method('GetVhtMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
+    cls.add_method('GetVhtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetVhtPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
@@ -6340,19 +6548,14 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu, ns3::signalNoiseDbm signalNoise) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::signalNoiseDbm', 'signalNoise')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu) [member function]
     cls.add_method('NotifyMonitorSniffTx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('NotifyRxBegin', 
                    'void', 
@@ -6387,21 +6590,21 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
     cls.add_method('SendPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
                    [param('uint16_t', 'id')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
@@ -6457,11 +6660,6 @@
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
@@ -6473,10 +6671,10 @@
     cls.add_method('AddAllSupportedModes', 
                    'void', 
                    [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
+                   [param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
     cls.add_method('AddBasicMode', 
                    'void', 
@@ -6485,10 +6683,14 @@
     cls.add_method('AddStationHtCapabilities', 
                    'void', 
                    [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htcapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtcapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
     cls.add_method('AddSupportedMcs', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'mcs')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
     cls.add_method('AddSupportedMode', 
                    'void', 
@@ -6501,9 +6703,9 @@
     cls.add_method('GetAckTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
     cls.add_method('GetBasicMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint32_t', 'i')], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint32_t i) const [member function]
@@ -6527,9 +6729,9 @@
     cls.add_method('GetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
     cls.add_method('GetDefaultMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
@@ -6612,6 +6814,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::HasVhtSupported() const [member function]
+    cls.add_method('HasVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
     cls.add_method('IsAssociated', 
                    'bool', 
@@ -6731,6 +6938,10 @@
     cls.add_method('SetRtsCtsThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetupMac', 
                    'void', 
@@ -6741,11 +6952,25 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
+    cls.add_method('UpdateFragmentationThreshold', 
+                   'void', 
+                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAggregation', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetGreenfield', 
                    'bool', 
@@ -6761,9 +6986,9 @@
                    'ns3::Ptr< ns3::WifiMac >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
     cls.add_method('GetMcsSupported', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
                    is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
@@ -6821,6 +7046,11 @@
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
     cls.add_method('DoGetAckTxGuardInterval', 
                    'bool', 
@@ -6846,6 +7076,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetBlockAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetBlockAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
     cls.add_method('DoGetBlockAckTxGuardInterval', 
                    'bool', 
@@ -6871,6 +7106,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetCtsTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
     cls.add_method('DoGetCtsTxGuardInterval', 
                    'bool', 
@@ -7112,11 +7352,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -7967,6 +8217,16 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
+    cls.add_method('GetAntennaSelectionCapabilities', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
+    cls.add_method('GetExtendedHtCapabilities', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
     cls.add_method('GetGreenfield', 
                    'uint8_t', 
@@ -7982,11 +8242,31 @@
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLSigProtectionSupport() const [member function]
+    cls.add_method('GetLSigProtectionSupport', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
     cls.add_method('GetLdpc', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
+    cls.add_method('GetMaxAmsduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetRxHighestSupportedDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t * ns3::HtCapabilities::GetRxMcsBitmask() [member function]
     cls.add_method('GetRxMcsBitmask', 
                    'uint8_t *', 
@@ -8001,6 +8281,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval40() const [member function]
+    cls.add_method('GetShortGuardInterval40', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
     cls.add_method('GetSupportedChannelWidth', 
                    'uint8_t', 
@@ -8016,6 +8301,21 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
+    cls.add_method('GetTxBfCapabilities', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMaxNSpatialStreams() const [member function]
+    cls.add_method('GetTxMaxNSpatialStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMcsSetDefined() const [member function]
+    cls.add_method('GetTxMcsSetDefined', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) [member function]
     cls.add_method('IsSupportedMcs', 
                    'bool', 
@@ -8034,6 +8334,14 @@
     cls.add_method('SetAmpduParameters', 
                    'void', 
                    [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
+    cls.add_method('SetAntennaSelectionCapabilities', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
+    cls.add_method('SetExtendedHtCapabilities', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
     cls.add_method('SetGreenfield', 
                    'void', 
@@ -8046,10 +8354,26 @@
     cls.add_method('SetHtSupported', 
                    'void', 
                    [param('uint8_t', 'htsupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lsigprotection) [member function]
+    cls.add_method('SetLSigProtectionSupport', 
+                   'void', 
+                   [param('uint8_t', 'lsigprotection')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint8_t maxampdulength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxampdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint8_t maxamsdulength) [member function]
+    cls.add_method('SetMaxAmsduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxamsdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxsupportedrate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxsupportedrate')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
     cls.add_method('SetRxMcsBitmask', 
                    'void', 
@@ -8058,6 +8382,10 @@
     cls.add_method('SetShortGuardInterval20', 
                    'void', 
                    [param('uint8_t', 'shortguardinterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardInterval40', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedchannelwidth) [member function]
     cls.add_method('SetSupportedChannelWidth', 
                    'void', 
@@ -8066,6 +8394,18 @@
     cls.add_method('SetSupportedMcsSet', 
                    'void', 
                    [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
+    cls.add_method('SetTxBfCapabilities', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxtxspatialstreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxtxspatialstreams')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txmcssetdefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txmcssetdefined')])
     return
 
 def register_Ns3HtCapabilitiesChecker_methods(root_module, cls):
@@ -8342,15 +8682,25 @@
     return
 
 def register_Ns3MeshInformationElementVector_methods(root_module, cls):
-    ## mesh-information-element-vector.h (module 'mesh'): ns3::MeshInformationElementVector::MeshInformationElementVector() [constructor]
-    cls.add_constructor([])
     ## mesh-information-element-vector.h (module 'mesh'): ns3::MeshInformationElementVector::MeshInformationElementVector(ns3::MeshInformationElementVector const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MeshInformationElementVector const &', 'arg0')])
+    ## mesh-information-element-vector.h (module 'mesh'): ns3::MeshInformationElementVector::MeshInformationElementVector() [constructor]
+    cls.add_constructor([])
     ## mesh-information-element-vector.h (module 'mesh'): uint32_t ns3::MeshInformationElementVector::DeserializeSingleIe(ns3::Buffer::Iterator start) [member function]
     cls.add_method('DeserializeSingleIe', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
+    ## mesh-information-element-vector.h (module 'mesh'): ns3::TypeId ns3::MeshInformationElementVector::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mesh-information-element-vector.h (module 'mesh'): static ns3::TypeId ns3::MeshInformationElementVector::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     return
 
 def register_Ns3MeshL2RoutingProtocol_methods(root_module, cls):
@@ -8389,6 +8739,11 @@
     cls.add_constructor([])
     ## mesh-stack-installer.h (module 'mesh'): ns3::MeshStack::MeshStack(ns3::MeshStack const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MeshStack const &', 'arg0')])
+    ## mesh-stack-installer.h (module 'mesh'): static ns3::TypeId ns3::MeshStack::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## mesh-stack-installer.h (module 'mesh'): bool ns3::MeshStack::InstallStack(ns3::Ptr<ns3::MeshPointDevice> mp) [member function]
     cls.add_method('InstallStack', 
                    'bool', 
@@ -8443,6 +8798,11 @@
     cls.add_constructor([])
     ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtBeaconHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     return
 
 def register_Ns3NetDevice_methods(root_module, cls):
@@ -9234,6 +9594,16 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
     return
 
 def register_Ns3Ssid_methods(root_module, cls):
@@ -9489,6 +9859,237 @@
                    [param('uint64_t const &', 'value')])
     return
 
+def register_Ns3VhtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::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)
+    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxAmpduLengthExponent() const [member function]
+    cls.add_method('GetMaxAmpduLengthExponent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
+    cls.add_method('GetMaxMpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
+    cls.add_method('GetRxLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxMcsMap() const [member function]
+    cls.add_method('GetRxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
+    cls.add_method('GetRxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor160Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor160Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor80Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor80Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
+    cls.add_method('GetSupportedMcsAndNssSet', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetTxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxMcsMap() const [member function]
+    cls.add_method('GetTxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
+    cls.add_method('GetTxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
+    cls.add_method('GetVhtCapabilitiesInfo', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t Nss) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'Nss')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLengthExponent(uint8_t exponent) [member function]
+    cls.add_method('SetMaxAmpduLengthExponent', 
+                   'void', 
+                   [param('uint8_t', 'exponent')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint8_t length) [member function]
+    cls.add_method('SetMaxMpduLength', 
+                   'void', 
+                   [param('uint8_t', 'length')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetRxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxldpc) [member function]
+    cls.add_method('SetRxLdpc', 
+                   'void', 
+                   [param('uint8_t', 'rxldpc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxstbc) [member function]
+    cls.add_method('SetRxStbc', 
+                   'void', 
+                   [param('uint8_t', 'rxstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor160Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor80Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelwidthset) [member function]
+    cls.add_method('SetSupportedChannelWidthSet', 
+                   'void', 
+                   [param('uint8_t', 'channelwidthset')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNssSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetTxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txstbc) [member function]
+    cls.add_method('SetTxStbc', 
+                   'void', 
+                   [param('uint8_t', 'txstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
+    cls.add_method('SetVhtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtsupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtsupported')])
+    return
+
+def register_Ns3VhtCapabilitiesChecker_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker(ns3::VhtCapabilitiesChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesChecker const &', 'arg0')])
+    return
+
+def register_Ns3VhtCapabilitiesValue_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilitiesValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesValue const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilities const & value) [constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'value')])
+    ## vht-capabilities.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::VhtCapabilitiesValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilitiesValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities ns3::VhtCapabilitiesValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): std::string ns3::VhtCapabilitiesValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilitiesValue::Set(ns3::VhtCapabilities const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::VhtCapabilities const &', 'value')])
+    return
+
 def register_Ns3WifiModeChecker_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
     cls.add_constructor([])
@@ -11440,76 +12041,184 @@
                    is_const=True)
     return
 
-def register_Ns3Dot11sPeerLinkFrameStart_methods(root_module, cls):
+def register_Ns3Dot11sPeerLinkCloseStart_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PeerLinkFrameStart() [constructor]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PeerLinkCloseStart() [constructor]
     cls.add_constructor([])
-    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkFrameStart::Deserialize(ns3::Buffer::Iterator start) [member function]
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkCloseStart::Deserialize(ns3::Buffer::Iterator start) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields ns3::dot11s::PeerLinkFrameStart::GetFields() const [member function]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields ns3::dot11s::PeerLinkCloseStart::GetFields() const [member function]
     cls.add_method('GetFields', 
-                   'ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields', 
+                   'ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields', 
                    [], 
                    is_const=True)
-    ## peer-link-frame.h (module 'mesh'): ns3::TypeId ns3::dot11s::PeerLinkFrameStart::GetInstanceTypeId() const [member function]
+    ## peer-link-frame.h (module 'mesh'): ns3::TypeId ns3::dot11s::PeerLinkCloseStart::GetInstanceTypeId() const [member function]
     cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkFrameStart::GetSerializedSize() const [member function]
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkCloseStart::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## peer-link-frame.h (module 'mesh'): static ns3::TypeId ns3::dot11s::PeerLinkFrameStart::GetTypeId() [member function]
+    ## peer-link-frame.h (module 'mesh'): static ns3::TypeId ns3::dot11s::PeerLinkCloseStart::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkFrameStart::Print(std::ostream & os) const [member function]
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkCloseStart::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
-    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkFrameStart::Serialize(ns3::Buffer::Iterator start) const [member function]
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkCloseStart::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkFrameStart::SetPlinkFrameStart(ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields arg0) [member function]
-    cls.add_method('SetPlinkFrameStart', 
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkCloseStart::SetPlinkCloseStart(ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields arg0) [member function]
+    cls.add_method('SetPlinkCloseStart', 
                    'void', 
-                   [param('ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields', 'arg0')])
-    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkFrameStart::SetPlinkFrameSubtype(uint8_t subtype) [member function]
-    cls.add_method('SetPlinkFrameSubtype', 
+                   [param('ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields', 'arg0')])
+    return
+
+def register_Ns3Dot11sPeerLinkCloseStartPlinkCloseStartFields_methods(root_module, cls):
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields::PlinkCloseStartFields() [constructor]
+    cls.add_constructor([])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields::PlinkCloseStartFields(ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields const &', 'arg0')])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields::meshId [variable]
+    cls.add_instance_attribute('meshId', 'ns3::dot11s::IeMeshId', is_const=False)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields::protocol [variable]
+    cls.add_instance_attribute('protocol', 'ns3::dot11s::IePeeringProtocol', is_const=False)
+    return
+
+def register_Ns3Dot11sPeerLinkConfirmStart_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PeerLinkConfirmStart() [constructor]
+    cls.add_constructor([])
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkConfirmStart::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields ns3::dot11s::PeerLinkConfirmStart::GetFields() const [member function]
+    cls.add_method('GetFields', 
+                   'ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields', 
+                   [], 
+                   is_const=True)
+    ## peer-link-frame.h (module 'mesh'): ns3::TypeId ns3::dot11s::PeerLinkConfirmStart::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkConfirmStart::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): static ns3::TypeId ns3::dot11s::PeerLinkConfirmStart::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkConfirmStart::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('uint8_t', 'subtype')])
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkConfirmStart::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkConfirmStart::SetPlinkConfirmStart(ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields arg0) [member function]
+    cls.add_method('SetPlinkConfirmStart', 
+                   'void', 
+                   [param('ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields', 'arg0')])
     return
 
-def register_Ns3Dot11sPeerLinkFrameStartPlinkFrameStartFields_methods(root_module, cls):
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::PlinkFrameStartFields() [constructor]
+def register_Ns3Dot11sPeerLinkConfirmStartPlinkConfirmStartFields_methods(root_module, cls):
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::PlinkConfirmStartFields() [constructor]
     cls.add_constructor([])
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::PlinkFrameStartFields(ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields const &', 'arg0')])
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::aid [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::PlinkConfirmStartFields(ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields const &', 'arg0')])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::aid [variable]
     cls.add_instance_attribute('aid', 'uint16_t', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::capability [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::capability [variable]
+    cls.add_instance_attribute('capability', 'uint16_t', is_const=False)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::config [variable]
+    cls.add_instance_attribute('config', 'ns3::dot11s::IeConfiguration', is_const=False)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::protocol [variable]
+    cls.add_instance_attribute('protocol', 'ns3::dot11s::IePeeringProtocol', is_const=False)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::rates [variable]
+    cls.add_instance_attribute('rates', 'ns3::SupportedRates', is_const=False)
+    return
+
+def register_Ns3Dot11sPeerLinkOpenStart_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PeerLinkOpenStart() [constructor]
+    cls.add_constructor([])
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkOpenStart::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields ns3::dot11s::PeerLinkOpenStart::GetFields() const [member function]
+    cls.add_method('GetFields', 
+                   'ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields', 
+                   [], 
+                   is_const=True)
+    ## peer-link-frame.h (module 'mesh'): ns3::TypeId ns3::dot11s::PeerLinkOpenStart::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkOpenStart::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): static ns3::TypeId ns3::dot11s::PeerLinkOpenStart::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkOpenStart::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkOpenStart::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkOpenStart::SetPlinkOpenStart(ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields arg0) [member function]
+    cls.add_method('SetPlinkOpenStart', 
+                   'void', 
+                   [param('ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields', 'arg0')])
+    return
+
+def register_Ns3Dot11sPeerLinkOpenStartPlinkOpenStartFields_methods(root_module, cls):
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::PlinkOpenStartFields() [constructor]
+    cls.add_constructor([])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::PlinkOpenStartFields(ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields const &', 'arg0')])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::capability [variable]
     cls.add_instance_attribute('capability', 'uint16_t', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::config [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::config [variable]
     cls.add_instance_attribute('config', 'ns3::dot11s::IeConfiguration', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::meshId [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::meshId [variable]
     cls.add_instance_attribute('meshId', 'ns3::dot11s::IeMeshId', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::protocol [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::protocol [variable]
     cls.add_instance_attribute('protocol', 'ns3::dot11s::IePeeringProtocol', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::rates [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::rates [variable]
     cls.add_instance_attribute('rates', 'ns3::SupportedRates', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::reasonCode [variable]
-    cls.add_instance_attribute('reasonCode', 'uint16_t', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::subtype [variable]
-    cls.add_instance_attribute('subtype', 'uint8_t', is_const=False)
     return
 
 def register_Ns3Dot11sPeerManagementProtocol_methods(root_module, cls):
@@ -11889,6 +12598,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_dot11s(module.get_submodule('dot11s'), root_module)
     register_functions_ns3_flame(module.get_submodule('flame'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
@@ -11904,6 +12614,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_dot11s(module, root_module):
     ## ie-dot11s-id.h (module 'mesh'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::dot11s::MakeIeMeshIdChecker() [free function]
     module.add_function('MakeIeMeshIdChecker', 
diff -Naur ns-3.23/src/mesh/bindings/modulegen__gcc_LP64.py ns-3.24/src/mesh/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/mesh/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -23,11 +23,11 @@
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
     module.add_enum('WifiMacType', ['WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_CTLWRAPPER', '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-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'], import_from_module='ns.wifi')
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT'], import_from_module='ns.wifi')
     ## wifi-phy-standard.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_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211ac'], import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
     module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
     ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
@@ -135,7 +135,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
@@ -186,6 +186,10 @@
     module.add_class('int64x64_t', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
     module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo [struct]
+    module.add_class('mpduInfo', import_from_module='ns.wifi')
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm [struct]
+    module.add_class('signalNoiseDbm', import_from_module='ns.wifi')
     ## chunk.h (module 'network'): ns3::Chunk [class]
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
@@ -390,6 +394,12 @@
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## uinteger.h (module 'core'): ns3::UintegerValue [class]
     module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities [class]
+    module.add_class('VhtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker [class]
+    module.add_class('VhtCapabilitiesChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue [class]
+    module.add_class('VhtCapabilitiesValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker [class]
     module.add_class('WifiModeChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue [class]
@@ -411,23 +421,16 @@
     ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac [class]
     module.add_class('MeshWifiInterfaceMac', parent=root_module['ns3::RegularWifiMac'])
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type=u'vector')
-    module.add_container('ns3::WifiMcsList', 'unsigned char', container_type=u'vector')
     module.add_container('std::vector< ns3::Ptr< ns3::NetDevice > >', 'ns3::Ptr< ns3::NetDevice >', container_type=u'vector')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >', u'ns3::WifiMcsList')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >*', u'ns3::WifiMcsList*')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >&', u'ns3::WifiMcsList&')
     typehandlers.add_type_alias(u'uint8_t', u'ns3::WifiInformationElementId')
     typehandlers.add_type_alias(u'uint8_t*', u'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias(u'uint8_t&', u'ns3::WifiInformationElementId&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >', u'ns3::WifiModeList')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >*', u'ns3::WifiModeList*')
     typehandlers.add_type_alias(u'std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >&', u'ns3::WifiModeList&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', u'ns3::WifiMcsListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', u'ns3::WifiMcsListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', u'ns3::WifiMcsListIterator&')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -441,6 +444,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace dot11s
     
     nested_module = module.add_cpp_namespace('dot11s')
@@ -493,6 +502,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_dot11s(module):
     root_module = module.get_root()
     
@@ -554,10 +594,18 @@
     module.add_class('PeerLink', parent=root_module['ns3::Object'])
     ## peer-link.h (module 'mesh'): ns3::dot11s::PeerLink::PeerState [enumeration]
     module.add_enum('PeerState', ['IDLE', 'OPN_SNT', 'CNF_RCVD', 'OPN_RCVD', 'ESTAB', 'HOLDING'], outer_class=root_module['ns3::dot11s::PeerLink'])
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart [class]
-    module.add_class('PeerLinkFrameStart', parent=root_module['ns3::Header'])
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields [struct]
-    module.add_class('PlinkFrameStartFields', outer_class=root_module['ns3::dot11s::PeerLinkFrameStart'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart [class]
+    module.add_class('PeerLinkCloseStart', parent=root_module['ns3::Header'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields [struct]
+    module.add_class('PlinkCloseStartFields', outer_class=root_module['ns3::dot11s::PeerLinkCloseStart'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart [class]
+    module.add_class('PeerLinkConfirmStart', parent=root_module['ns3::Header'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields [struct]
+    module.add_class('PlinkConfirmStartFields', outer_class=root_module['ns3::dot11s::PeerLinkConfirmStart'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart [class]
+    module.add_class('PeerLinkOpenStart', parent=root_module['ns3::Header'])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields [struct]
+    module.add_class('PlinkOpenStartFields', outer_class=root_module['ns3::dot11s::PeerLinkOpenStart'])
     ## peer-management-protocol.h (module 'mesh'): ns3::dot11s::PeerManagementProtocol [class]
     module.add_class('PeerManagementProtocol', parent=root_module['ns3::Object'])
     module.add_container('std::vector< std::pair< unsigned int, ns3::Mac48Address > >', 'std::pair< unsigned int, ns3::Mac48Address >', container_type=u'vector')
@@ -651,6 +699,8 @@
     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_Ns3MpduInfo_methods(root_module, root_module['ns3::mpduInfo'])
+    register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::signalNoiseDbm'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3MgtAddBaRequestHeader_methods(root_module, root_module['ns3::MgtAddBaRequestHeader'])
@@ -742,6 +792,9 @@
     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'])
+    register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
+    register_Ns3VhtCapabilitiesChecker_methods(root_module, root_module['ns3::VhtCapabilitiesChecker'])
+    register_Ns3VhtCapabilitiesValue_methods(root_module, root_module['ns3::VhtCapabilitiesValue'])
     register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
@@ -778,8 +831,12 @@
     register_Ns3Dot11sIeRann_methods(root_module, root_module['ns3::dot11s::IeRann'])
     register_Ns3Dot11sMeshHeader_methods(root_module, root_module['ns3::dot11s::MeshHeader'])
     register_Ns3Dot11sPeerLink_methods(root_module, root_module['ns3::dot11s::PeerLink'])
-    register_Ns3Dot11sPeerLinkFrameStart_methods(root_module, root_module['ns3::dot11s::PeerLinkFrameStart'])
-    register_Ns3Dot11sPeerLinkFrameStartPlinkFrameStartFields_methods(root_module, root_module['ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields'])
+    register_Ns3Dot11sPeerLinkCloseStart_methods(root_module, root_module['ns3::dot11s::PeerLinkCloseStart'])
+    register_Ns3Dot11sPeerLinkCloseStartPlinkCloseStartFields_methods(root_module, root_module['ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields'])
+    register_Ns3Dot11sPeerLinkConfirmStart_methods(root_module, root_module['ns3::dot11s::PeerLinkConfirmStart'])
+    register_Ns3Dot11sPeerLinkConfirmStartPlinkConfirmStartFields_methods(root_module, root_module['ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields'])
+    register_Ns3Dot11sPeerLinkOpenStart_methods(root_module, root_module['ns3::dot11s::PeerLinkOpenStart'])
+    register_Ns3Dot11sPeerLinkOpenStartPlinkOpenStartFields_methods(root_module, root_module['ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields'])
     register_Ns3Dot11sPeerManagementProtocol_methods(root_module, root_module['ns3::dot11s::PeerManagementProtocol'])
     register_Ns3FlameFlameHeader_methods(root_module, root_module['ns3::flame::FlameHeader'])
     register_Ns3FlameFlameProtocol_methods(root_module, root_module['ns3::flame::FlameProtocol'])
@@ -1115,6 +1172,10 @@
     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', 
@@ -1291,17 +1352,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1323,11 +1384,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1337,16 +1393,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1584,14 +1630,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1652,11 +1702,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CapabilityInformation_methods(root_module, cls):
@@ -2802,7 +2847,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2820,10 +2865,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2887,10 +2932,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3037,10 +3082,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3453,24 +3498,24 @@
     cls.add_constructor([])
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
     cls.add_constructor([param('std::string', 'name')])
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate(uint8_t nss) const [member function]
     cls.add_method('GetCodeRate', 
                    'ns3::WifiCodeRate', 
-                   [], 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint16_t ns3::WifiMode::GetConstellationSize(uint8_t nss) const [member function]
     cls.add_method('GetConstellationSize', 
-                   'uint8_t', 
-                   [], 
+                   'uint16_t', 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetMcsValue() const [member function]
+    cls.add_method('GetMcsValue', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
@@ -3478,10 +3523,10 @@
                    'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [], 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -3503,10 +3548,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    cls.add_method('CreateWifiMcs', 
+                   'ns3::WifiMode', 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   is_static=True)
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
                    is_static=True)
     return
 
@@ -3611,6 +3661,10 @@
     cls.add_constructor([param('ns3::WifiRemoteStationState const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_address [variable]
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
+    cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
+    cls.add_instance_attribute('m_channelWidth', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_greenfield [variable]
     cls.add_instance_attribute('m_greenfield', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_info [variable]
@@ -3618,7 +3672,7 @@
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
-    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiMcsList', is_const=False)
+    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
     cls.add_instance_attribute('m_operationalRateSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_rx [variable]
@@ -3637,8 +3691,13 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## 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, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, uint32_t channelWidth, bool aggregation, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint32_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): uint32_t ns3::WifiTxVector::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -3664,6 +3723,11 @@
                    '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::IsShortGuardInterval() const [member function]
     cls.add_method('IsShortGuardInterval', 
                    'bool', 
@@ -3674,6 +3738,14 @@
                    '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::SetChannelWidth(uint32_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelWidth')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -3778,6 +3850,28 @@
     cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
 
+def register_Ns3MpduInfo_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo(ns3::mpduInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::mpduInfo const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::packetType [variable]
+    cls.add_instance_attribute('packetType', 'uint8_t', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::referenceNumber [variable]
+    cls.add_instance_attribute('referenceNumber', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3SignalNoiseDbm_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm(ns3::signalNoiseDbm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::signalNoiseDbm const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::noise [variable]
+    cls.add_instance_attribute('noise', 'double', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signal [variable]
+    cls.add_instance_attribute('signal', 'double', is_const=False)
+    return
+
 def register_Ns3Chunk_methods(root_module, cls):
     ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
     cls.add_constructor([])
@@ -4068,6 +4162,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4094,6 +4193,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtAssocResponseHeader_methods(root_module, cls):
@@ -4134,6 +4237,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4156,6 +4264,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtDelBaHeader_methods(root_module, cls):
@@ -4257,6 +4369,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4279,6 +4396,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtProbeResponseHeader_methods(root_module, cls):
@@ -4330,6 +4451,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4356,6 +4482,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3Object_methods(root_module, cls):
@@ -4462,10 +4592,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -5727,6 +5857,10 @@
     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::SetQosNoAck() [member function]
     cls.add_method('SetQosNoAck', 
                    'void', 
@@ -5739,6 +5873,10 @@
     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::SetQosNormalAck() [member function]
     cls.add_method('SetQosNormalAck', 
                    'void', 
@@ -5783,19 +5921,19 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuration(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('CalculatePlcpDuration', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpPreambleAndHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('CalculatePlcpPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
                    [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('ConfigureStandard', 
                    'void', 
@@ -5811,11 +5949,6 @@
                    'ns3::Ptr< ns3::WifiChannel >', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint16_t', 
@@ -5826,6 +5959,11 @@
                    'ns3::Time', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -5906,6 +6044,171 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
+    cls.add_method('GetHtMcs0', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
+    cls.add_method('GetHtMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
+    cls.add_method('GetHtMcs10', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
+    cls.add_method('GetHtMcs11', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
+    cls.add_method('GetHtMcs12', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
+    cls.add_method('GetHtMcs13', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
+    cls.add_method('GetHtMcs14', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
+    cls.add_method('GetHtMcs15', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
+    cls.add_method('GetHtMcs16', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
+    cls.add_method('GetHtMcs17', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
+    cls.add_method('GetHtMcs18', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
+    cls.add_method('GetHtMcs19', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
+    cls.add_method('GetHtMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
+    cls.add_method('GetHtMcs20', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
+    cls.add_method('GetHtMcs21', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
+    cls.add_method('GetHtMcs22', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
+    cls.add_method('GetHtMcs23', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
+    cls.add_method('GetHtMcs24', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
+    cls.add_method('GetHtMcs25', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
+    cls.add_method('GetHtMcs26', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
+    cls.add_method('GetHtMcs27', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
+    cls.add_method('GetHtMcs28', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
+    cls.add_method('GetHtMcs29', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
+    cls.add_method('GetHtMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
+    cls.add_method('GetHtMcs30', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
+    cls.add_method('GetHtMcs31', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
+    cls.add_method('GetHtMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
+    cls.add_method('GetHtMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
+    cls.add_method('GetHtMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
+    cls.add_method('GetHtMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
+    cls.add_method('GetHtMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
+    cls.add_method('GetHtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetHtPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
     cls.add_method('GetLastRxStartTime', 
                    'ns3::Time', 
@@ -5916,14 +6219,9 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetMFPlcpHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
     cls.add_method('GetMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint8_t', 'mcs')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
@@ -5966,21 +6264,6 @@
                    'uint32_t', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
     cls.add_method('GetOfdmRate12Mbps', 
                    'ns3::WifiMode', 
@@ -5996,46 +6279,11 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
     cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
     cls.add_method('GetOfdmRate18Mbps', 
                    'ns3::WifiMode', 
@@ -6046,21 +6294,11 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
     cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
     cls.add_method('GetOfdmRate24Mbps', 
                    'ns3::WifiMode', 
@@ -6071,46 +6309,21 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
     cls.add_method('GetOfdmRate27MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
     cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
     cls.add_method('GetOfdmRate36Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
     cls.add_method('GetOfdmRate3MbpsBW10MHz', 
                    'ns3::WifiMode', 
@@ -6121,21 +6334,6 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
     cls.add_method('GetOfdmRate48Mbps', 
                    'ns3::WifiMode', 
@@ -6151,129 +6349,84 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
     cls.add_method('GetOfdmRate54Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
+    cls.add_method('GetOfdmRate9Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
-    cls.add_method('GetOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
                    [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHtTrainingSymbolDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpPreambleDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA1Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA1Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA2Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA2Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigBDuration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
     cls.add_method('GetStateDuration', 
@@ -6300,6 +6453,61 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
+    cls.add_method('GetVhtMcs0', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
+    cls.add_method('GetVhtMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
+    cls.add_method('GetVhtMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
+    cls.add_method('GetVhtMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
+    cls.add_method('GetVhtMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
+    cls.add_method('GetVhtMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
+    cls.add_method('GetVhtMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
+    cls.add_method('GetVhtMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
+    cls.add_method('GetVhtMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
+    cls.add_method('GetVhtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetVhtPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
@@ -6340,19 +6548,14 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu, ns3::signalNoiseDbm signalNoise) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::signalNoiseDbm', 'signalNoise')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu) [member function]
     cls.add_method('NotifyMonitorSniffTx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('NotifyRxBegin', 
                    'void', 
@@ -6387,21 +6590,21 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
     cls.add_method('SendPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
                    [param('uint16_t', 'id')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
@@ -6457,11 +6660,6 @@
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
@@ -6473,10 +6671,10 @@
     cls.add_method('AddAllSupportedModes', 
                    'void', 
                    [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
+                   [param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
     cls.add_method('AddBasicMode', 
                    'void', 
@@ -6485,10 +6683,14 @@
     cls.add_method('AddStationHtCapabilities', 
                    'void', 
                    [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htcapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtcapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
     cls.add_method('AddSupportedMcs', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'mcs')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
     cls.add_method('AddSupportedMode', 
                    'void', 
@@ -6501,9 +6703,9 @@
     cls.add_method('GetAckTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
     cls.add_method('GetBasicMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint32_t', 'i')], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint32_t i) const [member function]
@@ -6527,9 +6729,9 @@
     cls.add_method('GetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
     cls.add_method('GetDefaultMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
@@ -6612,6 +6814,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::HasVhtSupported() const [member function]
+    cls.add_method('HasVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
     cls.add_method('IsAssociated', 
                    'bool', 
@@ -6731,6 +6938,10 @@
     cls.add_method('SetRtsCtsThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetupMac', 
                    'void', 
@@ -6741,11 +6952,25 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
+    cls.add_method('UpdateFragmentationThreshold', 
+                   'void', 
+                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAggregation', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetGreenfield', 
                    'bool', 
@@ -6761,9 +6986,9 @@
                    'ns3::Ptr< ns3::WifiMac >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
     cls.add_method('GetMcsSupported', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
                    is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
@@ -6821,6 +7046,11 @@
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
     cls.add_method('DoGetAckTxGuardInterval', 
                    'bool', 
@@ -6846,6 +7076,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetBlockAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetBlockAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
     cls.add_method('DoGetBlockAckTxGuardInterval', 
                    'bool', 
@@ -6871,6 +7106,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetCtsTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
     cls.add_method('DoGetCtsTxGuardInterval', 
                    'bool', 
@@ -7112,11 +7352,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -7967,6 +8217,16 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
+    cls.add_method('GetAntennaSelectionCapabilities', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
+    cls.add_method('GetExtendedHtCapabilities', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
     cls.add_method('GetGreenfield', 
                    'uint8_t', 
@@ -7982,11 +8242,31 @@
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLSigProtectionSupport() const [member function]
+    cls.add_method('GetLSigProtectionSupport', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
     cls.add_method('GetLdpc', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
+    cls.add_method('GetMaxAmsduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetRxHighestSupportedDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t * ns3::HtCapabilities::GetRxMcsBitmask() [member function]
     cls.add_method('GetRxMcsBitmask', 
                    'uint8_t *', 
@@ -8001,6 +8281,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval40() const [member function]
+    cls.add_method('GetShortGuardInterval40', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
     cls.add_method('GetSupportedChannelWidth', 
                    'uint8_t', 
@@ -8016,6 +8301,21 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
+    cls.add_method('GetTxBfCapabilities', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMaxNSpatialStreams() const [member function]
+    cls.add_method('GetTxMaxNSpatialStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMcsSetDefined() const [member function]
+    cls.add_method('GetTxMcsSetDefined', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) [member function]
     cls.add_method('IsSupportedMcs', 
                    'bool', 
@@ -8034,6 +8334,14 @@
     cls.add_method('SetAmpduParameters', 
                    'void', 
                    [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
+    cls.add_method('SetAntennaSelectionCapabilities', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
+    cls.add_method('SetExtendedHtCapabilities', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
     cls.add_method('SetGreenfield', 
                    'void', 
@@ -8046,10 +8354,26 @@
     cls.add_method('SetHtSupported', 
                    'void', 
                    [param('uint8_t', 'htsupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lsigprotection) [member function]
+    cls.add_method('SetLSigProtectionSupport', 
+                   'void', 
+                   [param('uint8_t', 'lsigprotection')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint8_t maxampdulength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxampdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint8_t maxamsdulength) [member function]
+    cls.add_method('SetMaxAmsduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxamsdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxsupportedrate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxsupportedrate')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
     cls.add_method('SetRxMcsBitmask', 
                    'void', 
@@ -8058,6 +8382,10 @@
     cls.add_method('SetShortGuardInterval20', 
                    'void', 
                    [param('uint8_t', 'shortguardinterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardInterval40', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedchannelwidth) [member function]
     cls.add_method('SetSupportedChannelWidth', 
                    'void', 
@@ -8066,6 +8394,18 @@
     cls.add_method('SetSupportedMcsSet', 
                    'void', 
                    [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
+    cls.add_method('SetTxBfCapabilities', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxtxspatialstreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxtxspatialstreams')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txmcssetdefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txmcssetdefined')])
     return
 
 def register_Ns3HtCapabilitiesChecker_methods(root_module, cls):
@@ -8342,15 +8682,25 @@
     return
 
 def register_Ns3MeshInformationElementVector_methods(root_module, cls):
-    ## mesh-information-element-vector.h (module 'mesh'): ns3::MeshInformationElementVector::MeshInformationElementVector() [constructor]
-    cls.add_constructor([])
     ## mesh-information-element-vector.h (module 'mesh'): ns3::MeshInformationElementVector::MeshInformationElementVector(ns3::MeshInformationElementVector const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MeshInformationElementVector const &', 'arg0')])
+    ## mesh-information-element-vector.h (module 'mesh'): ns3::MeshInformationElementVector::MeshInformationElementVector() [constructor]
+    cls.add_constructor([])
     ## mesh-information-element-vector.h (module 'mesh'): uint32_t ns3::MeshInformationElementVector::DeserializeSingleIe(ns3::Buffer::Iterator start) [member function]
     cls.add_method('DeserializeSingleIe', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
+    ## mesh-information-element-vector.h (module 'mesh'): ns3::TypeId ns3::MeshInformationElementVector::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mesh-information-element-vector.h (module 'mesh'): static ns3::TypeId ns3::MeshInformationElementVector::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     return
 
 def register_Ns3MeshL2RoutingProtocol_methods(root_module, cls):
@@ -8389,6 +8739,11 @@
     cls.add_constructor([])
     ## mesh-stack-installer.h (module 'mesh'): ns3::MeshStack::MeshStack(ns3::MeshStack const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MeshStack const &', 'arg0')])
+    ## mesh-stack-installer.h (module 'mesh'): static ns3::TypeId ns3::MeshStack::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## mesh-stack-installer.h (module 'mesh'): bool ns3::MeshStack::InstallStack(ns3::Ptr<ns3::MeshPointDevice> mp) [member function]
     cls.add_method('InstallStack', 
                    'bool', 
@@ -8443,6 +8798,11 @@
     cls.add_constructor([])
     ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtBeaconHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     return
 
 def register_Ns3NetDevice_methods(root_module, cls):
@@ -9234,6 +9594,16 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
     return
 
 def register_Ns3Ssid_methods(root_module, cls):
@@ -9489,6 +9859,237 @@
                    [param('uint64_t const &', 'value')])
     return
 
+def register_Ns3VhtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::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)
+    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxAmpduLengthExponent() const [member function]
+    cls.add_method('GetMaxAmpduLengthExponent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
+    cls.add_method('GetMaxMpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
+    cls.add_method('GetRxLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxMcsMap() const [member function]
+    cls.add_method('GetRxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
+    cls.add_method('GetRxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor160Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor160Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor80Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor80Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
+    cls.add_method('GetSupportedMcsAndNssSet', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetTxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxMcsMap() const [member function]
+    cls.add_method('GetTxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
+    cls.add_method('GetTxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
+    cls.add_method('GetVhtCapabilitiesInfo', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t Nss) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'Nss')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLengthExponent(uint8_t exponent) [member function]
+    cls.add_method('SetMaxAmpduLengthExponent', 
+                   'void', 
+                   [param('uint8_t', 'exponent')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint8_t length) [member function]
+    cls.add_method('SetMaxMpduLength', 
+                   'void', 
+                   [param('uint8_t', 'length')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetRxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxldpc) [member function]
+    cls.add_method('SetRxLdpc', 
+                   'void', 
+                   [param('uint8_t', 'rxldpc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxstbc) [member function]
+    cls.add_method('SetRxStbc', 
+                   'void', 
+                   [param('uint8_t', 'rxstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor160Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor80Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelwidthset) [member function]
+    cls.add_method('SetSupportedChannelWidthSet', 
+                   'void', 
+                   [param('uint8_t', 'channelwidthset')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNssSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetTxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txstbc) [member function]
+    cls.add_method('SetTxStbc', 
+                   'void', 
+                   [param('uint8_t', 'txstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
+    cls.add_method('SetVhtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtsupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtsupported')])
+    return
+
+def register_Ns3VhtCapabilitiesChecker_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker(ns3::VhtCapabilitiesChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesChecker const &', 'arg0')])
+    return
+
+def register_Ns3VhtCapabilitiesValue_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilitiesValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesValue const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilities const & value) [constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'value')])
+    ## vht-capabilities.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::VhtCapabilitiesValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilitiesValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities ns3::VhtCapabilitiesValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): std::string ns3::VhtCapabilitiesValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilitiesValue::Set(ns3::VhtCapabilities const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::VhtCapabilities const &', 'value')])
+    return
+
 def register_Ns3WifiModeChecker_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
     cls.add_constructor([])
@@ -11440,76 +12041,184 @@
                    is_const=True)
     return
 
-def register_Ns3Dot11sPeerLinkFrameStart_methods(root_module, cls):
+def register_Ns3Dot11sPeerLinkCloseStart_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PeerLinkFrameStart() [constructor]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PeerLinkCloseStart() [constructor]
     cls.add_constructor([])
-    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkFrameStart::Deserialize(ns3::Buffer::Iterator start) [member function]
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkCloseStart::Deserialize(ns3::Buffer::Iterator start) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields ns3::dot11s::PeerLinkFrameStart::GetFields() const [member function]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields ns3::dot11s::PeerLinkCloseStart::GetFields() const [member function]
     cls.add_method('GetFields', 
-                   'ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields', 
+                   'ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields', 
                    [], 
                    is_const=True)
-    ## peer-link-frame.h (module 'mesh'): ns3::TypeId ns3::dot11s::PeerLinkFrameStart::GetInstanceTypeId() const [member function]
+    ## peer-link-frame.h (module 'mesh'): ns3::TypeId ns3::dot11s::PeerLinkCloseStart::GetInstanceTypeId() const [member function]
     cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkFrameStart::GetSerializedSize() const [member function]
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkCloseStart::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## peer-link-frame.h (module 'mesh'): static ns3::TypeId ns3::dot11s::PeerLinkFrameStart::GetTypeId() [member function]
+    ## peer-link-frame.h (module 'mesh'): static ns3::TypeId ns3::dot11s::PeerLinkCloseStart::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkFrameStart::Print(std::ostream & os) const [member function]
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkCloseStart::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
-    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkFrameStart::Serialize(ns3::Buffer::Iterator start) const [member function]
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkCloseStart::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkFrameStart::SetPlinkFrameStart(ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields arg0) [member function]
-    cls.add_method('SetPlinkFrameStart', 
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkCloseStart::SetPlinkCloseStart(ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields arg0) [member function]
+    cls.add_method('SetPlinkCloseStart', 
                    'void', 
-                   [param('ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields', 'arg0')])
-    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkFrameStart::SetPlinkFrameSubtype(uint8_t subtype) [member function]
-    cls.add_method('SetPlinkFrameSubtype', 
+                   [param('ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields', 'arg0')])
+    return
+
+def register_Ns3Dot11sPeerLinkCloseStartPlinkCloseStartFields_methods(root_module, cls):
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields::PlinkCloseStartFields() [constructor]
+    cls.add_constructor([])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields::PlinkCloseStartFields(ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields const &', 'arg0')])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields::meshId [variable]
+    cls.add_instance_attribute('meshId', 'ns3::dot11s::IeMeshId', is_const=False)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkCloseStart::PlinkCloseStartFields::protocol [variable]
+    cls.add_instance_attribute('protocol', 'ns3::dot11s::IePeeringProtocol', is_const=False)
+    return
+
+def register_Ns3Dot11sPeerLinkConfirmStart_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PeerLinkConfirmStart() [constructor]
+    cls.add_constructor([])
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkConfirmStart::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields ns3::dot11s::PeerLinkConfirmStart::GetFields() const [member function]
+    cls.add_method('GetFields', 
+                   'ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields', 
+                   [], 
+                   is_const=True)
+    ## peer-link-frame.h (module 'mesh'): ns3::TypeId ns3::dot11s::PeerLinkConfirmStart::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkConfirmStart::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): static ns3::TypeId ns3::dot11s::PeerLinkConfirmStart::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkConfirmStart::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('uint8_t', 'subtype')])
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkConfirmStart::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkConfirmStart::SetPlinkConfirmStart(ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields arg0) [member function]
+    cls.add_method('SetPlinkConfirmStart', 
+                   'void', 
+                   [param('ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields', 'arg0')])
     return
 
-def register_Ns3Dot11sPeerLinkFrameStartPlinkFrameStartFields_methods(root_module, cls):
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::PlinkFrameStartFields() [constructor]
+def register_Ns3Dot11sPeerLinkConfirmStartPlinkConfirmStartFields_methods(root_module, cls):
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::PlinkConfirmStartFields() [constructor]
     cls.add_constructor([])
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::PlinkFrameStartFields(ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields const &', 'arg0')])
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::aid [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::PlinkConfirmStartFields(ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields const &', 'arg0')])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::aid [variable]
     cls.add_instance_attribute('aid', 'uint16_t', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::capability [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::capability [variable]
+    cls.add_instance_attribute('capability', 'uint16_t', is_const=False)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::config [variable]
+    cls.add_instance_attribute('config', 'ns3::dot11s::IeConfiguration', is_const=False)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::protocol [variable]
+    cls.add_instance_attribute('protocol', 'ns3::dot11s::IePeeringProtocol', is_const=False)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkConfirmStart::PlinkConfirmStartFields::rates [variable]
+    cls.add_instance_attribute('rates', 'ns3::SupportedRates', is_const=False)
+    return
+
+def register_Ns3Dot11sPeerLinkOpenStart_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PeerLinkOpenStart() [constructor]
+    cls.add_constructor([])
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkOpenStart::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields ns3::dot11s::PeerLinkOpenStart::GetFields() const [member function]
+    cls.add_method('GetFields', 
+                   'ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields', 
+                   [], 
+                   is_const=True)
+    ## peer-link-frame.h (module 'mesh'): ns3::TypeId ns3::dot11s::PeerLinkOpenStart::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): uint32_t ns3::dot11s::PeerLinkOpenStart::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): static ns3::TypeId ns3::dot11s::PeerLinkOpenStart::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkOpenStart::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkOpenStart::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## peer-link-frame.h (module 'mesh'): void ns3::dot11s::PeerLinkOpenStart::SetPlinkOpenStart(ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields arg0) [member function]
+    cls.add_method('SetPlinkOpenStart', 
+                   'void', 
+                   [param('ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields', 'arg0')])
+    return
+
+def register_Ns3Dot11sPeerLinkOpenStartPlinkOpenStartFields_methods(root_module, cls):
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::PlinkOpenStartFields() [constructor]
+    cls.add_constructor([])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::PlinkOpenStartFields(ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields const &', 'arg0')])
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::capability [variable]
     cls.add_instance_attribute('capability', 'uint16_t', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::config [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::config [variable]
     cls.add_instance_attribute('config', 'ns3::dot11s::IeConfiguration', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::meshId [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::meshId [variable]
     cls.add_instance_attribute('meshId', 'ns3::dot11s::IeMeshId', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::protocol [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::protocol [variable]
     cls.add_instance_attribute('protocol', 'ns3::dot11s::IePeeringProtocol', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::rates [variable]
+    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkOpenStart::PlinkOpenStartFields::rates [variable]
     cls.add_instance_attribute('rates', 'ns3::SupportedRates', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::reasonCode [variable]
-    cls.add_instance_attribute('reasonCode', 'uint16_t', is_const=False)
-    ## peer-link-frame.h (module 'mesh'): ns3::dot11s::PeerLinkFrameStart::PlinkFrameStartFields::subtype [variable]
-    cls.add_instance_attribute('subtype', 'uint8_t', is_const=False)
     return
 
 def register_Ns3Dot11sPeerManagementProtocol_methods(root_module, cls):
@@ -11889,6 +12598,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_dot11s(module.get_submodule('dot11s'), root_module)
     register_functions_ns3_flame(module.get_submodule('flame'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
@@ -11904,6 +12614,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_dot11s(module, root_module):
     ## ie-dot11s-id.h (module 'mesh'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::dot11s::MakeIeMeshIdChecker() [free function]
     module.add_function('MakeIeMeshIdChecker', 
diff -Naur ns-3.23/src/mesh/doc/Makefile ns-3.24/src/mesh/doc/Makefile
--- ns-3.23/src/mesh/doc/Makefile	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/mesh/doc/Makefile	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,179 @@
+EPSTOPDF = epstopdf
+DIA = dia
+DOT = dot
+CONVERT = convert -density 250
+
+
+SOURCE = source
+FIGURES = $(SOURCE)/figures
+
+# specify dia figures from which .png and .pdf figures need to be built
+
+IMAGES_DIA = \
+
+# specify eps figures from which .png and .pdf figures need to be built
+
+IMAGES_EPS = \
+
+# rescale pdf figures as necessary
+
+IMAGES_NOBUILD = 
+# IMAGES_NOBUILD = $(FIGURES)/fading_pedestrian.png \
+
+IMAGES_BUILD = \
+	${IMAGES_DIA:.dia=.eps} \
+	${IMAGES_DIA:.dia=.png} \
+	${IMAGES_DIA:.dia=.pdf} \
+	${IMAGES_EPS:.eps=.png} \
+	${IMAGES_EPS:.eps=.pdf} 
+
+
+IMAGES = $(IMAGES_NOBUILD) $(IMAGES_BUILD)
+
+RESCALE = ../../../utils/rescale-pdf.sh
+
+%.eps : %.dia; $(DIA) -t eps $< -e $@
+%.png : %.dia; $(DIA) -t png $< -e $@
+%.png : %.eps; $(CONVERT) $< $@
+%.pdf : %.eps
+	$(EPSTOPDF) $< -o=$@
+	if test x$($@_width) != x; then $(RESCALE) $($@_width) $@ ; fi
+
+
+# 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) 
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+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)/*
+	-rm -f $(IMAGES_BUILD)
+
+
+images: $(IMAGES_NOBUILD) $(IMAGES_BUILD)
+
+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 ns-3.23/src/mesh/doc/mesh.rst ns-3.24/src/mesh/doc/mesh.rst
--- ns-3.23/src/mesh/doc/mesh.rst	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/doc/mesh.rst	1969-12-31 16:00:00.000000000 -0800
@@ -1,16 +0,0 @@
-.. include:: replace.txt
-
-Mesh NetDevice
---------------
-
-*Placeholder chapter*
-
-The Mesh NetDevice based on 802.11s was added in *ns-3.6*. An overview
-presentation by Kirill Andreev was published at the wns-3 workshop
-in 2009: `<http://www.nsnam.org/wiki/Wns3-2009>`_.
-
-An overview paper is available at:
-`<https://www.nsnam.org/workshops/wns3-2010/dot11s.pdf>`_.
-
-As of ns-3.23 release, the model has been slightly updated to the 802.11s-2012
-standard with regard to packet formats.
diff -Naur ns-3.23/src/mesh/doc/source/conf.py ns-3.24/src/mesh/doc/source/conf.py
--- ns-3.23/src/mesh/doc/source/conf.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/mesh/doc/source/conf.py	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,223 @@
+# -*- 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.pngmath']
+
+# 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 = 'mesh'
+
+# General information about the project.
+project = u'ns-3'
+copyright = u'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-dev'
+# The full version, including alpha/beta/rc tags.
+release = 'ns-3-dev'
+
+# 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 = 'default'
+
+# 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 = None
+
+# 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'
+
+# 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 = [
+#  ('mesh-testing', 'mesh-doc-testing.tex', u'Mesh Wi-Fi Testing Documentation', u'ns-3 project', 'manual'),
+#  ('mesh-design', 'mesh-doc-design.tex', u'Mesh Wi-Fi Design Documentation', u'ns-3 project', 'manual'),
+#  ('mesh-user', 'mesh-doc-user.tex', u'Mesh Wi-Fi User Documentation', u'ns-3 project', 'manual'),
+  ('mesh', 'mesh-module-doc.tex', u'The ns-3 Mesh Wi-Fi Module Documentation', 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 = None
+
+# 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 = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+
+# add page breaks in the pdf. Level 1 is for top-level sections, level 2 for subsections, and so on.
+pdf_break_level = 4 
+
+
+# -- 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-model-library', u'ns-3 Model Library',
+     [u'ns-3 project'], 1)
+]
diff -Naur ns-3.23/src/mesh/doc/source/mesh-design.rst ns-3.24/src/mesh/doc/source/mesh-design.rst
--- ns-3.23/src/mesh/doc/source/mesh-design.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/mesh/doc/source/mesh-design.rst	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,171 @@
+.. include:: replace.txt
+
+.. heading hierarchy:
+   ------------- Document Title
+   ************* Chapter (#)
+   ============= Section (#.#)
+   ############# Subsection (#.#.#)
+   ~~~~~~~~~~~~~ Paragraph (no number)
+
+Design Documentation
+********************
+
+Overview
+========
+
+The |ns3| `mesh` module extends the |ns3| `wifi` module to provide mesh
+networking capabilities according to the IEEE 802.11s standard [ieee80211s]_.
+
+The basic purpose of IEEE 802.11s is to define a mode of operation for 
+Wi-Fi that permits frames to be forwarded over multiple radio hops 
+transparent to higher layer protocols such as IP.  To accomplish this,
+mesh-capable stations form a `Mesh Basic Service Set` (MBSS) by running
+a pair-wise peering protocol to establish forwarding associations, and
+by running a routing protocol to find paths through the network.  A
+special gateway device called a `mesh gate` allows a MBSS to interconnect
+with a Distribution System (DS).
+
+The basic enhancements defined by IEEE 802.11s include:
+
+* discovery services
+* peering management
+* security 
+* beaconing and synchronization
+* the Mesh Coordination Function (MCF)
+* power management
+* channel switching
+* extended frame formats
+* path selection and forwarding
+* interworking (proxy mesh gateways)
+* intra-mesh congestion control, and
+* emergency service support.
+
+The |ns3| models implement only a subset of the above service extensions,
+focusing mainly on those items related to peering and routing/forwarding
+of data frames through the mesh.
+
+The Mesh NetDevice based on 802.11s D3.0 draft standard
+was added in *ns-3.6* and includes the Mesh Peering Management Protocol and
+HWMP (routing) protocol implementations. An overview
+presentation by Kirill Andreev was published at the Workshop on ns-3
+in 2009 [And09]_.  An overview paper is available at [And10]_.
+
+As of ns-3.23 release, the model has been updated to the 802.11s-2012
+standard [ieee80211s]_ with regard to packet formats, based on the 
+contribution in [Hep15]_.
+
+These changes include:
+
+* Category codes and the categories compliant to IEEE-802.11-2012 Table 8-38—Category values.  
+* Information Elements (An adjustment of the element ID values was needed according to Table 8-54 of IEEE-802.11-2012).
+* Mesh Peering Management element format changed according to IEEE-802.11-2012 Figure 8-370.
+* Mesh Configuration element format changed according to IEEE-802.11-2012 Figure 8-363.
+* PERR element format changed according to IEEE-802.11-2012 Figure 8-394.
+
+With these changes the messages of the Peering Management Protocol and Hybrid Wireless Mesh Protocol will be transmitted compliant to IEEE802.11-2012 and the resulting pcap trace files can be analyzed by Wireshark.
+
+The multi-interface mesh points are supported as an extension of IEEE draft version 3.0. Note that corresponding |ns3| mesh device helper creates a single interface station by default.
+
+Overview of IEEE 802.11s
+########################
+
+The implementation of the 802.11s extension consists of two main parts: the Peer Management Protocol (PMP) and Hybrid Wireless Mesh Protocol (HWMP).
+
+The tasks of the peer management protocol are the following:
+
+* opening links, detecting beacons, and starting peer link finite state machine, and
+* closing peer links due to transmission failures or beacon loss.
+
+If a peer link between the sender and receiver does not exist, a frame will be 
+dropped. So, the plug-in to the peer management protocol (PMP) is the first 
+in the list of ``ns3::MeshWifiInterfaceMacPlugins`` to be used.
+
+Peer management protocol
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+The peer management protocol consists of three main parts:
+
+* the protocol itself, ``ns3::dot11s::PeerManagementProtocol``, which keeps all active peer links on interfaces, handles all changes of their states and notifies the routing protocol about link failures.
+* the MAC plug-in, ``ns3::dot11s::PeerManagementProtocolMac``, which drops frames if there is no peer link, and peeks all needed information from management frames and information elements from beacons.
+* the peer link, ``ns3::dot11s::PeerLink``, which keeps finite state machine of each peer link, keeps beacon loss counter and counter of successive transmission failures.
+
+The procedure of closing a peer link is not described in detail in the 
+standard, so in the model the link may be closed by: 
+
+* beacon loss (see an appropriate attribute of ns3::dot11s::PeerLink class)
+* transmission failure – when a predefined number of successive packets have failed to transmit, the link will be closed.
+
+The peer management protocol is also responsible for beacon collision avoidance, because it keeps beacon timing elements from all neighbours. Note that the PeerManagementProtocol is not attached to the MeshPointDevice as a routing protocol, but the structure is similar: the upper tier of the protocol is 
+``ns3::dot11s::PeerManagementProtocol`` and its plug-in is 
+``ns3::dot11s::PeerManagementProtocolMac``.
+
+Hybrid Wireless Mesh Protocol
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+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.
+
+Scope and Limitations
+=====================
+
+Supported features
+##################
+
+* Peering Management Protocol (PMP), including link close heuristics and beacon collision avoidance.
+* Hybrid Wireless Mesh Protocol (HWMP), including proactive and reactive modes, unicast/broadcast propagation of management traffic, multi-radio extensions.
+* 802.11e compatible airtime link metric.
+
+Verification
+############
+
+* Comes with the custom Wireshark dissector.
+* Linux kernel mac80211 layer compatible message formats.
+
+Unsupported features
+####################
+
+* Mesh Coordinated Channel Access (MCCA).
+* Internetworking: mesh access point and mesh portal.
+* Security.
+* Power save.
+* Path maintenance (sending PREQ proactively before a path expires)
+* Though multi-radio operation is supported, no channel assignment protocol is proposed for now. (Correct channel switching is not implemented)
+
+Models yet to be created
+########################
+
+* Mesh access point (QoS + non-QoS?)
+* Mesh portal (QoS + non-QoS?)
+
+Open issues
+###########
+
+Data packets are not shown correctly in Wireshark
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+802.11 packets (e.g. using UDP, ARP) which are generated in the simulator ns-3 are not recognized correctly in Wireshark. They are erroneously detected as LLC packets by using the mesh module.
+The reason is that the IEEE 802.11 frame is of type Data frame/Subtype 0 (not QoS). However at the end of the header are some additional bytes (referring to QoS) which should not be there and therefore the frame can't be detected with Wireshark.
+
+Lack of modelled processing delays can cause repeated packet losses
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Bug 1605 describes scenarios for which no data packets can be delivered through
+the network due to synchronized losses.  The model is highly sensitive to
+the fact that node packet processing time is not modelled.  The following
+is adapted from the bug report.
+
+The symptoms are the following:
+
+1. Successful transmission is possible only between two nodes, or
+2. successful transmission is possible only in a chain topology
+
+The explanation is the following:
+
+1. Some node sends a packet (this may be broadcast ARP request, or broadcast HWMP PREQ or something else)
+2. Several nodes receive this packet
+3. The received packet goes immediately through the node and comes to outgoing wifi-queue (EDCA-TXOP)
+4. all received packets are forwarded immediately (due to wifi-backoff procedure, and backoff is not calculated in this case, because there was no previous concurrency in the network)
+5. Packets collide
+6. NO management data can pass through the network
+
+Adding random jitter to all packets that go from the mesh interface mac to 
+EdcaTxopN can remedy this problem.
diff -Naur ns-3.23/src/mesh/doc/source/mesh-references.rst ns-3.24/src/mesh/doc/source/mesh-references.rst
--- ns-3.23/src/mesh/doc/source/mesh-references.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/mesh/doc/source/mesh-references.rst	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,21 @@
+.. include:: replace.txt
+
+.. only:: html
+
+.. heading hierarchy:
+   ------------- Document Title
+   ************* Chapter (#)
+   ============= Section (#.#)
+   ############# Subsection (#.#.#)
+   ~~~~~~~~~~~~~ Paragraph (no number)
+
+References
+**********
+
+.. [And09] \K. Andreev, `Realization of IEEE802.11s draft standard in NS-3 <http://www.nsnam.org/wiki/Wns3-2009>`_.
+
+.. [And10] \K. Andreev and \P. Boyko, `IEEE 802.11s Mesh Networking NS-3 Model <http://www.nsnam.org/workshops/wns3-2010/dot11s.pdf>`_.
+
+.. [Hep15] \C. Hepner and \A. Witt and \R. Muenzner, `Validation of the ns-3 802.11s model and proposed changes compliant to IEEE 802.11-2012 <https://www.nsnam.org/wp-content/uploads/2015/05/WNS3_2015_submission_33.pdf>`_, Poster at 2015 Workshop on ns-3, May 2015.
+
+.. [ieee80211s] IEEE Standard for Information Technology, Telecommunications and information exchange between systems, Local and metropolitan area networks, Specific requirements,  Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) specifications, Amendment 10: Mesh Networking, 10 September 2011.
diff -Naur ns-3.23/src/mesh/doc/source/mesh.rst ns-3.24/src/mesh/doc/source/mesh.rst
--- ns-3.23/src/mesh/doc/source/mesh.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/mesh/doc/source/mesh.rst	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,9 @@
+Wi-Fi Mesh Module Documentation
+-------------------------------
+
+.. toctree::
+
+    mesh-design
+    mesh-user
+    mesh-testing
+    mesh-references
diff -Naur ns-3.23/src/mesh/doc/source/mesh-testing.rst ns-3.24/src/mesh/doc/source/mesh-testing.rst
--- ns-3.23/src/mesh/doc/source/mesh-testing.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/mesh/doc/source/mesh-testing.rst	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,13 @@
+.. include:: replace.txt
+.. highlight:: bash
+
+.. heading hierarchy:
+   ------------- Document Title
+   ************* Chapter (#)
+   ============= Section (#.#)
+   ############# Subsection (#.#.#)
+   ~~~~~~~~~~~~~ Paragraph (no number)
+
+Testing Documentation
+*********************
+
diff -Naur ns-3.23/src/mesh/doc/source/mesh-user.rst ns-3.24/src/mesh/doc/source/mesh-user.rst
--- ns-3.23/src/mesh/doc/source/mesh-user.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/mesh/doc/source/mesh-user.rst	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,17 @@
+.. include:: replace.txt
+.. highlight:: cpp
+
+.. heading hierarchy:
+   ------------- Document Title
+   ************* Chapter (#)
+   ============= Section (#.#)
+   ############# Subsection (#.#.#)
+   ~~~~~~~~~~~~~ Paragraph (no number)
+
+
+User Documentation
+******************
+
+Using the MeshNetDevice
+=======================
+
diff -Naur ns-3.23/src/mesh/doc/source/replace.txt ns-3.24/src/mesh/doc/source/replace.txt
--- ns-3.23/src/mesh/doc/source/replace.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/mesh/doc/source/replace.txt	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,3 @@
+.. |ns3| replace:: *ns-3*
+
+.. |ns2| replace:: *ns-2*
diff -Naur ns-3.23/src/mesh/examples/wscript ns-3.24/src/mesh/examples/wscript
--- ns-3.23/src/mesh/examples/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/examples/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -1,5 +1,5 @@
 ## -*- 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'])
+    obj = bld.create_ns3_program('mesh', ['internet', 'mobility', 'wifi', 'mesh', 'applications'])
     obj.source = 'mesh.cc'
diff -Naur ns-3.23/src/mesh/helper/dot11s/dot11s-installer.cc ns-3.24/src/mesh/helper/dot11s/dot11s-installer.cc
--- ns-3.23/src/mesh/helper/dot11s/dot11s-installer.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/helper/dot11s/dot11s-installer.cc	2015-09-15 11:18:44.000000000 -0700
@@ -31,7 +31,8 @@
 Dot11sStack::GetTypeId ()
 {
   static TypeId tid = TypeId ("ns3::Dot11sStack")
-    .SetParent<Object> ()
+    .SetParent<MeshStack> ()
+    .SetGroupName ("Mesh")
     .AddConstructor<Dot11sStack> ()
     .AddAttribute ("Root", 
                    "The MAC address of root mesh point.",
diff -Naur ns-3.23/src/mesh/helper/flame/flame-installer.cc ns-3.24/src/mesh/helper/flame/flame-installer.cc
--- ns-3.23/src/mesh/helper/flame/flame-installer.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/helper/flame/flame-installer.cc	2015-09-15 11:18:44.000000000 -0700
@@ -32,7 +32,8 @@
 FlameStack::GetTypeId ()
 {
   static TypeId tid = TypeId ("ns3::FlameStack")
-    .SetParent<Object> ()
+    .SetParent<MeshStack> ()
+    .SetGroupName ("Mesh")
     .AddConstructor<FlameStack> ();
   return tid;
 }
diff -Naur ns-3.23/src/mesh/helper/mesh-stack-installer.cc ns-3.24/src/mesh/helper/mesh-stack-installer.cc
--- ns-3.23/src/mesh/helper/mesh-stack-installer.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/mesh/helper/mesh-stack-installer.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,38 @@
+/* -*- 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>
+ */
+
+#include "ns3/mesh-stack-installer.h"
+
+namespace ns3
+{
+NS_OBJECT_ENSURE_REGISTERED (MeshStack);
+  
+TypeId
+MeshStack::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::MeshStack")
+    .SetParent<Object> ()
+    .SetGroupName ("Mesh")
+    // No AddConstructor because this is an abstract class.
+    ;
+  return tid;
+}
+
+} // namespace ns3
diff -Naur ns-3.23/src/mesh/helper/mesh-stack-installer.h ns-3.24/src/mesh/helper/mesh-stack-installer.h
--- ns-3.23/src/mesh/helper/mesh-stack-installer.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/helper/mesh-stack-installer.h	2015-09-15 11:18:44.000000000 -0700
@@ -35,6 +35,10 @@
 class MeshStack : public Object
 {
 public:
+  /// \brief Register this type.
+  /// \return The TypeId.
+  static TypeId GetTypeId (void);
+  
   ///\brief Installs mesh stack. needed by helper only
   virtual bool InstallStack (Ptr<MeshPointDevice> mp) = 0;
   /// Report statistics of a given mesh point
diff -Naur ns-3.23/src/mesh/model/dot11s/dot11s-mac-header.cc ns-3.24/src/mesh/model/dot11s/dot11s-mac-header.cc
--- ns-3.23/src/mesh/model/dot11s/dot11s-mac-header.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/dot11s-mac-header.cc	2015-09-15 11:18:44.000000000 -0700
@@ -164,9 +164,9 @@
 void
 MeshHeader::Print (std::ostream &os) const
 {
-  os << "flags = " << (uint16_t) m_meshFlags << std::endl << "ttl = " << (uint16_t) m_meshTtl 
-     << std::endl << "seqno = " << m_meshSeqno << std::endl<< "addr4 = " << m_addr4 << std::endl
-     << "addr5 = " << m_addr5 << std::endl << "addr6 = " << m_addr6 << std::endl;
+  os << "flags=" << (uint16_t) m_meshFlags << ", ttl=" << (uint16_t) m_meshTtl 
+     << ", seqno=" << m_meshSeqno << ", addr4=" << m_addr4 
+     << ", addr5=" << m_addr5 << ", addr6=" << m_addr6;
 }
 bool
 operator== (const MeshHeader & a, const MeshHeader & b)
diff -Naur ns-3.23/src/mesh/model/dot11s/hwmp-protocol.h ns-3.24/src/mesh/model/dot11s/hwmp-protocol.h
--- ns-3.23/src/mesh/model/dot11s/hwmp-protocol.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/hwmp-protocol.h	2015-09-15 11:18:44.000000000 -0700
@@ -132,9 +132,13 @@
 
   ///\name Interaction with HWMP MAC plugin
   //\{
+  ///\brief Handler for receiving Path Request
   void ReceivePreq (IePreq preq, Mac48Address from, uint32_t interface, Mac48Address fromMp, uint32_t metric);
+  ///\brief Handler for receiving Path Reply
   void ReceivePrep (IePrep prep, Mac48Address from, uint32_t interface, Mac48Address fromMp, uint32_t metric);
+  ///\brief Handler for receiving Path Error
   void ReceivePerr (std::vector<FailedDestination>, Mac48Address from, uint32_t interface, Mac48Address fromMp);
+   ///\brief Send Path Reply
   void SendPrep (
     Mac48Address src,
     Mac48Address dst,
@@ -263,7 +267,7 @@
   std::vector<QueuedPacket> m_rqueue;
   
   /// \name HWMP-protocol parameters
-  /// These are all Aattributes
+  /// These are all Attributes
   /// \{
   uint16_t m_maxQueueSize;
   uint8_t m_dot11MeshHWMPmaxPREQretries;
diff -Naur ns-3.23/src/mesh/model/dot11s/hwmp-protocol-mac.cc ns-3.24/src/mesh/model/dot11s/hwmp-protocol-mac.cc
--- ns-3.23/src/mesh/model/dot11s/hwmp-protocol-mac.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/hwmp-protocol-mac.cc	2015-09-15 11:18:44.000000000 -0700
@@ -203,6 +203,7 @@
   meshHdr.SetMeshTtl (tag.GetTtl ());
   packet->AddHeader (meshHdr);
   header.SetAddr1 (tag.GetAddress ());
+  header.SetQosMeshControlPresent ();
   return true;
 }
 WifiActionHeader
diff -Naur ns-3.23/src/mesh/model/dot11s/hwmp-tag.cc ns-3.24/src/mesh/model/dot11s/hwmp-tag.cc
--- ns-3.23/src/mesh/model/dot11s/hwmp-tag.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/hwmp-tag.cc	2015-09-15 11:18:44.000000000 -0700
@@ -86,7 +86,11 @@
 TypeId
 HwmpTag::GetTypeId ()
 {
-  static TypeId tid = TypeId ("ns3::dot11s::HwmpTag").SetParent<Tag> ().AddConstructor<HwmpTag> ().SetGroupName ("Mesh");
+  static TypeId tid = TypeId ("ns3::dot11s::HwmpTag")
+    .SetParent<Tag> ()
+    .SetGroupName ("Mesh")
+    .AddConstructor<HwmpTag> ()
+    ;
   return tid;
 }
 
diff -Naur ns-3.23/src/mesh/model/dot11s/ie-dot11s-beacon-timing.cc ns-3.24/src/mesh/model/dot11s/ie-dot11s-beacon-timing.cc
--- ns-3.23/src/mesh/model/dot11s/ie-dot11s-beacon-timing.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/ie-dot11s-beacon-timing.cc	2015-09-15 11:18:44.000000000 -0700
@@ -130,14 +130,13 @@
 void
 IeBeaconTiming::Print (std::ostream& os) const
 {
-  os << std::endl << "<information_element id=" << ElementId () << ">" << std::endl;
-  os << "Number of units: " << (uint16_t) m_numOfUnits << std::endl;
+  os << "BeaconTiming=(Number of units=" << (uint16_t) m_numOfUnits;
   for (NeighboursTimingUnitsList::const_iterator j = m_neighbours.begin (); j != m_neighbours.end (); j++)
     {
-      os << "AID=" << (uint16_t)(*j)->GetAid () << ", Last beacon was at " << (*j)->GetLastBeacon ()
-         << ", with beacon interval " << (*j)->GetBeaconInterval () << std::endl;
+      os << "(AID=" << (uint16_t)(*j)->GetAid () << ", Last beacon at=" << (*j)->GetLastBeacon ()
+         << ", with beacon interval=" << (*j)->GetBeaconInterval () << ")";
     }
-  os << "</information_element>" << std::endl;
+  os << ")";
 }
 void
 IeBeaconTiming::SerializeInformationField (Buffer::Iterator i) const
diff -Naur ns-3.23/src/mesh/model/dot11s/ie-dot11s-configuration.cc ns-3.24/src/mesh/model/dot11s/ie-dot11s-configuration.cc
--- ns-3.23/src/mesh/model/dot11s/ie-dot11s-configuration.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/ie-dot11s-configuration.cc	2015-09-15 11:18:44.000000000 -0700
@@ -151,15 +151,14 @@
 void
 IeConfiguration::Print (std::ostream& os) const
 {
-  os << std::endl << "<information_element id=" << ElementId () << ">" << std::endl;
-  os << "Number of neighbors:               = " << (uint16_t) m_neighbors
-     << std::endl << "Active Path Selection Protocol ID: = " << (uint32_t) m_APSPId
-     << std::endl << "Active Path Selection Metric ID:   = " << (uint32_t) m_APSMId
-     << std::endl << "Congestion Control Mode ID:        = " << (uint32_t) m_CCMId
-     << std::endl << "Synchronize protocol ID:           = " << (uint32_t) m_SPId
-     << std::endl << "Authentication protocol ID:        = " << (uint32_t) m_APId
-     << std::endl << "Capabilities:                      = " << m_meshCap.GetUint8 () << std::endl;
-  os << "</information_element>" << std::endl;
+  os << "MeshConfiguration=(neighbors=" << (uint16_t) m_neighbors
+     << ", Active Path Selection Protocol ID=" << (uint32_t) m_APSPId
+     << ", Active Path Selection Metric ID=" << (uint32_t) m_APSMId
+     << ", Congestion Control Mode ID=" << (uint32_t) m_CCMId
+     << ", Synchronize protocol ID=" << (uint32_t) m_SPId
+     << ", Authentication protocol ID=" << (uint32_t) m_APId
+     << ", Capabilities=" << m_meshCap.GetUint8 ();
+  os << ")";
 }
 void
 IeConfiguration::SetRouting (dot11sPathSelectionProtocol routingId)
diff -Naur ns-3.23/src/mesh/model/dot11s/ie-dot11s-id.cc ns-3.24/src/mesh/model/dot11s/ie-dot11s-id.cc
--- ns-3.23/src/mesh/model/dot11s/ie-dot11s-id.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/ie-dot11s-id.cc	2015-09-15 11:18:44.000000000 -0700
@@ -115,9 +115,7 @@
 void
 IeMeshId::Print (std::ostream& os) const
 {
-  os << std::endl << "<information_element id=" << ElementId () << ">" << std::endl;
-  os << "meshId =  " << PeekString ();
-  os << "</information_element>" << std::endl;
+  os << "MeshId=(meshId=" << PeekString () << ")";
 }
 bool
 operator== (const IeMeshId & a, const IeMeshId & b)
diff -Naur ns-3.23/src/mesh/model/dot11s/ie-dot11s-metric-report.cc ns-3.24/src/mesh/model/dot11s/ie-dot11s-metric-report.cc
--- ns-3.23/src/mesh/model/dot11s/ie-dot11s-metric-report.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/ie-dot11s-metric-report.cc	2015-09-15 11:18:44.000000000 -0700
@@ -66,9 +66,7 @@
 void
 IeLinkMetricReport::Print (std::ostream& os) const
 {
-  os << std::endl << "<information_element id=" << ElementId () << ">" << std::endl;
-  os << "Metric = " << m_metric;
-  os << "</information_element>" << std::endl;
+  os << "Metric=" << m_metric;
 }
 bool
 operator== (const IeLinkMetricReport & a, const IeLinkMetricReport & b)
diff -Naur ns-3.23/src/mesh/model/dot11s/ie-dot11s-peering-protocol.cc ns-3.24/src/mesh/model/dot11s/ie-dot11s-peering-protocol.cc
--- ns-3.23/src/mesh/model/dot11s/ie-dot11s-peering-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/ie-dot11s-peering-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -50,9 +50,7 @@
 void
 IePeeringProtocol::Print (std::ostream& os) const
 {
-  os << std::endl << "<information_element id=" << ElementId () << ">" << std::endl;
-  os << "peering protocol = " << m_protocol;
-  os << "</information_element>" << std::endl;
+  os << "PeeringProtocol=(peering protocol=" << m_protocol << ")";
 }
 std::ostream &
 operator << (std::ostream &os, const IePeeringProtocol &a)
diff -Naur ns-3.23/src/mesh/model/dot11s/ie-dot11s-peer-management.cc ns-3.24/src/mesh/model/dot11s/ie-dot11s-peer-management.cc
--- ns-3.23/src/mesh/model/dot11s/ie-dot11s-peer-management.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/ie-dot11s-peer-management.cc	2015-09-15 11:18:44.000000000 -0700
@@ -151,13 +151,12 @@
 void
 IePeerManagement::Print (std::ostream& os) const
 {
-  os << std::endl << "<information_element id=" << ElementId () << ">" << std::endl;
-  os << " Subtype:      = " << (uint16_t) m_subtype << std::endl;
-  os << " Length:       = " << (uint16_t) m_length << std::endl;
-  os << " LocalLinkId:  = " << m_localLinkId << std::endl;
-  os << " PeerLinkId:   = " << m_peerLinkId << std::endl;
-  os << " ReasonCode:   = " << m_reasonCode << std::endl;
-  os << "</information_element>" << std::endl;
+  os << "PeerMgmt=(Subtype=" << (uint16_t) m_subtype
+     << ", Length=" << (uint16_t) m_length
+     << ", LocalLinkId=" << m_localLinkId
+     << ", PeerLinkId=" << m_peerLinkId
+     << ", ReasonCode=" << m_reasonCode
+     << ")";
 }
 bool
 operator== (const IePeerManagement & a, const IePeerManagement & b)
diff -Naur ns-3.23/src/mesh/model/dot11s/ie-dot11s-perr.cc ns-3.24/src/mesh/model/dot11s/ie-dot11s-perr.cc
--- ns-3.23/src/mesh/model/dot11s/ie-dot11s-perr.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/ie-dot11s-perr.cc	2015-09-15 11:18:44.000000000 -0700
@@ -37,14 +37,13 @@
 void
 IePerr::Print (std::ostream &os) const
 {
-  os << std::endl << "<information_element id=" << ElementId () << ">" << std::endl;
-  os << "Number of failed destinations: = " << m_addressUnits.size ();
+  os << "PERR=(Number of failed destinations=" << m_addressUnits.size ();
   for (unsigned int j = 0; j < m_addressUnits.size (); j++)
     {
-      os << "Failed destination address: = " << m_addressUnits[j].destination << ", sequence number = "
-         << m_addressUnits[j].seqnum;
+      os << "(Failed destination address=" << m_addressUnits[j].destination << ", sequence number = "
+         << m_addressUnits[j].seqnum << ")";
     }
-  os << std::endl << "</information_element>" << std::endl;
+  os << ")";
 }
 uint8_t
 IePerr::GetNumOfDest () const
diff -Naur ns-3.23/src/mesh/model/dot11s/ie-dot11s-prep.cc ns-3.24/src/mesh/model/dot11s/ie-dot11s-prep.cc
--- ns-3.23/src/mesh/model/dot11s/ie-dot11s-prep.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/ie-dot11s-prep.cc	2015-09-15 11:18:44.000000000 -0700
@@ -189,12 +189,10 @@
 void
 IePrep::Print (std::ostream& os) const
 {
-  os << std::endl << "<information_element id=" << ElementId () << ">" << std::endl;
-  os << "Flags:        = " << m_flags << std::endl << "Hopcount:     = " << m_hopcount << std::endl << "TTL:          = " << m_ttl
-     << std::endl<< "Destination:  = " << m_destinationAddress << std::endl << "Dest. seqnum: = " << m_destSeqNumber
-     << std::endl << "Lifetime:     = " << m_lifetime << std::endl<< "Metric:       = " << m_metric << std::endl << "Originator:   = "
-     << m_originatorAddress << std::endl << "Orig. seqnum: = " << m_originatorSeqNumber << std::endl;
-  os << "</information_element>" << std::endl;
+  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 << ")";
 }
 bool
 operator== (const IePrep & a, const IePrep & b)
diff -Naur ns-3.23/src/mesh/model/dot11s/ie-dot11s-preq.cc ns-3.24/src/mesh/model/dot11s/ie-dot11s-preq.cc
--- ns-3.23/src/mesh/model/dot11s/ie-dot11s-preq.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/ie-dot11s-preq.cc	2015-09-15 11:18:44.000000000 -0700
@@ -316,20 +316,19 @@
 void
 IePreq::Print (std::ostream &os) const
 {
-  os << std::endl << "<information_element id=" << ElementId () << ">" << std::endl;
-  os << " originator address  = " << m_originatorAddress << std::endl;
-  os << " TTL                 = " << (uint16_t) m_ttl << std::endl;
-  os << " hop count           = " << (uint16_t) m_hopCount << std::endl;
-  os << " metric              = " << m_metric << std::endl;
-  os << " seqno               = " << m_originatorSeqNumber << std::endl;
-  os << " lifetime            = " << m_lifetime << std::endl;
-  os << " preq ID             = " << m_preqId << std::endl;
-  os << " Destinations are:" << std::endl;
+  os << "PREQ=(originator address=" << m_originatorAddress
+     << ", TTL=" << (uint16_t) m_ttl
+     << ", hop count=" << (uint16_t) m_hopCount
+     << ", metric=" << m_metric
+     << ", seqno=" << m_originatorSeqNumber
+     << ", lifetime=" << m_lifetime
+     << ", preq ID=" << m_preqId
+     << ", Destinations=(";
   for (int j = 0; j < m_destCount; j++)
     {
-      os << "    " << m_destinations[j]->GetDestinationAddress () << std::endl;
+      os << m_destinations[j]->GetDestinationAddress ();
     }
-  os << "</information_element>" << std::endl;
+  os << ")";
 }
 std::vector<Ptr<DestinationAddressUnit> >
 IePreq::GetDestinationList ()
diff -Naur ns-3.23/src/mesh/model/dot11s/ie-dot11s-rann.cc ns-3.24/src/mesh/model/dot11s/ie-dot11s-rann.cc
--- ns-3.23/src/mesh/model/dot11s/ie-dot11s-rann.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/ie-dot11s-rann.cc	2015-09-15 11:18:44.000000000 -0700
@@ -151,14 +151,13 @@
 void
 IeRann::Print (std::ostream &os) const
 {
-  os << std::endl << "<information_element id=" << ElementId () << ">" << std::endl;
-  os << "  flags              = " << (int) m_flags << std::endl;
-  os << "  hop count          = " << (int) m_hopcount << std::endl;
-  os << "  TTL                = " << (int) m_ttl << std::endl;
-  os << "  originator address = " << m_originatorAddress << std::endl;
-  os << "  dst seq. number    = " << m_destSeqNumber << std::endl;
-  os << "  metric             = " << m_metric << std::endl;
-  os << "</information_element>" << std::endl;
+  os << "RANN=(flags=" << (int) m_flags
+     << ", hop count=" << (int) m_hopcount
+     << ", TTL=" << (int) m_ttl
+     << ", originator address=" << m_originatorAddress
+     << ", dst seq. number=" << m_destSeqNumber
+     << ", metric=" << m_metric
+     << ")";
 }
 
 bool
diff -Naur ns-3.23/src/mesh/model/dot11s/peer-link-frame.cc ns-3.24/src/mesh/model/dot11s/peer-link-frame.cc
--- ns-3.23/src/mesh/model/dot11s/peer-link-frame.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/peer-link-frame.cc	2015-09-15 11:18:44.000000000 -0700
@@ -26,204 +26,281 @@
 
 namespace ns3 {
 namespace dot11s {
-NS_OBJECT_ENSURE_REGISTERED (PeerLinkFrameStart);
+NS_OBJECT_ENSURE_REGISTERED (PeerLinkOpenStart);
 
-PeerLinkFrameStart::PeerLinkFrameStart () :
-  m_subtype (255), m_capability (0), m_aid (0), m_rates (SupportedRates ()), m_meshId (),
+PeerLinkOpenStart::PeerLinkOpenStart () :
+  m_capability (0), m_rates (SupportedRates ()), m_meshId (),
   m_config (IeConfiguration ())
 {
 }
 void
-PeerLinkFrameStart::SetPlinkFrameSubtype (uint8_t subtype)
+PeerLinkOpenStart::SetPlinkOpenStart (PeerLinkOpenStart::PlinkOpenStartFields fields)
 {
-  m_subtype = subtype;
+  m_capability = fields.capability;
+  m_rates = fields.rates;
+  m_meshId = fields.meshId;
+  m_config = fields.config;
+}
+PeerLinkOpenStart::PlinkOpenStartFields
+PeerLinkOpenStart::GetFields () const
+{
+  PlinkOpenStartFields retval;
+  /// \todo protocol version:
+  retval.capability = m_capability;
+  retval.rates = m_rates;
+  retval.meshId = m_meshId;
+  retval.config = m_config;
+  
+  return retval;
+}
+TypeId
+PeerLinkOpenStart::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::dot11s::PeerLinkOpenStart")
+    .SetParent<Header> ()
+    .SetGroupName ("Mesh")
+    .AddConstructor<PeerLinkOpenStart> ()
+  ;
+  return tid;
+}
+TypeId
+PeerLinkOpenStart::GetInstanceTypeId () const
+{
+  return GetTypeId ();
 }
 void
-PeerLinkFrameStart::SetPlinkFrameStart (PeerLinkFrameStart::PlinkFrameStartFields fields)
+PeerLinkOpenStart::Print (std::ostream &os) const
 {
-  m_subtype = fields.subtype;
+  os << "capability=" << m_capability << ", rates=" << m_rates;
+  os << ", ";
+  m_meshId.Print (os);
+  os << ", ";
+  m_config.Print (os);
+}
+uint32_t
+PeerLinkOpenStart::GetSerializedSize () const
+{
+  uint32_t size =0; //Peering protocol
+  size += 2; //capability
+  size += m_rates.GetSerializedSize ();
+  size += m_rates.extended.GetSerializedSize ();
+  size += m_meshId.GetInformationFieldSize () + 2;
+  size += m_config.GetInformationFieldSize () + 2;
+  return size;
+}
+void
+PeerLinkOpenStart::Serialize (Buffer::Iterator start) const
+{
+  Buffer::Iterator i = start;
   
-  if (m_subtype != (uint8_t)(WifiActionHeader::PEER_LINK_CLOSE))
-    {
-      m_capability = fields.capability;
-    }
-  if (m_subtype == (uint8_t)(WifiActionHeader::PEER_LINK_CONFIRM))
-    {
-      m_aid = fields.aid;
-    }
-  if (m_subtype != (uint8_t)(WifiActionHeader::PEER_LINK_CLOSE))
-    {
-      m_rates = fields.rates;
-    }
-  if (m_subtype != (uint8_t)(WifiActionHeader::PEER_LINK_CONFIRM))
-    {
-      m_meshId = fields.meshId;
-    }
-  if (m_subtype != (uint8_t)(WifiActionHeader::PEER_LINK_CLOSE))
+  i.WriteHtolsbU16 (m_capability);
+  i = m_rates.Serialize (i);
+  i = m_rates.extended.Serialize (i);
+  i = m_meshId.Serialize (i);
+  i = m_config.Serialize (i);
+}
+uint32_t
+PeerLinkOpenStart::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+  
+  m_capability = i.ReadLsbtohU16 ();
+  i = m_rates.Deserialize (i);
+  i = m_rates.extended.DeserializeIfPresent (i);
+  uint8_t id = i.ReadU8 ();
+  uint8_t length = i.ReadU8 ();
+  m_meshId.DeserializeInformationField (i, length);
+  if ((m_meshId.ElementId () != (WifiInformationElementId) id) || (m_meshId.GetInformationFieldSize () != length))
+    {
+      NS_FATAL_ERROR ("Broken frame: Element ID does not match IE itself!");
+    }
+  i.Next (m_meshId.GetInformationFieldSize ());
+  id = i.ReadU8 ();
+  length = i.ReadU8 ();
+  m_config.DeserializeInformationField (i, length);
+  if ((m_config.ElementId () != (WifiInformationElementId) id) || (m_config.GetInformationFieldSize () != length))
     {
-      m_config = fields.config;
+      NS_FATAL_ERROR ("Broken frame: Element ID does not match IE itself!");
     }
-  else
+  i.Next (m_config.GetInformationFieldSize ());
+ 
+  return i.GetDistanceFrom (start);
+}
+bool
+operator== (const PeerLinkOpenStart & a, const PeerLinkOpenStart & b)
+{
+  return ((a.m_capability == b.m_capability)
+          && (a.m_meshId.IsEqual (b.m_meshId)) && (a.m_config == b.m_config));
+  
+}
+NS_OBJECT_ENSURE_REGISTERED (PeerLinkCloseStart);
+
+PeerLinkCloseStart::PeerLinkCloseStart () :
+  m_meshId ()
+{
+}
+void
+PeerLinkCloseStart::SetPlinkCloseStart (PeerLinkCloseStart::PlinkCloseStartFields fields)
+{
+  m_meshId = fields.meshId;
+}
+PeerLinkCloseStart::PlinkCloseStartFields
+PeerLinkCloseStart::GetFields () const
+{
+  PlinkCloseStartFields retval;
+  /// \todo protocol version:
+  retval.meshId = m_meshId;
+  
+  return retval;
+}
+TypeId
+PeerLinkCloseStart::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::dot11s::PeerLinkCloseStart")
+    .SetParent<Header> ()
+    .SetGroupName ("Mesh")
+    .AddConstructor<PeerLinkCloseStart> ()
+  ;
+  return tid;
+}
+TypeId
+PeerLinkCloseStart::GetInstanceTypeId () const
+{
+  return GetTypeId ();
+}
+void
+PeerLinkCloseStart::Print (std::ostream &os) const
+{
+  m_meshId.Print (os);
+}
+uint32_t
+PeerLinkCloseStart::GetSerializedSize () const
+{
+  uint32_t size =0; //Peering protocol
+  size += m_meshId.GetInformationFieldSize () + 2;
+  return size;
+}
+void
+PeerLinkCloseStart::Serialize (Buffer::Iterator start) const
+{
+  Buffer::Iterator i = start;
+  i = m_meshId.Serialize (i);
+}
+uint32_t
+PeerLinkCloseStart::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+  
+  uint8_t id = i.ReadU8 ();
+  uint8_t length = i.ReadU8 ();
+  m_meshId.DeserializeInformationField (i, length);
+  if ((m_meshId.ElementId () != (WifiInformationElementId) id) || (m_meshId.GetInformationFieldSize () != length))
     {
-      //reasonCode not used here
+      NS_FATAL_ERROR ("Broken frame: Element ID does not match IE itself!");
     }
+  i.Next (m_meshId.GetInformationFieldSize ());
+  return i.GetDistanceFrom (start);
 }
-PeerLinkFrameStart::PlinkFrameStartFields
-PeerLinkFrameStart::GetFields () const
+bool
+operator== (const PeerLinkCloseStart & a, const PeerLinkCloseStart & b)
+{
+  return ((a.m_meshId.IsEqual (b.m_meshId)));
+}
+NS_OBJECT_ENSURE_REGISTERED (PeerLinkConfirmStart);
+
+PeerLinkConfirmStart::PeerLinkConfirmStart () :
+  m_capability (0), m_aid (0), m_rates (SupportedRates ()),
+  m_config (IeConfiguration ())
 {
-  PlinkFrameStartFields retval;
+}
+void
+PeerLinkConfirmStart::SetPlinkConfirmStart (PeerLinkConfirmStart::PlinkConfirmStartFields fields)
+{
+  m_capability = fields.capability;
+  m_aid = fields.aid;
+  m_rates = fields.rates;
+  m_config = fields.config;
+}
+PeerLinkConfirmStart::PlinkConfirmStartFields
+PeerLinkConfirmStart::GetFields () const
+{
+  PlinkConfirmStartFields retval;
   /// \todo protocol version:
-  retval.subtype = m_subtype;
   retval.capability = m_capability;
   retval.aid = m_aid;
   retval.rates = m_rates;
-  retval.meshId = m_meshId;
   retval.config = m_config;
   
   return retval;
 }
 TypeId
-PeerLinkFrameStart::GetTypeId ()
+PeerLinkConfirmStart::GetTypeId ()
 {
-  static TypeId tid = TypeId ("ns3::dot11s::PeerLinkFrameStart")
+  static TypeId tid = TypeId ("ns3::dot11s::PeerLinkConfirmStart")
     .SetParent<Header> ()
     .SetGroupName ("Mesh")
-    .AddConstructor<PeerLinkFrameStart> ()
+    .AddConstructor<PeerLinkConfirmStart> ()
   ;
   return tid;
 }
 TypeId
-PeerLinkFrameStart::GetInstanceTypeId () const
+PeerLinkConfirmStart::GetInstanceTypeId () const
 {
   return GetTypeId ();
 }
 void
-PeerLinkFrameStart::Print (std::ostream &os) const
+PeerLinkConfirmStart::Print (std::ostream &os) const
 {
-  os << "subtype = " << (uint16_t) m_subtype << std::endl << "capability = " << m_capability << std::endl << "laid = "
-     << (uint16_t) m_aid << std::endl << "rates = " << m_rates << std::endl << "meshId = ";
-  m_meshId.Print (os);
-  os << std::endl << "configuration = ";
+  os << "capability=" << m_capability << ", rates=" << m_rates;
+  os << ", ";
   m_config.Print (os);
-  os << std::endl << "reason code = " << m_reasonCode;
 }
 uint32_t
-PeerLinkFrameStart::GetSerializedSize () const
+PeerLinkConfirmStart::GetSerializedSize () const
 {
   uint32_t size =0; //Peering protocol
-  NS_ASSERT (m_subtype < 4);
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
-    {
-      size += 2; //capability
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CONFIRM) == m_subtype)
-    {
-      size += 2; //AID of remote peer
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
-    {
-      size += m_rates.GetSerializedSize ();
-      size += m_rates.extended.GetSerializedSize ();
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CONFIRM) != m_subtype)
-    {
-      size += m_meshId.GetInformationFieldSize () + 2;
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
-    {
-      size += m_config.GetInformationFieldSize () + 2;
-    }
-  else
-    {
-      //reasonCode not used here
-    }
+  size += 2; //capability
+  size += 2; //AID of remote peer
+  size += m_rates.GetSerializedSize ();
+  size += m_rates.extended.GetSerializedSize ();
+  size += m_config.GetInformationFieldSize () + 2;
   return size;
 }
 void
-PeerLinkFrameStart::Serialize (Buffer::Iterator start) const
+PeerLinkConfirmStart::Serialize (Buffer::Iterator start) const
 {
   Buffer::Iterator i = start;
-  NS_ASSERT (m_subtype < 4);
   
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
-    {
-      i.WriteHtolsbU16 (m_capability);
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CONFIRM) == m_subtype)
-    {
-      i.WriteHtolsbU16 (m_aid);
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
-    {
-      i = m_rates.Serialize (i);
-      i = m_rates.extended.Serialize (i);
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CONFIRM) != m_subtype)
-    {
-      i = m_meshId.Serialize (i);
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
-    {
-      i = m_config.Serialize (i);
-    }
-  else
-    {
-      //reasonCode not used here
-    }
+  i.WriteHtolsbU16 (m_capability);
+  i.WriteHtolsbU16 (m_aid);
+  i = m_rates.Serialize (i);
+  i = m_rates.extended.Serialize (i);
+  i = m_config.Serialize (i);
 }
 uint32_t
-PeerLinkFrameStart::Deserialize (Buffer::Iterator start)
+PeerLinkConfirmStart::Deserialize (Buffer::Iterator start)
 {
   Buffer::Iterator i = start;
-  NS_ASSERT (m_subtype < 4);
   
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
-    {
-      m_capability = i.ReadLsbtohU16 ();
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CONFIRM) == m_subtype)
-    {
-      m_aid = i.ReadLsbtohU16 ();
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
+  m_capability = i.ReadLsbtohU16 ();
+  m_aid = i.ReadLsbtohU16 ();
+  i = m_rates.Deserialize (i);
+  i = m_rates.extended.DeserializeIfPresent (i);
+  uint8_t id = i.ReadU8 ();
+  uint8_t length = i.ReadU8 ();
+  m_config.DeserializeInformationField (i, length);
+  if ((m_config.ElementId () != (WifiInformationElementId) id) || (m_config.GetInformationFieldSize () != length))
     {
-      i = m_rates.Deserialize (i);
-      i = m_rates.extended.DeserializeIfPresent (i);
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CONFIRM) != m_subtype)
-    {
-      uint8_t id = i.ReadU8 ();
-      uint8_t length = i.ReadU8 ();
-      m_meshId.DeserializeInformationField (i, length);
-      if ((m_meshId.ElementId () != (WifiInformationElementId) id) || (m_meshId.GetInformationFieldSize () != length))
-        {
-          NS_FATAL_ERROR ("Broken frame: Element ID does not match IE itself!");
-        }
-      i.Next (m_meshId.GetInformationFieldSize ());
-    }
-  if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
-    {
-      uint8_t id = i.ReadU8 ();
-      uint8_t length = i.ReadU8 ();
-      m_config.DeserializeInformationField (i, length);
-      if ((m_config.ElementId () != (WifiInformationElementId) id) || (m_config.GetInformationFieldSize () != length))
-        {
-          NS_FATAL_ERROR ("Broken frame: Element ID does not match IE itself!");
-        }
-      i.Next (m_config.GetInformationFieldSize ());
-    }
-  else
-    {
-       //reasonCode not used here
+      NS_FATAL_ERROR ("Broken frame: Element ID does not match IE itself!");
     }
+  i.Next (m_config.GetInformationFieldSize ());
   return i.GetDistanceFrom (start);
 }
 bool
-operator== (const PeerLinkFrameStart & a, const PeerLinkFrameStart & b)
+operator== (const PeerLinkConfirmStart & a, const PeerLinkConfirmStart & b)
 {
-  return ((a.m_subtype == b.m_subtype) && (a.m_capability == b.m_capability) && (a.m_aid == b.m_aid)
-          && (a.m_meshId.IsEqual (b.m_meshId)) && (a.m_config == b.m_config));
-  
+  return ((a.m_capability == b.m_capability) && (a.m_aid == b.m_aid)
+          && (a.m_config == b.m_config));
 }
 } // namespace dot11s
 } // namespace ns3
diff -Naur ns-3.23/src/mesh/model/dot11s/peer-link-frame.h ns-3.24/src/mesh/model/dot11s/peer-link-frame.h
--- ns-3.23/src/mesh/model/dot11s/peer-link-frame.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/peer-link-frame.h	2015-09-15 11:18:44.000000000 -0700
@@ -28,41 +28,34 @@
 #include "ie-dot11s-id.h"
 namespace ns3
 {
-class MeshWifiInterfaceMac;
 namespace dot11s
 {
 /**
  * \ingroup dot11s
  *
- * \brief 802.11s Peer link management frame
+ * \brief 802.11s Peer link open management frame
  * 
- * Peer link management frame included the following (see chapters 7.4.12.1-7.4.12.3 of 802.11s):
- * - Subtype field
- * - Association ID field
+ * Peer link opent frame includes the following:
+ * - Capability
  * - Supported rates
  * - Mesh ID of mesh
+ * - Configuration
  */
-class PeerLinkFrameStart : public Header
+class PeerLinkOpenStart : public Header
 {
 public:
-  PeerLinkFrameStart ();
+  PeerLinkOpenStart ();
   ///\brief fields:
-  struct PlinkFrameStartFields
+  struct PlinkOpenStartFields
   {
-    uint8_t subtype;
-    IePeeringProtocol protocol; //Peering protocol version - in all subtypes - 3 octets
+    IePeeringProtocol protocol; //Peering protocol version - 3 octets
     uint16_t capability;        //open and confirm
-    uint16_t aid;               //confirm only
     SupportedRates rates;       //open and confirm
     IeMeshId meshId;            //open and close
     IeConfiguration config;     //open and confirm
-    uint16_t reasonCode;        //close only
   };
-  ///\attention: must be set before deserialize, before only multihop
-  //action header knows about subtype
-  void SetPlinkFrameSubtype (uint8_t subtype);
-  void SetPlinkFrameStart (PlinkFrameStartFields);
-  PlinkFrameStartFields GetFields () const;
+  void SetPlinkOpenStart (PlinkOpenStartFields);
+  PlinkOpenStartFields GetFields () const;
 
   // Inherited from header:
   static  TypeId   GetTypeId ();
@@ -73,22 +66,107 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
 private:
-  uint8_t m_subtype;
-  IePeeringProtocol m_protocol;
   uint16_t m_capability;
-  uint16_t m_aid;
   SupportedRates m_rates;
   IeMeshId m_meshId;
   IeConfiguration m_config;
-  uint16_t m_reasonCode;
 
-  friend bool operator== (const PeerLinkFrameStart & a, const PeerLinkFrameStart & b);
+  friend bool operator== (const PeerLinkOpenStart & a, const PeerLinkOpenStart & b);
+
+  PeerLinkOpenStart& operator= (const PeerLinkOpenStart &);
+  PeerLinkOpenStart (const PeerLinkOpenStart &);
+
+};
+
+bool operator== (const PeerLinkOpenStart & a, const PeerLinkOpenStart & b);
+
+/**
+ * \ingroup dot11s
+ *
+ * \brief 802.11s Peer link close management frame
+ * 
+ * Peer link close frame includes the following:
+ * - Mesh ID of mesh
+ */
+class PeerLinkCloseStart : public Header
+{
+public:
+  PeerLinkCloseStart ();
+  ///\brief fields:
+  struct PlinkCloseStartFields
+  {
+    IePeeringProtocol protocol; //Peering protocol version - 3 octets
+    IeMeshId meshId;            //open and close
+  };
+  void SetPlinkCloseStart (PlinkCloseStartFields);
+  PlinkCloseStartFields GetFields () const;
+
+  // Inherited from header:
+  static  TypeId   GetTypeId ();
+  virtual TypeId   GetInstanceTypeId () const;
+  virtual void     Print (std::ostream &os) const;
+  virtual uint32_t GetSerializedSize () const;
+  virtual void     Serialize (Buffer::Iterator start) const;
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+private:
+  IeMeshId m_meshId;
+
+  friend bool operator== (const PeerLinkCloseStart & a, const PeerLinkCloseStart & b);
+
+  PeerLinkCloseStart& operator= (const PeerLinkCloseStart &);
+  PeerLinkCloseStart (const PeerLinkCloseStart &);
+
+};
+bool operator== (const PeerLinkCloseStart & a, const PeerLinkCloseStart & b);
+
+/**
+ * \ingroup dot11s
+ *
+ * \brief 802.11s Peer link confirm management frame
+ * 
+ * Peer link confirm frame includes the following:
+ * - Association ID field
+ * - Supported rates
+ * - Configuration
+ */
+class PeerLinkConfirmStart : public Header
+{
+public:
+  PeerLinkConfirmStart ();
+  ///\brief fields:
+  struct PlinkConfirmStartFields
+  {
+    IePeeringProtocol protocol; //Peering protocol version - 3 octets
+    uint16_t capability;        //open and confirm
+    uint16_t aid;               //confirm only
+    SupportedRates rates;       //open and confirm
+    IeConfiguration config;     //open and confirm
+  };
+  void SetPlinkConfirmStart (PlinkConfirmStartFields);
+  PlinkConfirmStartFields GetFields () const;
+
+  // Inherited from header:
+  static  TypeId   GetTypeId ();
+  virtual TypeId   GetInstanceTypeId () const;
+  virtual void     Print (std::ostream &os) const;
+  virtual uint32_t GetSerializedSize () const;
+  virtual void     Serialize (Buffer::Iterator start) const;
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+private:
+  uint16_t m_capability;
+  uint16_t m_aid;
+  SupportedRates m_rates;
+  IeConfiguration m_config;
+
+  friend bool operator== (const PeerLinkConfirmStart & a, const PeerLinkConfirmStart & b);
 
-  PeerLinkFrameStart& operator= (const PeerLinkFrameStart &);
-  PeerLinkFrameStart (const PeerLinkFrameStart &);
+  PeerLinkConfirmStart& operator= (const PeerLinkConfirmStart &);
+  PeerLinkConfirmStart (const PeerLinkConfirmStart &);
 
 };
-bool operator== (const PeerLinkFrameStart & a, const PeerLinkFrameStart & b);
+bool operator== (const PeerLinkConfirmStart & a, const PeerLinkConfirmStart & b);
 } // namespace dot11s
 } // namespace ns3
 #endif
diff -Naur ns-3.23/src/mesh/model/dot11s/peer-management-protocol.h ns-3.24/src/mesh/model/dot11s/peer-management-protocol.h
--- ns-3.23/src/mesh/model/dot11s/peer-management-protocol.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/peer-management-protocol.h	2015-09-15 11:18:44.000000000 -0700
@@ -166,11 +166,11 @@
   /**
    * TracedCallback signature for link open/close events.
    *
-   * \param [in] myIface MAC address of my interface.
-   * \param [in] peerIface MAC address of peer interface.
+   * \param [in] src MAC address of source interface.
+   * \param [in] dst MAC address of destination interface.
    */
   typedef void (* LinkOpenCloseTracedCallback)
-    (const Mac48Address myIface, const Mac48Address peerIface);
+    (Mac48Address src, const Mac48Address dst);
    
 
 private:
diff -Naur ns-3.23/src/mesh/model/dot11s/peer-management-protocol-mac.cc ns-3.24/src/mesh/model/dot11s/peer-management-protocol-mac.cc
--- ns-3.23/src/mesh/model/dot11s/peer-management-protocol-mac.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/dot11s/peer-management-protocol-mac.cc	2015-09-15 11:18:44.000000000 -0700
@@ -82,6 +82,8 @@
       // Beacon shall not be dropped. May be needed to another plugins
       return true;
     }
+  uint16_t aid = 0;  // applicable only in Confirm message
+  IeConfiguration config;
   if (header.IsAction ())
     {
       WifiActionHeader actionHdr;
@@ -96,28 +98,61 @@
       m_stats.rxMgtBytes += packet->GetSize ();
       Mac48Address peerAddress = header.GetAddr2 ();
       Mac48Address peerMpAddress = header.GetAddr3 ();
-      PeerLinkFrameStart::PlinkFrameStartFields fields;
-      {
-        PeerLinkFrameStart peerFrame;
-        peerFrame.SetPlinkFrameSubtype ((uint8_t) actionValue.selfProtectedAction);
-        packet->RemoveHeader (peerFrame);
-        fields = peerFrame.GetFields ();
-        NS_ASSERT (fields.subtype == actionValue.selfProtectedAction); 
-      }
-      if ((actionValue.selfProtectedAction != WifiActionHeader::PEER_LINK_CLOSE) && !(m_parent->CheckSupportedRates (fields.rates))) 
-        {
-          m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
-          // Broken peer link frame - drop it
-          m_stats.brokenMgt++;
-          return false;
+      if (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_OPEN)
+        {
+          PeerLinkOpenStart::PlinkOpenStartFields fields;
+          PeerLinkOpenStart peerFrame;
+          packet->RemoveHeader (peerFrame);
+          fields = peerFrame.GetFields ();
+          if (!fields.meshId.IsEqual ( *(m_protocol->GetMeshId ())))
+            {
+              m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
+              // Broken peer link frame - drop it
+              m_stats.brokenMgt++;
+              return false;
+            }
+          if (!(m_parent->CheckSupportedRates (fields.rates)))
+            {
+              m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
+              // Broken peer link frame - drop it
+              m_stats.brokenMgt++;
+              return false;
+            }
+          config = fields.config;
+        }
+      else if (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_CONFIRM)
+        {
+          PeerLinkConfirmStart::PlinkConfirmStartFields fields;
+          PeerLinkConfirmStart peerFrame;
+          packet->RemoveHeader (peerFrame);
+          fields = peerFrame.GetFields ();
+          if (!(m_parent->CheckSupportedRates (fields.rates)))
+            {
+              m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
+              // Broken peer link frame - drop it
+              m_stats.brokenMgt++;
+              return false;
+            }
+          aid = fields.aid;
+          config = fields.config;
+        }
+      else if (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_CLOSE)
+        {
+          PeerLinkCloseStart::PlinkCloseStartFields fields;
+          PeerLinkCloseStart peerFrame;
+          packet->RemoveHeader (peerFrame);
+          fields = peerFrame.GetFields ();
+          if (!fields.meshId.IsEqual ( *(m_protocol->GetMeshId ())))
+            {
+              m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
+              // Broken peer link frame - drop it
+              m_stats.brokenMgt++;
+              return false;
+            }
         }
-     if ((actionValue.selfProtectedAction != WifiActionHeader::PEER_LINK_CONFIRM) && !fields.meshId.IsEqual (
-            *(m_protocol->GetMeshId ())))
+      else
         {
-          m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
-          // Broken peer link frame - drop it
-          m_stats.brokenMgt++;
-          return false;
+          NS_FATAL_ERROR ("Unknown Self-protected Action type: " << actionValue.selfProtectedAction);
         }
       Ptr<IePeerManagement> peerElement;
       //Peer Management element is the last element in this frame - so, we can use MeshInformationElementVector
@@ -126,25 +161,24 @@
       peerElement = DynamicCast<IePeerManagement>(elements.FindFirst (IE11S_PEERING_MANAGEMENT));
 
       NS_ASSERT (peerElement != 0);
-      //Check taht frame subtype corresponds peer link subtype
+      //Check that frame subtype corresponds to peer link subtype
       if (peerElement->SubtypeIsOpen ())
         {
           m_stats.rxOpen++;
-         NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_OPEN);
+          NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_OPEN);
         }
       if (peerElement->SubtypeIsConfirm ())
         {
           m_stats.rxConfirm++;
-       NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_CONFIRM); 
+          NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_CONFIRM); 
         }
       if (peerElement->SubtypeIsClose ())
         {
           m_stats.rxClose++;
-           NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_CLOSE); 
+          NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_CLOSE); 
         }
       //Deliver Peer link management frame to protocol:
-      m_protocol->ReceivePeerLinkFrame (m_ifIndex, peerAddress, peerMpAddress, fields.aid, *peerElement,
-                                        fields.config);
+      m_protocol->ReceivePeerLinkFrame (m_ifIndex, peerAddress, peerMpAddress, aid, *peerElement, config);
       // if we can handle a frame - drop it
       return false;
     }
@@ -202,44 +236,56 @@
   MeshInformationElementVector elements;
   elements.AddInformationElement (Ptr<IePeerManagement> (&peerElement));
   packet->AddHeader (elements);
-  PeerLinkFrameStart::PlinkFrameStartFields fields;
-  fields.rates = m_parent->GetSupportedRates ();
-  fields.capability = 0;
-  fields.meshId = *(m_protocol->GetMeshId ());
-  fields.config = meshConfig;
-  PeerLinkFrameStart plinkFrame;
   //Create an 802.11 frame header:
   //Send management frame to MAC:
-  WifiActionHeader actionHdr;
   if (peerElement.SubtypeIsOpen ())
     {
+      PeerLinkOpenStart::PlinkOpenStartFields fields;
+      fields.rates = m_parent->GetSupportedRates ();
+      fields.capability = 0;
+      fields.meshId = *(m_protocol->GetMeshId ());
+      fields.config = meshConfig;
+      PeerLinkOpenStart plinkOpen;
+      WifiActionHeader actionHdr;
       m_stats.txOpen++;
       WifiActionHeader::ActionValue action;
       action.selfProtectedAction = WifiActionHeader::PEER_LINK_OPEN;
-      fields.subtype = WifiActionHeader::PEER_LINK_OPEN;
       actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action); 
+      plinkOpen.SetPlinkOpenStart (fields);
+      packet->AddHeader (plinkOpen);
+      packet->AddHeader (actionHdr);
     }
   if (peerElement.SubtypeIsConfirm ())
     {
+      PeerLinkConfirmStart::PlinkConfirmStartFields fields;
+      fields.rates = m_parent->GetSupportedRates ();
+      fields.capability = 0;
+      fields.config = meshConfig;
+      PeerLinkConfirmStart plinkConfirm;
+      WifiActionHeader actionHdr;
       m_stats.txConfirm++;
       WifiActionHeader::ActionValue action;
-       action.selfProtectedAction = WifiActionHeader::PEER_LINK_CONFIRM; 
+      action.selfProtectedAction = WifiActionHeader::PEER_LINK_CONFIRM; 
       fields.aid = aid;
-      fields.subtype = WifiActionHeader::PEER_LINK_CONFIRM;
       actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action); 
+      plinkConfirm.SetPlinkConfirmStart (fields);
+      packet->AddHeader (plinkConfirm);
+      packet->AddHeader (actionHdr);
     }
   if (peerElement.SubtypeIsClose ())
     {
+      PeerLinkCloseStart::PlinkCloseStartFields fields;
+      fields.meshId = *(m_protocol->GetMeshId ());
+      PeerLinkCloseStart plinkClose;
+      WifiActionHeader actionHdr;
       m_stats.txClose++;
       WifiActionHeader::ActionValue action;
       action.selfProtectedAction = WifiActionHeader::PEER_LINK_CLOSE; 
-      fields.subtype = WifiActionHeader::PEER_LINK_CLOSE;
-      fields.reasonCode = peerElement.GetReasonCode ();
       actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action); 
+      plinkClose.SetPlinkCloseStart (fields);
+      packet->AddHeader (plinkClose);
+      packet->AddHeader (actionHdr);
     }
-  plinkFrame.SetPlinkFrameStart (fields);
-  packet->AddHeader (plinkFrame);
-  packet->AddHeader (actionHdr);
   m_stats.txMgt++;
   m_stats.txMgtBytes += packet->GetSize ();
   // Wifi Mac header:
diff -Naur ns-3.23/src/mesh/model/flame/flame-header.cc ns-3.24/src/mesh/model/flame/flame-header.cc
--- ns-3.23/src/mesh/model/flame/flame-header.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/flame/flame-header.cc	2015-09-15 11:18:44.000000000 -0700
@@ -52,8 +52,8 @@
 void
 FlameHeader::Print (std::ostream &os) const
 {
-  os << "Cost             = " << (uint16_t) m_cost << std::endl << "Sequence number  = " << m_seqno
-     << std::endl << "Orig Destination = " << m_origDst << std::endl << "Orig Source      = " << m_origSrc << std::endl;
+  os << "Cost= " << (uint16_t) m_cost << ", Sequence number= " << m_seqno
+     << ", Orig Destination= " << m_origDst << ", Orig Source= " << m_origSrc;
 }
 uint32_t
 FlameHeader::GetSerializedSize (void) const
diff -Naur ns-3.23/src/mesh/model/flame/flame-protocol.cc ns-3.24/src/mesh/model/flame/flame-protocol.cc
--- ns-3.23/src/mesh/model/flame/flame-protocol.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/flame/flame-protocol.cc	2015-09-15 11:18:44.000000000 -0700
@@ -46,7 +46,11 @@
 TypeId
 FlameTag::GetTypeId ()
 {
-  static TypeId tid = TypeId ("ns3::flame::FlameTag").SetParent<Tag> ().AddConstructor<FlameTag> ().SetGroupName ("Mesh");
+  static TypeId tid = TypeId ("ns3::flame::FlameTag")
+    .SetParent<Tag> ()
+    .SetGroupName ("Mesh")
+    .AddConstructor<FlameTag> ()
+    ;
   return tid;
 }
 
diff -Naur ns-3.23/src/mesh/model/flame/flame-rtable.cc ns-3.24/src/mesh/model/flame/flame-rtable.cc
--- ns-3.23/src/mesh/model/flame/flame-rtable.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/flame/flame-rtable.cc	2015-09-15 11:18:44.000000000 -0700
@@ -37,8 +37,9 @@
 {
   static TypeId tid =
     TypeId ("ns3::flame::FlameRtable")
-    .SetParent<Object> ().AddConstructor<FlameRtable> ()
+    .SetParent<Object> ()
     .SetGroupName ("Mesh")
+    .AddConstructor<FlameRtable> ()
     .AddAttribute ( "Lifetime",
                     "The lifetime of the routing enrty",
                     TimeValue (Seconds (120)), MakeTimeAccessor (
diff -Naur ns-3.23/src/mesh/model/mesh-information-element.h ns-3.24/src/mesh/model/mesh-information-element.h
--- ns-3.23/src/mesh/model/mesh-information-element.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/mesh-information-element.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,58 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 Dean Armstrong
- *
- * 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: Dean Armstrong <deanarm@gmail.com>
- */
-
-#ifndef MESH_INFORMATION_ELEMENT_H
-#define MESH_INFORMATION_ELEMENT_H
-
-#include "ns3/wifi-information-element.h"
-
-namespace ns3 {
-
-#define IE11S_LINK_METRIC_REPORT               ((WifiInformationElementId)115)
-#define IE11S_CONGESTION_NOTIFICATION          ((WifiInformationElementId)116)
-#define IE11S_SUPP_MBSS_REG_CLASSES_CHANNELS   ((WifiInformationElementId)23)
-#define IE11S_MESH_CHANNEL_SWITCH_ANNOUNCEMENT ((WifiInformationElementId)24)
-#define IE11S_MESH_TIM                         ((WifiInformationElementId)25)
-#define IE11S_AWAKE_WINDOW                     ((WifiInformationElementId)119)
-#define IE11S_BEACON_TIMING                    ((WifiInformationElementId)120)
-#define IE11S_MCCAOP_SETUP_REQUEST             ((WifiInformationElementId)121)
-#define IE11S_MCCAOP_SETUP_REPLY               ((WifiInformationElementId)122)
-#define IE11S_MCCAOP_ADVERTISEMENT             ((WifiInformationElementId)123)
-#define IE11S_MCCAOP_RESERVATION_TEARDOWN      ((WifiInformationElementId)31)
-#define IE11S_PORTAL_ANNOUNCEMENT              ((WifiInformationElementId)32)
-#define IE11S_PROXY_UPDATE                     ((WifiInformationElementId)137)
-#define IE11S_PROXY_UPDATE_CONFIRMATION        ((WifiInformationElementId)138)
-#define IE11S_ABBREVIATED_HANDSHAKE            ((WifiInformationElementId)39)
-/* begin of open80211s-compatible IDs */
-#define IE11S_MESH_CONFIGURATION               ((WifiInformationElementId)113)
-#define IE11S_MESH_ID                          ((WifiInformationElementId)114)
-#define IE11S_PEERING_MANAGEMENT               ((WifiInformationElementId)117)
-/* end of open80211s-compatible IDs */
-#define IE11S_RANN                             ((WifiInformationElementId)126)
-/* begin of open80211s-compatible IDs */
-#define IE11S_PREQ                             ((WifiInformationElementId)130)
-#define IE11S_PREP                             ((WifiInformationElementId)131)
-#define IE11S_PERR                             ((WifiInformationElementId)132)
-/* end of open80211s-compatible IDs */
-#define IE11S_MESH_PEERING_PROTOCOL_VERSION    ((WifiInformationElementId)74)
-
-}
-
-#endif /* MESH_INFORMATION_ELEMENT_H */
diff -Naur ns-3.23/src/mesh/model/mesh-information-element-vector.cc ns-3.24/src/mesh/model/mesh-information-element-vector.cc
--- ns-3.23/src/mesh/model/mesh-information-element-vector.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/mesh-information-element-vector.cc	2015-09-15 11:18:44.000000000 -0700
@@ -36,6 +36,33 @@
 
 namespace ns3 {
 
+NS_OBJECT_ENSURE_REGISTERED (MeshInformationElementVector);
+
+MeshInformationElementVector::MeshInformationElementVector ()
+{
+}
+
+MeshInformationElementVector::~MeshInformationElementVector ()
+{
+}
+
+
+TypeId
+MeshInformationElementVector::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::MeshInformationElementVector")
+    .SetParent<WifiInformationElementVector> ()
+    .SetGroupName ("Mesh")
+    .AddConstructor<MeshInformationElementVector> ();
+  return tid;
+}
+
+TypeId
+MeshInformationElementVector::GetInstanceTypeId () const
+{
+  return GetTypeId ();
+}
+
 uint32_t
 MeshInformationElementVector::DeserializeSingleIe (Buffer::Iterator start)
 {
diff -Naur ns-3.23/src/mesh/model/mesh-information-element-vector.h ns-3.24/src/mesh/model/mesh-information-element-vector.h
--- ns-3.23/src/mesh/model/mesh-information-element-vector.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/mesh-information-element-vector.h	2015-09-15 11:18:44.000000000 -0700
@@ -23,13 +23,18 @@
 #define MESH_INFORMATION_ELEMENT_VECTOR_H
 
 #include "ns3/wifi-information-element-vector.h"
-#include "ns3/mesh-information-element.h"
+#include "ns3/wifi-information-element.h"
 
 namespace ns3 {
 
 class MeshInformationElementVector : public WifiInformationElementVector
 {
 public:
+  MeshInformationElementVector ();
+  ~MeshInformationElementVector ();
+
+  static TypeId GetTypeId ();
+  TypeId GetInstanceTypeId () const;
   virtual uint32_t DeserializeSingleIe (Buffer::Iterator start);
 };
 
diff -Naur ns-3.23/src/mesh/model/mesh-wifi-beacon.h ns-3.24/src/mesh/model/mesh-wifi-beacon.h
--- ns-3.23/src/mesh/model/mesh-wifi-beacon.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/mesh-wifi-beacon.h	2015-09-15 11:18:44.000000000 -0700
@@ -67,7 +67,7 @@
   /// Beacon header
   MgtBeaconHeader m_header;
   /// List of information elements added
-  WifiInformationElementVector m_elements;
+  MeshInformationElementVector m_elements;
 };
 
 }
diff -Naur ns-3.23/src/mesh/model/mesh-wifi-interface-mac.cc ns-3.24/src/mesh/model/mesh-wifi-interface-mac.cc
--- ns-3.23/src/mesh/model/mesh-wifi-interface-mac.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/model/mesh-wifi-interface-mac.cc	2015-09-15 11:18:44.000000000 -0700
@@ -74,8 +74,8 @@
   ;
   return tid;
 }
-MeshWifiInterfaceMac::MeshWifiInterfaceMac () :
-  m_standard (WIFI_PHY_STANDARD_80211a)
+MeshWifiInterfaceMac::MeshWifiInterfaceMac ()
+  : m_standard (WIFI_PHY_STANDARD_80211a)
 {
   NS_LOG_FUNCTION (this);
 
@@ -220,7 +220,7 @@
   // copy packet to allow modifications
   Ptr<Packet> packet = const_packet->Copy ();
   WifiMacHeader hdr;
-  hdr.SetTypeData ();
+  hdr.SetType (WIFI_MAC_QOSDATA);
   hdr.SetAddr2 (GetAddress ());
   hdr.SetAddr3 (to);
   hdr.SetAddr4 (from);
@@ -255,19 +255,20 @@
         }
       m_stationManager->RecordDisassociated (hdr.GetAddr1 ());
     }
-  //Classify: application sets a tag, which is removed here
-  // Get Qos tag:
-  AcIndex ac = AC_BE;
+  // Classify: application may have set a tag, which is removed here
+  AcIndex ac;
   QosTag tag;
   if (packet->RemovePacketTag (tag))
     {
-      hdr.SetType (WIFI_MAC_QOSDATA);
       hdr.SetQosTid (tag.GetTid ());
-      //Aftre setting type DsFrom and DsTo fields are reset.
-      hdr.SetDsFrom ();
-      hdr.SetDsTo ();
       ac = QosUtilsMapTidToAc (tag.GetTid ());
     }
+  else
+    {
+      // No tag found; set to best effort
+      ac = AC_BE;
+      hdr.SetQosTid (0);
+    }
   m_stats.sentFrames++;
   m_stats.sentBytes += packet->GetSize ();
   NS_ASSERT (m_edca.find (ac) != m_edca.end ());
@@ -318,13 +319,13 @@
   for (uint32_t i = 0; i < m_phy->GetNModes (); i++)
     {
       WifiMode mode = m_phy->GetMode (i);
-      rates.AddSupportedRate (mode.GetDataRate ());
+      rates.AddSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), m_phy->GetGuardInterval (), 1));
     }
   // set the basic rates
   for (uint32_t j = 0; j < m_stationManager->GetNBasicModes (); j++)
     {
       WifiMode mode = m_stationManager->GetBasicMode (j);
-      rates.SetBasicRate (mode.GetDataRate ());
+      rates.SetBasicRate (mode.GetDataRate (m_phy->GetChannelWidth (), m_phy->GetGuardInterval (), 1));
     }
   return rates;
 }
@@ -334,7 +335,7 @@
   for (uint32_t i = 0; i < m_stationManager->GetNBasicModes (); i++)
     {
       WifiMode mode = m_stationManager->GetBasicMode (i);
-      if (!rates.IsSupportedRate (mode.GetDataRate ()))
+      if (!rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), m_phy->GetGuardInterval (), 1)))
         {
           return false;
         }
@@ -441,10 +442,10 @@
           for (uint32_t i = 0; i < m_phy->GetNModes (); i++)
             {
               WifiMode mode = m_phy->GetMode (i);
-              if (rates.IsSupportedRate (mode.GetDataRate ()))
+              if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), m_phy->GetGuardInterval (), 1)))
                 {
                   m_stationManager->AddSupportedMode (hdr->GetAddr2 (), mode);
-                  if (rates.IsBasicRate (mode.GetDataRate ()))
+                  if (rates.IsBasicRate (mode.GetDataRate (m_phy->GetChannelWidth (), m_phy->GetGuardInterval (), 1)))
                     {
                       m_stationManager->AddBasicMode (mode);
                     }
@@ -507,28 +508,32 @@
   return m_mpAddress;
 }
 //Statistics:
-MeshWifiInterfaceMac::Statistics::Statistics () :
-  recvBeacons (0), sentFrames (0), sentBytes (0), recvFrames (0), recvBytes (0)
+MeshWifiInterfaceMac::Statistics::Statistics ()
+  : recvBeacons (0),
+    sentFrames (0),
+    sentBytes (0),
+    recvFrames (0),
+    recvBytes (0)
 {
 }
 void
 MeshWifiInterfaceMac::Statistics::Print (std::ostream & os) const
 {
   os << "<Statistics "
-  /// \todo txBeacons
-  "rxBeacons=\"" << recvBeacons << "\" "
-  "txFrames=\"" << sentFrames << "\" "
-  "txBytes=\"" << sentBytes << "\" "
-  "rxFrames=\"" << recvFrames << "\" "
-  "rxBytes=\"" << recvBytes << "\"/>" << std::endl;
+    /// \todo txBeacons
+    "rxBeacons=\"" << recvBeacons << "\" "
+    "txFrames=\"" << sentFrames << "\" "
+    "txBytes=\"" << sentBytes << "\" "
+    "rxFrames=\"" << recvFrames << "\" "
+    "rxBytes=\"" << recvBytes << "\"/>" << std::endl;
 }
 void
 MeshWifiInterfaceMac::Report (std::ostream & os) const
 {
   os << "<Interface "
-  "BeaconInterval=\"" << GetBeaconInterval ().GetSeconds () << "\" "
-  "Channel=\"" << GetFrequencyChannel () << "\" "
-  "Address = \"" << GetAddress () << "\">" << std::endl;
+    "BeaconInterval=\"" << GetBeaconInterval ().GetSeconds () << "\" "
+    "Channel=\"" << GetFrequencyChannel () << "\" "
+    "Address = \"" << GetAddress () << "\">" << std::endl;
   m_stats.Print (os);
   os << "</Interface>" << std::endl;
 }
diff -Naur ns-3.23/src/mesh/test/dot11s/dot11s-test-suite.cc ns-3.24/src/mesh/test/dot11s/dot11s-test-suite.cc
--- ns-3.23/src/mesh/test/dot11s/dot11s-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/dot11s-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -216,50 +216,37 @@
 PeerLinkFrameStartTest::DoRun ()
 {
   {
-    PeerLinkFrameStart a;
-    PeerLinkFrameStart::PlinkFrameStartFields fields;
-    fields.subtype = (uint8_t)(WifiActionHeader::PEER_LINK_OPEN);
+    PeerLinkOpenStart a;
+    PeerLinkOpenStart::PlinkOpenStartFields fields;
     fields.capability = 0;
-    fields.aid = 101;
-    fields.reasonCode = 12;
     fields.meshId = IeMeshId ("qwertyuiop");
-    a.SetPlinkFrameStart (fields);
+    a.SetPlinkOpenStart (fields);
     Ptr<Packet> packet = Create<Packet> ();
     packet->AddHeader (a);
-    PeerLinkFrameStart b;
-    b.SetPlinkFrameSubtype ((uint8_t)(WifiActionHeader::PEER_LINK_OPEN));
+    PeerLinkOpenStart b;
     packet->RemoveHeader (b);
     NS_TEST_EXPECT_MSG_EQ (a, b, "PEER_LINK_OPEN works");
   }
   {
-    PeerLinkFrameStart a;
-    PeerLinkFrameStart::PlinkFrameStartFields fields;
-    fields.subtype = (uint8_t)(WifiActionHeader::PEER_LINK_CONFIRM);
+    PeerLinkConfirmStart a;
+    PeerLinkConfirmStart::PlinkConfirmStartFields fields;
     fields.capability = 0;
     fields.aid = 1234;
-    fields.reasonCode = 12;
-    fields.meshId = IeMeshId ("qwerty");
-    a.SetPlinkFrameStart (fields);
+    a.SetPlinkConfirmStart (fields);
     Ptr<Packet> packet = Create<Packet> ();
     packet->AddHeader (a);
-    PeerLinkFrameStart b;
-    b.SetPlinkFrameSubtype ((uint8_t)(WifiActionHeader::PEER_LINK_CONFIRM));
+    PeerLinkConfirmStart b;
     packet->RemoveHeader (b);
     NS_TEST_EXPECT_MSG_EQ (a, b, "PEER_LINK_CONFIRM works");
   }
   {
-    PeerLinkFrameStart a;
-    PeerLinkFrameStart::PlinkFrameStartFields fields;
-    fields.subtype = (uint8_t)(WifiActionHeader::PEER_LINK_CLOSE);
-    fields.capability = 0;
-    fields.aid = 10;
+    PeerLinkCloseStart a;
+    PeerLinkCloseStart::PlinkCloseStartFields fields;
     fields.meshId = IeMeshId ("qqq");
-    fields.reasonCode = 12;
-    a.SetPlinkFrameStart (fields);
+    a.SetPlinkCloseStart (fields);
     Ptr<Packet> packet = Create<Packet> ();
     packet->AddHeader (a);
-    PeerLinkFrameStart b;
-    b.SetPlinkFrameSubtype ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE));
+    PeerLinkCloseStart b;
     packet->RemoveHeader (b);
     NS_TEST_EXPECT_MSG_EQ (a, b, "PEER_LINK_CLOSE works");
   }
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression.cc ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression.cc
--- ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression.cc	2015-09-15 11:18:44.000000000 -0700
@@ -31,7 +31,6 @@
 #include "ns3/ipv4-interface-container.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/abort.h"
-#include "ns3/udp-echo-helper.h"
 #include "ns3/mobility-model.h"
 #include "ns3/pcap-test.h"
 #include <sstream>
@@ -45,7 +44,8 @@
 
 HwmpProactiveRegressionTest::HwmpProactiveRegressionTest () : TestCase ("HWMP proactive regression test"),
                                                               m_nodes (0),
-                                                              m_time (Seconds (5))
+                                                              m_time (Seconds (5)),
+                                                              m_sentPktsCounter (0)
 {
 }
 
@@ -89,17 +89,18 @@
 void
 HwmpProactiveRegressionTest::InstallApplications ()
 {
-  UdpEchoServerHelper echoServer (9);
-  ApplicationContainer serverApps = echoServer.Install (m_nodes->Get (0));
-  serverApps.Start (Seconds (0.0));
-  serverApps.Stop (m_time);
-  UdpEchoClientHelper echoClient (m_interfaces.GetAddress (0), 9);
-  echoClient.SetAttribute ("MaxPackets", UintegerValue (300));
-  echoClient.SetAttribute ("Interval", TimeValue (Seconds (0.5)));
-  echoClient.SetAttribute ("PacketSize", UintegerValue (100));
-  ApplicationContainer clientApps = echoClient.Install (m_nodes->Get (4));
-  clientApps.Start (Seconds (2.5));
-  clientApps.Stop (m_time);
+  // client socket
+  m_clientSocket = Socket::CreateSocket (m_nodes->Get (4), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_clientSocket->Bind ();
+  m_clientSocket->Connect (InetSocketAddress (m_interfaces.GetAddress (0), 9));
+  m_clientSocket->SetRecvCallback (MakeCallback (&HwmpProactiveRegressionTest::HandleReadClient, this));
+  Simulator::ScheduleWithContext (m_clientSocket->GetNode ()->GetId (), Seconds (2.5),
+                                  &HwmpProactiveRegressionTest::SendData, this, m_clientSocket);
+
+  // server socket
+  m_serverSocket = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_serverSocket->Bind (InetSocketAddress (Ipv4Address::GetAny (), 9));
+  m_serverSocket->SetRecvCallback (MakeCallback (&HwmpProactiveRegressionTest::HandleReadServer, this));
 }
 void
 HwmpProactiveRegressionTest::CreateDevices ()
@@ -145,3 +146,38 @@
     }
 }
 
+void
+HwmpProactiveRegressionTest::SendData (Ptr<Socket> socket)
+{
+  if ((Simulator::Now () < m_time) && (m_sentPktsCounter < 300))
+    {
+      socket->Send (Create<Packet> (100));
+      m_sentPktsCounter ++;
+      Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0.5),
+                                      &HwmpProactiveRegressionTest::SendData, this, socket);
+    }
+}
+
+void
+HwmpProactiveRegressionTest::HandleReadServer (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+      packet->RemoveAllPacketTags ();
+      packet->RemoveAllByteTags ();
+
+      socket->SendTo (packet, 0, from);
+    }
+}
+
+void
+HwmpProactiveRegressionTest::HandleReadClient (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+    }
+}
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression.h ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression.h
--- ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression.h	2015-09-15 11:18:44.000000000 -0700
@@ -74,5 +74,37 @@
   void CreateDevices ();
   void InstallApplications ();
   void ResetPosition ();
+
+  /// Server-side socket
+  Ptr<Socket> m_serverSocket;
+  /// Client-side socket
+  Ptr<Socket> m_clientSocket;
+
+  // sent packets counter
+  uint32_t m_sentPktsCounter;
+
+  /**
+   * Send data
+   * \param socket the sending socket
+   */
+  void SendData (Ptr<Socket> socket);
+
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
+  void HandleReadServer (Ptr<Socket> socket);
+
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
+  void HandleReadClient (Ptr<Socket> socket);
 };
 
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -2,54 +2,54 @@
  7Ormesh        j A   A               0 j         $0H`lx brmesh         F   F               `          $0H`lx
  rmesh       JO A   A               @          $0H`lx rmesh       +b F   F               p          $0H`lx
  zrmesh       j A   A               P 2         $0H`lx rmesh         ?   ?   Ѐ<                                                 z  F   F                E         $0H`lx
- 3rmesh         E   E   Ѐ             %                            *  ?   ?   Ѐ<                `                                         Ԁ              b  ?   ?   Ѐ<                                              V  ?   ?   Ј<                                                E   E   Ѐ            p %              ,             JO A   A                         $0H`lx Ermesh       [ L   L                               
+ 3rmesh         E   E   Ѐ             %                            *  ?   ?   Ѐ<                `                                         Ԁ              b  ?   ?   Ѐ<                                              V  ?   ?   Ј<                                                E   E   Ѐ            p %              ,             JO A   A                         $0H`lx Ermesh       [ N   N                                
 
-        L   L   <                                       
+        N   N   <                                         
      
-       B       Ԁ              m L   L                               
+       B       Ԁ              m N   N                                
 
-        L   L   <                                      
+        N   N   <                                        
      
-              Ԁ                     <                               E      @  
+              Ԁ                     <                                 E      @  
 
- 	 l                                                                                                                    Ԁ               L   L                                
+ 	 l                                                                                                                    Ԁ              + N   N                                 
 
-       G L   L                               
+       W N   N                                
 
-       Y       Ԁ               L   L   <                                      
+       i       Ԁ               N   N   <                                       
      
-              Ԁ              k       <                                E      @  
+       $       Ԁ              {       <                                 E      @  
 
- 	 l                                                                                                                    Ԁ                     <                              E      @  
+ 	 l                                                                                                                    Ԁ                     <                                E      @  
 
- 	 l                                                                                                             +b F   F                3&         $0H`lx
- &rmesh       j A   A                t'         $0H`lx &rmesh               Ԁ              F        <                0              E     @  
+ 	 l                                                                                                             +b F   F                3&         $0H`lx
+ &rmesh       j A   A                t'         $0H`lx &rmesh       #        Ԁ              V        <                                 E     @  
 
- 	 l                                                                                                             V        Ԁ                      <                                E     @  
+ 	 l                                                                                                             f        Ԁ                      <                                  E     @  
 
- 	 l                                                                                                                     Ԁ              [        <                @              E     @  
+ 	 l                                                                                                                     Ԁ              s        <                                 E     @  
 
- 	 l                                                                                                               F   F               PS.         $0H`lx
- ].u'rmesh       JO A   A                
-/         $0H`lx .rmesh       7       Ԁ              f       <                `              E     @  
+ 	 l                                                                                                               F   F                S.         $0H`lx
+ ].u'rmesh       JO A   A                
+/         $0H`lx .rmesh       C       Ԁ              v       <                0                E     @  
 
- 	 l                                                                                                             v       Ԁ              ͦ       <                                E     @  
+ 	 l                                                                                                                    Ԁ              ݦ       <                0                 E     @  
 
- 	 l                                                                                                                    Ԁ              {       <                p              E     @  
+ 	 l                                                                                                             !       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                             +b F   F               s(6         $0H`lx
- 5/rmesh       j A   A               *6         $0H`lx (6rmesh               Ԁ              F        <                              E     @  
+ 	 l                                                                                                             +b F   F                s(6         $0H`lx
+ 5/rmesh       j A   A                *6         $0H`lx (6rmesh       #        Ԁ              V        <                @                E     @  
 
- 	 l                                                                                                             V        Ԁ                      <                                E     @  
+ 	 l                                                                                                             f        Ԁ                      <                @                 E     @  
 
- 	 l                                                                                                                     Ԁ                      <                              E     @  
+ 	 l                                                                                                                     Ԁ                      <                @                E     @  
 
- 	 l                                                                                                               F   F               =         $0H`lx
- =6rmesh       JO A   A               0JX>         $0H`lx =rmesh       ,| ?   ?   Ѐ<                                                } ?   ?   Ј<                                                ~ E   E   Ѐ            %                            0~ ?   ?   Ѐ<                @                                ~       Ԁ               ?   ?   Ѐ<                                             > E   E   Ѐ            P%              ,             7       Ԁ              f       <                              E     @  
+ 	 l                                                                                                               F   F               =         $0H`lx
+ =6rmesh       JO A   A                JX>         $0H`lx =rmesh       ,| ?   ?   Ѐ<                                                 } ?   ?   Ј<                                                 ~ E   E   Ѐ            0%                            0~ ?   ?   Ѐ<                                                 ~       Ԁ               ?   ?   Ѐ<                @                             > E   E   Ѐ             %              ,             C       Ԁ              v       <                P                E     @  
 
- 	 l                                                                                                             v       Ԁ              ͦ       <                `               E     @  
+ 	 l                                                                                                                    Ԁ              ݦ       <                P                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                             !       Ԁ                     <                P                E     @  
 
- 	 l                                                                                                             +b F   F               jE         $0H`lx
- @EX>rmesh       j A   A               pjE         $0H`lx kErmesh    
\ No newline at end of file
+ 	 l                                                                                                             +b F   F               PjE         $0H`lx
+ @EX>rmesh       j A   A               jE         $0H`lx kErmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -6,90 +6,88 @@
  rmesh       a F   F               p          $0H`lx
  zrmesh        A   A               P 2         $0H`lx rmesh         F   F                         $0H`lx
  rmesh         E   E   Ѐ             %                               @  ?   ?   Ѐ<                                                         Ԁ                F   F                E         $0H`lx
- 3rmesh       E        Ԁ                E   E   Ѐ             %                              ?   ?   Ѐ<                `                                         Ԁ                ?   ?   Ѐ<                                                      Ԁ                ?   ?   Ј<                                                      Ԁ              V  E   E   Ѐ            p %              ,             O A   A                         $0H`lx Ermesh        L   L                               
+ 3rmesh       E        Ԁ                E   E   Ѐ             %                              ?   ?   Ѐ<                `                                         Ԁ                ?   ?   Ѐ<                                                      Ԁ                ?   ?   Ј<                                                      Ԁ              V  E   E   Ѐ            p %              ,             O A   A                         $0H`lx Ermesh        N   N                                
 
-        L   L                               
+        N   N                                
 
-        L   L   <                                       
+        N   N   <                                         
      
-              Ԁ               L   L                               
+              Ԁ               N   N                                
 
-       X L   L   <                                      
+       X N   N   <                                        
      
-              Ԁ               L   L   <                                      
+              Ԁ               N   N   <                                        
      
-       /       Ԁ              p       <                               E      @  
+       7       Ԁ              |       <                                 E      @  
 
- 	 l                                                                                                                    Ԁ                     <                               E      @  
+ 	 l                                                                                                                    Ԁ                     <                                 E      @  
 
- 	 l                                                                                                                    Ԁ               L   L                                
+ 	 l                                                                                                             '       Ԁ               N   N                                 
 
-        L   L                               
+        N   N                                
 
-        L   L                               
+        N   N                                
 
-       r       Ԁ               L   L   <                                      
+              Ԁ              - N   N   <                                       
      
-       -       Ԁ               L   L   <                                      
+       =       Ԁ               N   N   <                                       
      
-       A       Ԁ              p       <                                E      @  
+       Q       Ԁ                     <                                 E      @  
 
- 	 l                                                                                                                    Ԁ                     <                              E      @  
+ 	 l                                                                                                                    Ԁ                     <                                E      @  
 
- 	 l                                                                                                             )       Ԁ                     <                               E      @  
+ 	 l                                                                                                             A       Ԁ                     <                                E      @  
 
- 	 l                                                                                                             7 F   F               Ȼ&         $0H`lx
- J&Ermesh       a F   F                3&         $0H`lx
- &rmesh        A   A                t'         $0H`lx &rmesh               Ԁ                      <                               E     @  
+ 	 l                                                                                                             7 F   F                Ȼ&         $0H`lx
+ J&Ermesh       a F   F                3&         $0H`lx
+ &rmesh        A   A                t'         $0H`lx &rmesh               Ԁ                      <                                 E     @  
 
- 	 l                                                                                                                     Ԁ              A        <                0              E     @  
+ 	 l                                                                                                                     Ԁ              M        <                                 E     @  
 
- 	 l                                                                                                                     Ԁ                      <                                E     @  
+ 	 l                                                                                                                     Ԁ                      <                                  E     @  
 
- 	 l                                                                                                                     Ԁ              W        <                @              E     @  
+ 	 l                                                                                                                     Ԁ              k        <                                 E     @  
 
- 	 l                                                                                                                     Ԁ              	        <                0              E     @  
+ 	 l                                                                                                                     Ԁ              	        <                                 E     @  
 
- 	 l                                                                                                               F   F               @\.         $0H`lx
- -&rmesh         F   F               PS.         $0H`lx
- ].u'rmesh       O A   A                
-/         $0H`lx .rmesh       ˣ       Ԁ                     <                P              E     @  
+ 	 l                                                                                                               F   F                \.         $0H`lx
+ -&rmesh         F   F                S.         $0H`lx
+ ].u'rmesh       O A   A                
+/         $0H`lx .rmesh       ӣ       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                             
-       Ԁ              a       <                `              E     @  
+ 	 l                                                                                                                    Ԁ              m       <                0                E     @  
 
- 	 l                                                                                                                    Ԁ              ѧ       <                                E     @  
+ 	 l                                                                                                                    Ԁ                     <                0                 E     @  
 
- 	 l                                                                                                                    Ԁ              w       <                p              E     @  
+ 	 l                                                                                                                    Ԁ                     <                0                E     @  
 
- 	 l                                                                                                                    Ԁ              &       <                `              E     @  
+ 	 l                                                                                                             Щ       Ԁ              B       <                0                E     @  
 
- 	 l                                                                                                             7 F   F               p5         $0H`lx
- 5.rmesh       a F   F               s(6         $0H`lx
- 5/rmesh        A   A               *6         $0H`lx (6rmesh               Ԁ                      <                              E     @  
+ 	 l                                                                                                             7 F   F                5         $0H`lx
+ 5.rmesh       a F   F                s(6         $0H`lx
+ 5/rmesh        A   A                *6         $0H`lx (6rmesh               Ԁ                      <                @                E     @  
 
- 	 l                                                                                                                     Ԁ              A        <                              E     @  
+ 	 l                                                                                                                     Ԁ              M        <                @                E     @  
 
- 	 l                                                                                                                     Ԁ                      <                                E     @  
+ 	 l                                                                                                                     Ԁ                      <                @                 E     @  
 
- 	 l                                                                                                                     Ԁ                      <                              E     @  
+ 	 l                                                                                                                     Ԁ                      <                @                E     @  
 
- 	 l                                                                                                                     Ԁ              
-        <                              E     @  
+ 	 l                                                                                                                     Ԁ              +
+        <                @                E     @  
 
- 	 l                                                                                                               F   F               (=         $0H`lx
- -=(6rmesh         F   F               =         $0H`lx
- =6rmesh       O A   A               0JX>         $0H`lx =rmesh       { E   E   Ѐ            %                               { ?   ?   Ѐ<                                                | ?   ?   Ј<                                                K}       Ԁ              } E   E   Ѐ            %                            ~ ?   ?   Ѐ<                @                                ~       Ԁ              $       Ԁ              F ?   ?   Ѐ<                                                    Ԁ               E   E   Ѐ            P%              ,             ł       Ԁ              ˣ       Ԁ                     <                              E     @  
+ 	 l                                                                                                               F   F                (=         $0H`lx
+ -=(6rmesh         F   F               =         $0H`lx
+ =6rmesh       O A   A                JX>         $0H`lx =rmesh       { E   E   Ѐ            %                               { ?   ?   Ѐ<                                                 | ?   ?   Ј<                                                 K}       Ԁ              } E   E   Ѐ            0%                            ~ ?   ?   Ѐ<                                                 ~       Ԁ              $       Ԁ              F ?   ?   Ѐ<                @                                    Ԁ               E   E   Ѐ             %              ,             ł       Ԁ              ӣ       Ԁ                     <                P                E     @  
 
- 	 l                                                                                                             
-       Ԁ              a       <                              E     @  
+ 	 l                                                                                                                    Ԁ              m       <                P                E     @  
 
- 	 l                                                                                                                    Ԁ              ѧ       <                `               E     @  
+ 	 l                                                                                                                    Ԁ                     <                P                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                                    Ԁ                     <                P                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                              E     @  
+ 	 l                                                                                                                    Ԁ              K       <                P                E     @  
 
- 	 l                                                                                                             7 F   F               H@E         $0H`lx
- D=rmesh       a F   F               jE         $0H`lx
- @EX>rmesh        A   A               pjE         $0H`lx kErmesh    
\ No newline at end of file
+ 	 l                                                                                                             7 F   F                H@E         $0H`lx
+ D=rmesh       a F   F               PjE         $0H`lx
+ @EX>rmesh        A   A               jE         $0H`lx kErmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -10,105 +10,106 @@
  zrmesh       $  F   F                         $0H`lx
  zrmesh       (  F   F                         $0H`lx
  rmesh         E   E   Ѐ             %                                 ?   ?   Ѐ<                                                         Ԁ              z  F   F                E         $0H`lx
- 3rmesh       	  ?   ?   Ј<                                                         Ԁ                      Ԁ              b  ?   ?   Ѐ<                                              r        Ԁ              V  ?   ?   Ј<                                              f        Ԁ              s L   L                               
+ 3rmesh       	  ?   ?   Ј<                                                         Ԁ                      Ԁ              b  ?   ?   Ѐ<                                              r        Ԁ              V  ?   ?   Ј<                                              f        Ԁ              s N   N                                
 
         F   F                I&         $0H`lx
- -&rmesh       / L   L                               
+ -&rmesh       / N   N                                
 
-       [ L   L                               
+       [ N   N                                
 
-       B       Ԁ               L   L   <                                      
+       B       Ԁ               N   N   <                                        
      
-              Ԁ              u L   L   <                                      
+              Ԁ              u N   N   <                                        
      
-       2       Ԁ               L   L   <                                      
+       2       Ԁ               N   N   <                                        
      
-              Ԁ                     <                               E      @  
+              Ԁ                     <                                 E      @  
 
- 	 l                                                                                                                    Ԁ              k       <                               E      @  
+ 	 l                                                                                                             
+       Ԁ              s       <                                 E      @  
 
- 	 l                                                                                                                    Ԁ                     <                               E      @  
+ 	 l                                                                                                                    Ԁ                     <                                 E      @  
 
- 	 l                                                                                                             G L   L                               
+ 	 l                                                                                                             W N   N                                
 
-       r L   L                               
+        N   N                                
 
-        L   L                               
+        N   N                                
 
-              Ԁ              6 L   L   <                                     
+              Ԁ              F N   N   <                                       
      
-       F       Ԁ               L   L   <                                      
+       V       Ԁ               N   N   <                                       
      
-       Y       Ԁ               L   L   <                                      
+       i       Ԁ               N   N   <                                       
      
-              Ԁ                     <                              E      @  
+              Ԁ                     <                                E      @  
 
- 	 l                                                                                                                    Ԁ                     <                               E      @  
+ 	 l                                                                                                                    Ԁ                     <                                E      @  
 
- 	 l                                                                                                                    Ԁ              '       <                               E      @  
+ 	 l                                                                                                                    Ԁ              G       <                                E      @  
 
- 	 l                                                                                                             H7 F   F               Ȼ&         $0H`lx
- J&Ermesh       +b F   F                3&         $0H`lx
- &rmesh       @        Ԁ              o        <                0              E     @  
+ 	 l                                                                                                             H7 F   F                Ȼ&         $0H`lx
+ J&Ermesh       +b F   F                3&         $0H`lx
+ &rmesh       D        Ԁ              w        <                                 E     @  
 
- 	 l                                                                                                                     Ԁ                      <                               E     @  
+ 	 l                                                                                                                     Ԁ                      <                                 E     @  
 
- 	 l                                                                                                                     Ԁ              F        <                0              E     @  
+ 	 l                                                                                                             #        Ԁ              V        <                                 E     @  
 
- 	 l                                                                                                                     Ԁ              [        <                @              E     @  
+ 	 l                                                                                                                     Ԁ              s        <                                 E     @  
 
- 	 l                                                                                                             k        Ԁ                      <                0              E     @  
+ 	 l                                                                                                                     Ԁ                      <                                 E     @  
 
- 	 l                                                                                                             
-        Ԁ              2        <                @              E     @  
+ 	 l                                                                                                             
+        Ԁ              R        <                                 E     @  
 
- 	 l                                                                                                             $  F   F               P-         $0H`lx
- -&rmesh       (  F   F               @\.         $0H`lx
- -&rmesh         F   F               PS.         $0H`lx
- ].u'rmesh       `       Ԁ                     <                `              E     @  
+ 	 l                                                                                                             $  F   F                -         $0H`lx
+ -&rmesh       (  F   F                \.         $0H`lx
+ -&rmesh         F   F                S.         $0H`lx
+ ].u'rmesh       d       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                P              E     @  
+ 	 l                                                                                                                    Ԁ                     <                0                E     @  
 
- 	 l                                                                                                             7       Ԁ              f       <                `              E     @  
+ 	 l                                                                                                             C       Ԁ              v       <                0                E     @  
 
- 	 l                                                                                                                    Ԁ              {       <                p              E     @  
+ 	 l                                                                                                             !       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                                    Ԁ              !       <                `              E     @  
+ 	 l                                                                                                                    Ԁ              9       <                0                E     @  
 
- 	 l                                                                                                             b       Ԁ                     <                p              E     @  
+ 	 l                                                                                                             ~       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                              F   F               5         $0H`lx
- o5].rmesh       H7 F   F               p5         $0H`lx
- 5.rmesh       +b F   F               s(6         $0H`lx
- 5/rmesh       @        Ԁ              o        <                              E     @  
+ 	 l                                                                                                              F   F                5         $0H`lx
+ o5].rmesh       H7 F   F                5         $0H`lx
+ 5.rmesh       +b F   F                s(6         $0H`lx
+ 5/rmesh       D        Ԁ              w        <                @                E     @  
 
- 	 l                                                                                                                     Ԁ                      <                              E     @  
+ 	 l                                                                                                                     Ԁ                      <                @                E     @  
 
- 	 l                                                                                                                     Ԁ              F        <                              E     @  
+ 	 l                                                                                                             #        Ԁ              V        <                @                E     @  
 
- 	 l                                                                                                                     Ԁ                      <                              E     @  
+ 	 l                                                                                                                     Ԁ                      <                @                E     @  
 
- 	 l                                                                                                                     Ԁ              	        <                              E     @  
+ 	 l                                                                                                                     Ԁ              "	        <                @                E     @  
 
- 	 l                                                                                                             B
-        Ԁ              q        <                              E     @  
+ 	 l                                                                                                             g
+        Ԁ                      <                @                E     @  
 
- 	 l                                                                                                             $  F   F               -=         $0H`lx
- =5rmesh       (  F   F               (=         $0H`lx
- -=(6rmesh         F   F               =         $0H`lx
- =6rmesh       *{ E   E   Ѐ            %                               } ?   ?   Ј<                                                }       Ԁ              ~ E   E   Ѐ            %                            ~ ?   ?   Ј<                                                ~       Ԁ               ?   ?   Ѐ<                                                    Ԁ              0 E   E   Ѐ            %                                   Ԁ               ?   ?   Ѐ<                                                    Ԁ              `       Ԁ                     <                              E     @  
+ 	 l                                                                                                             $  F   F               -=         $0H`lx
+ =5rmesh       (  F   F                (=         $0H`lx
+ -=(6rmesh         F   F               =         $0H`lx
+ =6rmesh       *{ E   E   Ѐ            %                               } ?   ?   Ј<                                                 }       Ԁ              ~ E   E   Ѐ            0%                            ~ ?   ?   Ј<                                                 ~       Ԁ               ?   ?   Ѐ<                @                                    Ԁ              0 E   E   Ѐ            0%                                   Ԁ               ?   ?   Ѐ<                @                                    Ԁ              d       Ԁ                     <                P                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                              E     @  
+ 	 l                                                                                                                    Ԁ                     <                P                E     @  
 
- 	 l                                                                                                             7       Ԁ              f       <                              E     @  
+ 	 l                                                                                                             C       Ԁ              v       <                P                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                             !       Ԁ                     <                P                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                              E     @  
+ 	 l                                                                                                             Щ       Ԁ              B       <                P                E     @  
 
- 	 l                                                                                                             Y       Ԁ                     <                               E     @  
+ 	 l                                                                                                                    Ԁ                     <                P                E     @  
 
- 	 l                                                                                                              F   F               -D         $0H`lx
- D=rmesh       H7 F   F               H@E         $0H`lx
- D=rmesh       +b F   F               jE         $0H`lx
+ 	 l                                                                                                              F   F               P-D         $0H`lx
+ D=rmesh       H7 F   F                H@E         $0H`lx
+ D=rmesh       +b F   F               PjE         $0H`lx
  @EX>rmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -6,90 +6,90 @@
  rmesh       7 F   F                y         $0H`lx
  rmesh         A   A               `          $0H`lx rmesh       $  F   F                         $0H`lx
  zrmesh         F   F                         $0H`lx
- rmesh         E   E   Ѐ             %                               @  ?   ?   Ѐ<                                                         Ԁ                ?   ?   Ј<                                                 E        Ԁ                E   E   Ѐ             %                              ?   ?   Ѐ<                p                                         Ԁ                ?   ?   Ѐ<                                                      Ԁ              b  E   E   Ѐ             %              -                     Ԁ               A   A                -&         $0H`lx rmesh        L   L                                
+ rmesh         E   E   Ѐ             %                               @  ?   ?   Ѐ<                                                         Ԁ                ?   ?   Ј<                                                 E        Ԁ                E   E   Ѐ             %                              ?   ?   Ѐ<                p                                         Ԁ                ?   ?   Ѐ<                                                      Ԁ              b  E   E   Ѐ             %              -                     Ԁ               A   A                -&         $0H`lx rmesh        N   N                                 
 
-        L   L                               
+        N   N                                
 
         F   F                I&         $0H`lx
- -&rmesh        L   L                               
+ -&rmesh        N   N                                
 
-              Ԁ               L   L   <                                      
+              Ԁ               N   N   <                                        
      
-              Ԁ              \ L   L   <                                      
+              Ԁ              \ N   N   <                                        
      
-              Ԁ              H       <                                E      @  
+              Ԁ              L       <                                  E      @  
 
- 	 l                                                                                                             X       Ԁ                     <                               E      @  
+ 	 l                                                                                                             \       Ԁ                     <                                 E      @  
 
- 	 l                                                                                                             /       Ԁ              p       <                               E      @  
+ 	 l                                                                                                             7       Ԁ              |       <                                 E      @  
 
- 	 l                                                                                                              L   L                               
+ 	 l                                                                                                              N   N                                
 
-        L   L                               
+       - N   N                                
 
-       I L   L   <                                       
+       Y N   N   <                                        
      
-       Y       Ԁ              T L   L                               
+       i       Ԁ              d N   N                                
 
-        L   L   <                                     
+        N   N   <                                       
      
-       r       Ԁ               L   L   <                                      
+              Ԁ              - N   N   <                                       
      
-       )       Ԁ                     <                               E      @  
+       A       Ԁ                     <                                E      @  
 
- 	 l                                                                                                                    Ԁ              "       <                               E      @  
+ 	 l                                                                                                                    Ԁ              >       <                                E      @  
 
- 	 l                                                                                                             c       Ԁ              7 F   F               Ȼ&         $0H`lx
- J&Ermesh               <                                E     @  
+ 	 l                                                                                                                    Ԁ              7 F   F                Ȼ&         $0H`lx
+ J&Ermesh               <                                  E     @  
 
- 	 l                                                                                                                     Ԁ              k        <                0              E     @  
+ 	 l                                                                                                                     Ԁ              o        <                                 E     @  
 
- 	 l                                                                                                                     Ԁ                      <                               E     @  
+ 	 l                                                                                                                     Ԁ                      <                                 E     @  
 
- 	 l                                                                                                               A   A                +-         $0H`lx J&rmesh               Ԁ              	        <                0              E     @  
+ 	 l                                                                                                               A   A                +-         $0H`lx J&rmesh               Ԁ              	        <                                 E     @  
 
- 	 l                                                                                                             	        Ԁ              .
-        <                @              E     @  
+ 	 l                                                                                                             	        Ԁ              J
+        <                                 E     @  
 
- 	 l                                                                                                             n        Ԁ              $  F   F               P-         $0H`lx
- -&rmesh         F   F               @\.         $0H`lx
- -&rmesh       $       <                                E     @  
+ 	 l                                                                                                                     Ԁ              $  F   F                -         $0H`lx
+ -&rmesh         F   F                \.         $0H`lx
+ -&rmesh       (       <                0                 E     @  
 
- 	 l                                                                                                             4       Ԁ                     <                `              E     @  
+ 	 l                                                                                                             8       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                             ˣ       Ԁ                     <                P              E     @  
+ 	 l                                                                                                             ӣ       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                              A   A               Ko5         $0H`lx -rmesh              Ԁ              &       <                `              E     @  
+ 	 l                                                                                                              A   A                Ko5         $0H`lx -rmesh       Щ       Ԁ              B       <                0                E     @  
 
- 	 l                                                                                                             6       Ԁ                     <                p              E     @  
+ 	 l                                                                                                             R       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                             ͬ       Ԁ              - F   F               5         $0H`lx
- o5].rmesh       7 F   F               p5         $0H`lx
- 5.rmesh               <                                E     @  
+ 	 l                                                                                                                    Ԁ              - F   F                5         $0H`lx
+ o5].rmesh       7 F   F                5         $0H`lx
+ 5.rmesh               <                @                 E     @  
 
- 	 l                                                                                                                     Ԁ              k        <                              E     @  
+ 	 l                                                                                                                     Ԁ              o        <                @                E     @  
 
- 	 l                                                                                                                     Ԁ                      <                              E     @  
+ 	 l                                                                                                                     Ԁ                      <                @                E     @  
 
- 	 l                                                                                                               A   A               0k=         $0H`lx 5rmesh               Ԁ              
-        <                              E     @  
+ 	 l                                                                                                               A   A                k=         $0H`lx 5rmesh               Ԁ              +
+        <                @                E     @  
 
- 	 l                                                                                                             
-        Ԁ              m
-        <                              E     @  
+ 	 l                                                                                                             ;
+        Ԁ              
+        <                @                E     @  
 
- 	 l                                                                                                                     Ԁ              $  F   F               -=         $0H`lx
- =5rmesh         F   F               (=         $0H`lx
- -=(6rmesh       { E   E   Ѐ            %                               { ?   ?   Ѐ<                                                K}       Ԁ              } ?   ?   Ј<                                                |~ ?   ?   Ј<                                                $       Ԁ                     Ԁ               E   E   Ѐ            %                             ?   ?   Ѐ<                @                                ρ       Ԁ               ?   ?   Ѐ<                                             ł       Ԁ               E   E   Ѐ            P%              6             $       <                `               E     @  
+ 	 l                                                                                                                     Ԁ              $  F   F               -=         $0H`lx
+ =5rmesh         F   F                (=         $0H`lx
+ -=(6rmesh       { E   E   Ѐ            %                               { ?   ?   Ѐ<                                                 K}       Ԁ              } ?   ?   Ј<                                                 |~ ?   ?   Ј<                                                 $       Ԁ                     Ԁ               E   E   Ѐ            0%                             ?   ?   Ѐ<                                                 ρ       Ԁ               ?   ?   Ѐ<                @                             ł       Ԁ               E   E   Ѐ             %              6             (       <                P                 E     @  
 
- 	 l                                                                                                             4       Ԁ                     <                              E     @  
+ 	 l                                                                                                             8       Ԁ                     <                P                E     @  
 
- 	 l                                                                                                             ˣ       Ԁ                     <                              E     @  
+ 	 l                                                                                                             ӣ       Ԁ                     <                P                E     @  
 
- 	 l                                                                                                              A   A               pD         $0H`lx -=rmesh              Ԁ                     <                              E     @  
+ 	 l                                                                                                              A   A               D         $0H`lx -=rmesh              Ԁ              K       <                P                E     @  
 
- 	 l                                                                                                             -       Ԁ                     <                               E     @  
+ 	 l                                                                                                             [       Ԁ                     <                P                E     @  
 
- 	 l                                                                                                             Ĭ       Ԁ              - F   F               -D         $0H`lx
- D=rmesh       7 F   F               H@E         $0H`lx
+ 	 l                                                                                                                    Ԁ              - F   F               P-D         $0H`lx
+ D=rmesh       7 F   F                H@E         $0H`lx
  D=rmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -2,55 +2,55 @@
   rmesh       k  A   A               @ I         $0H`lx rmesh       $  F   F               ` Mf         $0H`lx
  J7rmesh        A   A               P          $0H`lx frmesh        F   F               p m         $0H`lx
  rmesh       k  A   A               `          $0H`lx rmesh       $  F   F                         $0H`lx
- zrmesh         ?   ?   Ѐ<                                                 	  ?   ?   Ј<                                                   E   E   Ѐ             %                            *  ?   ?   Ѐ<                p                                         Ԁ              b  ?   ?   Ѐ<                                                E   E   Ѐ             %              -              A   A                -&         $0H`lx rmesh       H L   L                                
+ zrmesh         ?   ?   Ѐ<                                                 	  ?   ?   Ј<                                                   E   E   Ѐ             %                            *  ?   ?   Ѐ<                p                                         Ԁ              b  ?   ?   Ѐ<                                                E   E   Ѐ             %              -              A   A                -&         $0H`lx rmesh       H N   N                                 
 
-       s L   L                               
+       s N   N                                
 
         F   F                I&         $0H`lx
- -&rmesh       2       Ԁ               L   L   <                                      
+ -&rmesh       2       Ԁ               N   N   <                                        
      
-              Ԁ              D       <                                E      @  
+              Ԁ              D       <                                  E      @  
 
- 	 l                                                                                                                    Ԁ                     <                               E      @  
+ 	 l                                                                                                                    Ԁ                     <                                 E      @  
 
- 	 l                                                                                                              L   L                               
+ 	 l                                                                                                              N   N                                
 
-        L   L   <                                       
+        N   N   <                                        
      
-              Ԁ               L   L                               
+              Ԁ               N   N                                
 
-       6 L   L   <                                     
+       F N   N   <                                       
      
-              Ԁ              '       <                               E      @  
+              Ԁ              G       <                                E      @  
 
- 	 l                                                                                                             7       Ԁ                        <                                E     @  
+ 	 l                                                                                                             W       Ԁ                        <                                  E     @  
 
- 	 l                                                                                                             @        Ԁ              o        <                0              E     @  
+ 	 l                                                                                                             D        Ԁ              w        <                                 E     @  
 
- 	 l                                                                                                             k  A   A                +-         $0H`lx J&rmesh       
-        Ԁ              2        <                @              E     @  
+ 	 l                                                                                                             k  A   A                +-         $0H`lx J&rmesh       
+        Ԁ              R        <                                 E     @  
 
- 	 l                                                                                                             B        Ԁ              $  F   F               P-         $0H`lx
- -&rmesh               <                                E     @  
+ 	 l                                                                                                             b        Ԁ              $  F   F                -         $0H`lx
+ -&rmesh               <                0                 E     @  
 
- 	 l                                                                                                             `       Ԁ                     <                `              E     @  
+ 	 l                                                                                                             d       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                              A   A               Ko5         $0H`lx -rmesh       b       Ԁ                     <                p              E     @  
+ 	 l                                                                                                              A   A                Ko5         $0H`lx -rmesh       ~       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                                    Ԁ               F   F               5         $0H`lx
- o5].rmesh                 <                                E     @  
+ 	 l                                                                                                                    Ԁ               F   F                5         $0H`lx
+ o5].rmesh                 <                @                 E     @  
 
- 	 l                                                                                                             @        Ԁ              o        <                              E     @  
+ 	 l                                                                                                             D        Ԁ              w        <                @                E     @  
 
- 	 l                                                                                                             k  A   A               0k=         $0H`lx 5rmesh       B
-        Ԁ              q        <                              E     @  
+ 	 l                                                                                                             k  A   A                k=         $0H`lx 5rmesh       g
+        Ԁ                      <                @                E     @  
 
- 	 l                                                                                                                     Ԁ              $  F   F               -=         $0H`lx
- =5rmesh       ,| ?   ?   Ѐ<                                                ~ ?   ?   Ј<                                                ~ ?   ?   Ј<                                                0 E   E   Ѐ            %                            R ?   ?   Ѐ<                @                                       Ԁ               ?   ?   Ѐ<                                              E   E   Ѐ            P%              6                     <                `               E     @  
+ 	 l                                                                                                                     Ԁ              $  F   F               -=         $0H`lx
+ =5rmesh       ,| ?   ?   Ѐ<                                                 ~ ?   ?   Ј<                                                 ~ ?   ?   Ј<                                                 0 E   E   Ѐ            0%                            R ?   ?   Ѐ<                                                        Ԁ               ?   ?   Ѐ<                @                              E   E   Ѐ             %              6                     <                P                 E     @  
 
- 	 l                                                                                                             `       Ԁ                     <                              E     @  
+ 	 l                                                                                                             d       Ԁ                     <                P                E     @  
 
- 	 l                                                                                                              A   A               pD         $0H`lx -=rmesh       Y       Ԁ                     <                               E     @  
+ 	 l                                                                                                              A   A               D         $0H`lx -=rmesh              Ԁ                     <                P                E     @  
 
- 	 l                                                                                                                    Ԁ               F   F               -D         $0H`lx
+ 	 l                                                                                                             ʬ       Ԁ               F   F               P-D         $0H`lx
  D=rmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression.cc ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression.cc
--- ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression.cc	2015-09-15 11:18:44.000000000 -0700
@@ -30,7 +30,6 @@
 #include "ns3/internet-stack-helper.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/abort.h"
-#include "ns3/udp-echo-helper.h"
 #include "ns3/mobility-model.h"
 #include "ns3/pcap-test.h"
 #include <sstream>
@@ -42,7 +41,8 @@
 
 HwmpReactiveRegressionTest::HwmpReactiveRegressionTest () : TestCase ("HWMP on-demand regression test"),
                                                             m_nodes (0),
-                                                            m_time (Seconds (10))
+                                                            m_time (Seconds (10)),
+                                                            m_sentPktsCounter (0)
 {
 }
 HwmpReactiveRegressionTest::~HwmpReactiveRegressionTest ()
@@ -86,17 +86,18 @@
 void
 HwmpReactiveRegressionTest::InstallApplications ()
 {
-  UdpEchoServerHelper echoServer (9);
-  ApplicationContainer serverApps = echoServer.Install (m_nodes->Get (0));
-  serverApps.Start (Seconds (0.0));
-  serverApps.Stop (m_time);
-  UdpEchoClientHelper echoClient (m_interfaces.GetAddress (0), 9);
-  echoClient.SetAttribute ("MaxPackets", UintegerValue (300));
-  echoClient.SetAttribute ("Interval", TimeValue (Seconds (0.5)));
-  echoClient.SetAttribute ("PacketSize", UintegerValue (20));
-  ApplicationContainer clientApps = echoClient.Install (m_nodes->Get (5));
-  clientApps.Start (Seconds (2.0));
-  clientApps.Stop (m_time);
+  // client socket
+  m_clientSocket = Socket::CreateSocket (m_nodes->Get (5), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_clientSocket->Bind ();
+  m_clientSocket->Connect (InetSocketAddress (m_interfaces.GetAddress (0), 9));
+  m_clientSocket->SetRecvCallback (MakeCallback (&HwmpReactiveRegressionTest::HandleReadClient, this));
+  Simulator::ScheduleWithContext (m_clientSocket->GetNode ()->GetId (), Seconds (2.0),
+                                  &HwmpReactiveRegressionTest::SendData, this, m_clientSocket);
+
+  // server socket
+  m_serverSocket = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_serverSocket->Bind (InetSocketAddress (Ipv4Address::GetAny (), 9));
+  m_serverSocket->SetRecvCallback (MakeCallback (&HwmpReactiveRegressionTest::HandleReadServer, this));
 }
 void
 HwmpReactiveRegressionTest::CreateDevices ()
@@ -152,5 +153,40 @@
       return;
     }
   model->SetPosition (Vector (9000, 0, 0));
+}
+
+void
+HwmpReactiveRegressionTest::SendData (Ptr<Socket> socket)
+{
+  if ((Simulator::Now () < m_time) && (m_sentPktsCounter < 300))
+    {
+      socket->Send (Create<Packet> (20));
+      m_sentPktsCounter ++;
+      Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0.5),
+                                      &HwmpReactiveRegressionTest::SendData, this, socket);
+    }
+}
+
+void
+HwmpReactiveRegressionTest::HandleReadServer (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+      packet->RemoveAllPacketTags ();
+      packet->RemoveAllByteTags ();
+
+      socket->SendTo (packet, 0, from);
+    }
+}
 
+void
+HwmpReactiveRegressionTest::HandleReadClient (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+    }
 }
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression.h ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression.h
--- ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression.h	2015-09-15 11:18:44.000000000 -0700
@@ -87,5 +87,37 @@
   void CreateDevices ();
   void InstallApplications ();
   void ResetPosition ();
+
+  /// Server-side socket
+  Ptr<Socket> m_serverSocket;
+  /// Client-side socket
+  Ptr<Socket> m_clientSocket;
+
+  // sent packets counter
+  uint32_t m_sentPktsCounter;
+
+  /**
+   * Send data
+   * \param socket the sending socket
+   */
+  void SendData (Ptr<Socket> socket);
+
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
+  void HandleReadServer (Ptr<Socket> socket);
+
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
+  void HandleReadClient (Ptr<Socket> socket);
 };
 
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-0-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-0-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-0-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,126 +1,140 @@
-ò            i       '  >   >   Ѐ<                    $0H`lrmeshq   9u         -  >   >   Ј<                    $0H`lrmeshq   9u           A   A                          $0H`lx  rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u         c        Ԁ                 <   <   Ѐ<                      $0H`lq   9u          7 >   >   Ѐ<                0   $0H`lrmeshq   9u         8       Ԁ               JO A   A                JO         $0H`lx  rmesh        i >   >   Ѐ<                    $0H`lrmeshq   9u         2j       Ԁ               j <   <   Ѐ<                @    $0H`lq  9u          j       Ԁ               k >   >   Ѐ<                P   $0H`lrmeshq  9u         k       Ԁ                l <   <   Ѐ<                0     $0H`lq  9u          l       Ԁ               #b A   A               ` a         $0H`lx  rmesh        j A   A               @ j         $0H`lx brmesh         F   F               p          $0H`lx
- rmesh       J/ A   A               P q         $0H`lx rmesh       +b F   F                         $0H`lx
- qrmesh       j A   A               `          $0H`lx rmesh       a  L   L                
-               
+ò            i       '  >   >   Ѐ<                    $0H`lrmeshq   9u         -  >   >   Ј<                    $0H`lrmeshq   9u         *  >   >   Ј<                    $0H`lrmeshq   9u         9  >   >   Ј<                    $0H`lrmeshq   9u         H  >   >   Ј<                    $0H`lrmeshq   9u         W  >   >   Ј<                    $0H`lrmeshq   9u         K  >   >   Ј<                    $0H`lrmeshq   9u           A   A                          $0H`lx  rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u         H        Ԁ                 <   <   Ѐ<                      $0H`lq   9u            <   <   Ј<                      $0H`lq   9u          7 >   >   Ѐ<                0   $0H`lrmeshq   9u         8       Ԁ               JO A   A                JO         $0H`lx  rmesh        IP >   >   Ѐ<                @   $0H`lrmeshq  9u         YP       Ԁ               P <   <   Ѐ<                      $0H`lq   9u          LQ       Ԁ               i >   >   Ѐ<                0   $0H`lrmeshq   9u         2j       Ԁ               j <   <   Ѐ<                P    $0H`lq  9u          j       Ԁ               +b F   F               ` a         $0H`lx
+  Ormesh        j A   A               @ j         $0H`lx brmesh         F   F               p          $0H`lx
+ rmesh       JO A   A               P          $0H`lx rmesh       +b F   F                         $0H`lx
+ rmesh       j A   A               ` 2         $0H`lx rmesh       
+  N   N                
+                
 
 
-         L   L          p      
-               
+       )  N   N          p      
+                
 
 
-       [  E   E   Ѐ             %                         
-             E   E   Ѐ             %                      
-                   Ԁ              x  ?   ?   Ѐ<                                   
-                  Ԁ                L   L   <                
-                       
+         E   E   Ѐ             %                         
+           0  E   E   Ѐ             %                      
+                   Ԁ              3  ?   ?   Ѐ<                                   
+          C        Ԁ                N   N   <                
+                         
      
 
-       w  L   L   <                
-                       
+       W        Ԁ                N   N   <                
+                        
      
 
-       4        Ԁ                L   L   <                
-                      
-     
-
-       2         Ԁ                 `   `   <                      
-         E  0    @  
+       '        Ԁ                b   b   <                       
+          E  0    @  
 
- 	                              !        Ԁ              }4  L   L                                
+ 	                                      Ԁ              v0  N   N                                 
 
-       5  L   L                               
+       1  N   N                                
 
-       <=        Ԁ              =  L   L   <                      
-                
+       7        Ԁ              l8  N   N   <                      
+                 
 
      
-       =        Ԁ              N>  `   `   <                
-                E  0    @  
+       |8        Ԁ              8  b   b   <                
+                 E  0    @  
 
- 	                              #?        Ԁ              ?  `   `   <                
-               E  0    @  
+ 	                              9        Ԁ              :  b   b   <                
+                E  0    @  
 
- 	                                F   F               E         $0H`lx
- rmesh       J/ A   A                ʳ         $0H`lx Ermesh              Ԁ               `   `   <                      
-         E  0   @  
-
- 	                              ƥ       Ԁ               `   `   <                
-                E  0   @  
-
- 	                                     Ԁ               `   `   <                
-0              E  0   @  
-
- 	                              +b F   F               @3&         $0H`lx
- srmesh       j A   A                T'         $0H`lx &rmesh       d /   /   Ѐ<                P       
-            t       Ԁ                F   F               `S.         $0H`lx
- 'U'rmesh       J/ A   A                
-.         $0H`lx .rmesh       % E   E   Ѐ            p%         
-                       9% ?   ?   Ѐ<                         
-                        & ?   ?   Ј<                         
-                        ' ?   ?   Ј<                         
-                        Y(       Ԁ              ) ?   ?   Ј<                      
-                       * ?   ?   Ј<                      
-                       2+ ?   ?   Ј<                      
-                       0       Ԁ              1 `   `   <                     
-         E  0   @  
-
- 	                              1       Ԁ              )2 `   `   <                
-               E  0   @  
-
- 	                              2       Ԁ               4 `   `   <                
-              E  0   @  
-
- 	                              M5 `   `   <                
-              E  0   @  
-
- 	                                     Ԁ               `   `   <                     
-         E  0   @  
-
- 	                              ƥ       Ԁ               `   `   <                
-                E  0   @  
-
- 	                                     Ԁ              3 `   `   <                
-              E  0   @  
-
- 	                              +b F   F               s(6         $0H`lx
- .U'rmesh        /   /   Ѐ<                                    A   A               0*6         $0H`lx (6rmesh       % -   -   Ј<                rmeshu  4        5       Ԁ               -   -   Ѐ<                @rmeshu  7         -   -   Ј<                @rmeshu  7         -   -   Ј<                @rmeshu  7        9       Ԁ               E   E   Ѐ             %         
-                         A   A               =         $0H`lx V6rmesh       %  >   >   Ѐ<                P  $0H`lrmeshq   9u                Ԁ              H  <   <   Ј<                    $0H`lq  9u         X        Ԁ              .  >   >   Ѐ<                0  $0H`lrmeshq  9u        >        Ԁ                <   <   Ѐ<                `   $0H`lq  9u         1        Ԁ              JW A   A               pJ`>         $0H`lx=rmesh       +b F   F               @jE         $0H`lx
- =`>rmesh       j A   A               jF         $0H`lxkErmesh       B	 E   E   Ѐ            P%         
-                       d	 ?   ?   Ѐ<                        
-                        	       Ԁ              	 ?   ?   Ѐ<                `      
-                       	       Ԁ              	 `   `   <                p     
-         E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                
-               E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                
-              E  0   @  
-
- 	                              n	 `   `   <                
-              E  0   @  
-
- 	                              	 `   `   <                
-              E  0   @  
-
- 	                              	       Ԁ              F	 `   `   <                
-              E  0   @  
-
- 	                              	 `   `   <                     
-         E  0   @  
-
- 	                              )	       Ԁ              	 `   `   <                
-               E  0   @  
-
- 	                              	 `   `   <                
-               E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                
-              E  0   @  
-
- 	                              JW A   A               M         $0H`lxkErmesh       _ -   -   Ѐ<                rmeshu  4        |`       Ԁ              ` -   -   Ѐ<                rmeshu  7        a       Ԁ              +b F   F               T         $0H`lx
- 9MMrmesh       Mb >   >   Ѐ<                  $0H`lrmeshq   9u        Ac >   >   Ј<                  $0H`lrmeshq   9u        c       Ԁ              `d -   -   Ѐ<                rmeshu  4        pd       Ԁ              d -   -   Ѐ<                rmeshu  7        ae       Ԁ              j A   A                #U         $0H`lxTrmesh       i >   >   Ѐ<                  $0H`lrmeshq  9u        y       Ԁ               -   -   Ѐ<                rmeshu  4        X       Ԁ               -   -   Ѐ<                 rmeshu  7               Ԁ              s	 /   /   Ѐ<                                   *=       Ԁ                A   A                N\         $0H`lx 9Mrmesh       %  >   >   Ѐ<                   $0H`lrmeshq   9u                Ԁ              X  <   <   Ѐ<                0   $0H`lq  9u         h        Ԁ              5  >   >   Ѐ<                @  $0H`lrmeshq  9u        E        Ԁ                <   <   Ѐ<                0   $0H`lq  9u         8        Ԁ                -   -   Ѐ<                Prmeshu  4                Ԁ              J# A   A               @ʰ\         $0H`lxN\rmesh       b       Ԁ              xc <   <   Ѐ<                p   $0H`lq  9u         ^d >   >   Ѐ<                  $0H`lrmeshq  9u        #f       Ԁ              j A   A               Pd         $0H`lxN\rmesh       þ  -   -   Ѐ<                `rmeshu  4        T        Ԁ              ʿ  -   -   Ѐ<                rmeshu  7        ڿ        Ԁ              J  <   <               p
-k         $0H`lx rmesh       #b A   A               s1s         $0H`lxkrmesh       Eb >   >   Ѐ<                  $0H`lrmeshq   9u        8c >   >   Ј<                  $0H`lrmeshq   9u        c       Ԁ              kd <   <   Ѐ<                   $0H`lq  9u         {d       Ԁ              !f >   >   Ј<                  $0H`lrmeshq  9u        1f       Ԁ              f <   <   Ѐ<                   $0H`lq  9u         $g       Ԁ              j A   A               *ds         $0H`lx1srmesh         F   F               z         $0H`lx
-kdsrmesh       J A   A               J{         $0H`lxzrmesh        -   -   Ѐ<                rmeshu  4               Ԁ              ' >   >   Ѐ<                   $0H`lrmeshq  9u                Ԁ                -   -   Ѐ<                rmeshu  7        #b A   A                s         $0H`lx{rmesh       b       Ԁ              3e       Ԁ              j A   A               j         $0H`lxtrmesh    	     F   F               P         $0H`lx
-rmesh    	   J A   A               _         $0H`lxrmesh    	   +b F   F               `         $0H`lx
-_Vrmesh    	   j A   A                         $0H`lxrmesh    
\ No newline at end of file
+ 	                                F   F                E         $0H`lx
+ 33rmesh       JO A   A                         $0H`lx Ermesh       o       Ԁ              6 b   b   <                       
+          E  0   @  
+
+ 	                              F       Ԁ               b   b   <                
+                  E  0   @  
+
+ 	                              v       Ԁ              | b   b   <                
+                 E  0   @  
+
+ 	                              +b F   F                3&         $0H`lx
+ &rmesh       j A   A                t'         $0H`lx &rmesh       ?       Ԁ               /   /   Ј<                        
+                   Ԁ                F   F                S.         $0H`lx
+ u.u'rmesh       JO A   A                
+/         $0H`lx .rmesh       +b F   F               s(6         $0H`lx
+ 6/rmesh       j A   A                *6         $0H`lx (6rmesh        E   E   Ѐ             %         
+     `                  9 ?   ?   Ѐ<                         
+                               Ԁ              p ?   ?   Ѐ<                0      
+                              Ԁ               b   b   <                0      
+          E  0   @  
+
+ 	                              Œ       Ԁ               b   b   <                
+0                 E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+0                E  0   @  
+
+ 	                              L b   b   <                
+0                E  0   @  
+
+ 	                              _ b   b   <                
+0                E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+0                E  0   @  
+
+ 	                              - b   b   <                @      
+          E  0   @  
+
+ 	                              =       Ԁ               b   b   <                
+@                 E  0   @  
+
+ 	                              m       Ԁ              O b   b   <                
+@                E  0   @  
+
+ 	                              o b   b   <                
+@                E  0   @  
+
+ 	                              :        Ԁ              :  /   /   Ѐ<                @       
+            ;        Ԁ                F   F               P=         $0H`lx
+ =6rmesh       JO A   A                JX>         $0H`lx =rmesh       +b F   F               `jE         $0H`lx
+ XEX>rmesh       j A   A                jE         $0H`lx kErmesh       	       Ԁ              	 b   b   <                P      
+          E  0   @  
+
+ 	                              	       Ԁ              _	 E   E   Ѐ            %                         
+           	 E   E   Ѐ            p%                      
+           	       Ԁ              Y	 b   b   <                `      
+          E  0   @  
+
+ 	                              i	       Ԁ               E   E   Ѐ             %                         
+            E   E   Ѐ            %                      
+                  Ԁ               ?   ?   Ѐ<                           `       
+                 Ԁ               b   b   <                
+P                 E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+P                E  0   @  
+
+ 	                              I b   b   <                
+`                 E  0   @  
+
+ 	                               b   b   <                
+`                 E  0   @  
+
+ 	                                     Ԁ              w ?   ?   Ѐ<                           ^       
+                 Ԁ               b   b   <                
+P                E  0   @  
+
+ 	                               b   b   <                
+`                 E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+`                E  0   @  
+
+ 	                              2 b   b   <                
+`                E  0   @  
+
+ 	                                F   F               M         $0H`lx
+ LErmesh       JO A   A               0M         $0H`lx Mrmesh       +b F   F               T         $0H`lx
+ TMrmesh       j A   A               @;U         $0H`lx Trmesh       *%       Ԁ              :' /   /   Ј<                       
+            J'       Ԁ                F   F               N\         $0H`lx
+ <\Mrmesh       M /   /   Ѐ<                                   N -   -   Ѐ<                 rmeshu  4        N       Ԁ              N -   -   Ѐ<                Prmeshu  7        uO       Ԁ              O A   A               `\         $0H`lx N\rmesh       P >   >   Ѐ<                  $0H`lrmeshq  9u        P       Ԁ              P -   -   Ѐ<                prmeshu  4        |Q       Ԁ              
+R >   >   Ј<                  $0H`lrmeshq  9u        R       Ԁ              R -   -   Ѐ<                 rmeshu  7        R       Ԁ              #b A   A               03c         $0H`lx crmesh       Eb >   >   Ѐ<                  $0H`lrmeshq   9u        b       Ԁ              xc <   <   Ѐ<                @   $0H`lq  9u         c       Ԁ              6e >   >   Ј<                P  $0H`lrmeshq  9u        Fe       Ԁ              e <   <   Ѐ<                   $0H`lq  9u         9f       Ԁ              j A   A               ]d         $0H`lxcrmesh         F   F               `Sk         $0H`lx
+ ~k^drmesh       J/ A   A               
+k         $0H`lxkrmesh       +b F   F               ps1s         $0H`lx
+ s^drmesh        -   -   Ѐ<                rmeshu  4               Ԁ              M -   -   Ѐ<                rmeshu  7        M -   -   Ј<                rmeshu  7               Ԁ               A   A               *s         $0H`lx1srmesh        >   >   Ѐ<                  $0H`lrmeshq  9u               Ԁ              f -   -   Ѐ<                rmeshu  4               Ԁ              m -   -   Ѐ<                rmeshu  7        }       Ԁ                A   A               z         $0H`lx zrmesh       %  >   >   Ѐ<                  $0H`lrmeshq   9u                Ԁ              X  <   <   Ѐ<                   $0H`lq  9u         h        Ԁ              M  >   >   Ј<                  $0H`lrmeshq  9u        ]        Ԁ                <   <   Ѐ<                    $0H`lq  9u         P        Ԁ              JW A   A               Ji{         $0H`lxzrmesh       |`       Ԁ              ` -   -   Ѐ<                rmeshu  7        +b F   F               s         $0H`lx
+ ai{rmesh       b       Ԁ              vd       Ԁ              j A   A                j
+         $0H`lxtrmesh    	     A   A                        $0H`lx
+rmesh    	           Ԁ           	   X  <   <   Ѐ<                    $0H`lq  9u      	   >  >   >   Ѐ<                0  $0H`lrmeshq  9u     	   A        Ԁ           	   JW A   A               0         $0H`lxrmesh    	   +b F   F               @         $0H`lx
+rmesh    	   j A   A               @L         $0H`lxrmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,206 +1,199 @@
-ò            i       %  >   >   Ѐ<                    $0H`lrmeshq   9u         '  >   >   Ј<                    $0H`lrmeshq   9u         '  >   >   Ј<                    $0H`lrmeshq   9u         (  >   >   Ј<                    $0H`lrmeshq   9u         )  >   >   Ј<                    $0H`lrmeshq   9u           A   A                (          $0H`lx $ rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u         ̙  >   >   Ј<                    $0H`lrmeshq   9u         ۚ  >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u         ޜ  >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ѐ<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           A   A                          $0H`lx  rmesh        '  >   >   Ј<                0   $0H`lrmeshq   9u         7        Ԁ                 <   <   Ѐ<                      $0H`lq   9u          *        Ԁ                 -   -   Ѐ<                @ rmeshu   4                 Ԁ               6 >   >   Ѐ<                0   $0H`lrmeshq   9u         A7       Ԁ               7 <   <   Ѐ<                P    $0H`lq  9u          7       Ԁ               i >   >   Ѐ<                    $0H`lrmeshq   9u         j       Ԁ               Tj <   <   Ѐ<                @    $0H`lq  9u          j       Ԁ               6k >   >   Ѐ<                P   $0H`lrmeshq  9u         k       Ԁ               il <   <   Ѐ<                0     $0H`lq  9u          yl       Ԁ               $ >   >   Ѐ<                `   $0H`lrmeshq  9u         $ >   >   Ј<                `   $0H`lrmeshq  9u         3 >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u         6 >   >   Ѐ<                p   $0H`lrmeshq  9u         7 >   >   Ј<                p   $0H`lrmeshq  9u         7 >   >   Ј<                p   $0H`lrmeshq  9u         8 >   >   Ј<                p   $0H`lrmeshq  9u         < -   -   Ѐ<                 rmeshu   4         a A   A               ` a         $0H`lx  rmesh        g F   F                Hg         $0H`lx
-brmesh        h       Ԁ               i -   -   Ѐ<                 rmeshu  4         j       Ԁ                A   A               @ j         $0H`lx brmesh       -  >   >   Ѐ<                   $0H`lrmeshq  9u        .        Ԁ              .        Ԁ              /  <   <   Ѐ<                    $0H`lq  9u           F   F                h         $0H`lx
-bnrmesh         F   F               p          $0H`lx
- rmesh       / A   A               P q         $0H`lx rmesh       a F   F                         $0H`lx
- qrmesh       g F   F                         $0H`lx
-rmesh        A   A               `          $0H`lx rmesh       
-  L   L                
-               
+ò            i       %  >   >   Ѐ<                    $0H`lrmeshq   9u         &  >   >   Ј<                    $0H`lrmeshq   9u         '  >   >   Ј<                    $0H`lrmeshq   9u         '  >   >   Ј<                    $0H`lrmeshq   9u         (  >   >   Ј<                    $0H`lrmeshq   9u         )  >   >   Ј<                    $0H`lrmeshq   9u         *  >   >   Ј<                    $0H`lrmeshq   9u           A   A                (          $0H`lx $ rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u         ̙  >   >   Ј<                    $0H`lrmeshq   9u         ۚ  >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u         ޜ  >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ѐ<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           A   A                          $0H`lx  rmesh          >   >   Ј<                0   $0H`lrmeshq   9u                 Ԁ               j  <   <   Ѐ<                      $0H`lq   9u          H  <   <   Ј<                      $0H`lq   9u                  Ԁ               D        Ԁ               6 >   >   Ѐ<                0   $0H`lrmeshq   9u         A7       Ԁ               7 <   <   Ѐ<                P    $0H`lq  9u          7       Ԁ               O A   A                JO         $0H`lx  rmesh        O >   >   Ѐ<                @   $0H`lrmeshq  9u         P       Ԁ               Q <   <   Ѐ<                      $0H`lq   9u           Q       Ԁ               i >   >   Ѐ<                0   $0H`lrmeshq   9u         j       Ԁ               Tj <   <   Ѐ<                P    $0H`lq  9u          j       Ԁ                >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u         	 >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u                Ԁ               Ν       Ԁ               X <   <   Ѐ<                p    $0H`lq  9u          a F   F               ` a         $0H`lx
+  Ormesh        g F   F                Hg         $0H`lx
+brmesh         A   A               @ j         $0H`lx brmesh         F   F                h         $0H`lx
+bnrmesh         F   F               p          $0H`lx
+ rmesh       O A   A               P          $0H`lx rmesh       O F   F                         $0H`lx
+rmesh       a F   F                         $0H`lx
+ rmesh        A   A               ` 2         $0H`lx rmesh       S
+  N   N                
+                
 
 
-       
-  L   L                
-               
+       ~
+  N   N                
+                
 
 
-         L   L          p      
-               
+         N   N          p      
+                
 
 
-         E   E   Ѐ             %                         
-             E   E   Ѐ             %                      
-                    Ԁ                ?   ?   Ѐ<                                  
-                  Ԁ                ?   ?   Ѐ<                                   
-                  Ԁ                L   L   <                
-                       
+       m  E   E   Ѐ             %                         
+             E   E   Ѐ             %                      
+             E   E   Ѐ             %              3       
+           i  ?   ?   Ѐ<                                   
+          y        Ԁ                ?   ?   Ѐ<                                   
+          p        Ԁ                N   N   <                
+                         
      
 
-               Ԁ              _  L   L   <                
-                      
+       +        Ԁ                N   N   <                
+                        
      
 
-               Ԁ                L   L   <                
-                      
+       ?        Ԁ                N   N   <                
+                        
      
 
-       3        Ԁ                `   `   <                0     
-         E  0    @  
+       $        Ԁ                b   b   <                       
+          E  0    @  
 
- 	                                       Ԁ              ]   `   `   <                      
-         E  0    @  
+ 	                                      Ԁ              R  b   b   <                       
+          E  0    @  
 
- 	                              2!        Ԁ              4  L   L                                
+ 	                              +        Ԁ              0  N   N                                 
 
-       )5  L   L                               
+       "1  N   N                                
 
-       U6  L   L          @                    
+       N2  N   N                                
 
-       l:        Ԁ               =  L   L   <                P     
-                
+       6        Ԁ              7  N   N   <                      
+                 
 
      
-       =        Ԁ              g=  L   L   <                      
-                
+       7        Ԁ              7  N   N   <                      
+                 
 
      
-       $>        Ԁ              >  `   `   <                
-                E  0    @  
+       8        Ԁ              p9  b   b   <                
+                 E  0    @  
 
- 	                              >        Ԁ              `?  `   `   <                
-               E  0    @  
+ 	                              9        Ԁ              9  b   b   <                
+                E  0    @  
 
- 	                              5@        Ԁ              @  `   `   <                
-`              E  0    @  
-
- 	                                F   F               E         $0H`lx
- rmesh         F   F               pr         $0H`lx
-Ermesh       / A   A                ʳ         $0H`lx Ermesh              Ԁ               `   `   <                     
-         E  0   @  
-
- 	                              Ǥ       Ԁ               `   `   <                      
-         E  0   @  
-
- 	                                     Ԁ               `   `   <                
-                E  0   @  
-
- 	                              Ʀ       Ԁ              \ `   `   <                
-0              E  0   @  
-
- 	                              1       Ԁ               `   `   <                
-              E  0   @  
-
- 	                               `   `   <                
-              E  0   @  
-
- 	                              a F   F               @3&         $0H`lx
- srmesh        F   F               '         $0H`lx
-&
-&rmesh        A   A                T'         $0H`lx &rmesh       4       Ԁ               /   /   Ѐ<                       
-                   Ԁ               /   /   Ѐ<                P       
-                   Ԁ                F   F               `S.         $0H`lx
- 'U'rmesh         F   F               .         $0H`lx
-.-rmesh       T$ E   E   Ѐ            %         
-                       $ E   E   Ѐ            p%         
-                       & ?   ?   Ј<                         
-                        &       Ԁ              & ?   ?   Ѐ<                      
-                       ( ?   ?   Ј<                         
-                        -(       Ԁ              ( ?   ?   Ј<                      
-                       ) ?   ?   Ј<                      
-                       * ?   ?   Ј<                      
-                       o+       Ԁ              + ?   ?   Ѐ<                      
-     -                  0       Ԁ              0 `   `   <                     
-         E  0   @  
-
- 	                              0       Ԁ              *1 `   `   <                     
-         E  0   @  
-
- 	                              1       Ԁ              2 `   `   <                
-               E  0   @  
-
- 	                              2       Ԁ              h3 `   `   <                
-              E  0   @  
-
- 	                              4 `   `   <                
-              E  0   @  
-
- 	                              5       Ԁ              8 `   `   <                
-               E  0   @  
-
- 	                                     Ԁ               `   `   <                     
-         E  0   @  
-
- 	                              Ǥ       Ԁ               `   `   <                     
-         E  0   @  
-
- 	                                     Ԁ               `   `   <                
-                E  0   @  
-
- 	                              Ʀ       Ԁ               `   `   <                
-              E  0   @  
-
- 	                              p       Ԁ              3 `   `   <                
-               E  0   @  
-
- 	                               `   `   <                
-               E  0   @  
-
- 	                              a F   F               s(6         $0H`lx
- .U'rmesh        F   F               0V6         $0H`lx
-(6p5rmesh        /   /   Ѐ<                                   0       Ԁ               /   /   Ѐ<                @                   # -   -   Ѐ<                rmeshu  4         -   -   Ј<                rmeshu  4        b       Ԁ               -   -   Ѐ<                @rmeshu  7               Ԁ               -   -   Ј<                @rmeshu  7               Ԁ               E   E   Ѐ            P%         
-                         E   E   Ѐ             %         
-                         A   A               =         $0H`lx V6rmesh         >   >   Ѐ<                P  $0H`lrmeshq   9u                Ԁ                <   <   Ѐ<                    $0H`lq  9u           <   <   Ј<                    $0H`lq  9u                 Ԁ                >   >   Ѐ<                0  $0H`lrmeshq  9u        k        Ԁ                <   <   Ѐ<                `   $0H`lq  9u                 Ԁ                F   F               `(=         $0H`lx
-==rmesh       W A   A               pJ`>         $0H`lx=rmesh       a F   F               @jE         $0H`lx
- =`>rmesh        F   F               pHE         $0H`lx
-kEDrmesh        A   A               jF         $0H`lxkErmesh       	 E   E   Ѐ            %         
-                        	 E   E   Ѐ            P%         
-                       	 ?   ?   Ѐ<                        
-                        	       Ԁ              /	 ?   ?   Ѐ<                `      
-                       	       Ԁ              f	 ?   ?   Ѐ<                      
-     T                 	       Ԁ              F	 `   `   <                     
-         E  0   @  
-
- 	                              V	       Ԁ              	 `   `   <                p     
-         E  0   @  
-
- 	                              	 `   `   <                p     
-         E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                
-               E  0   @  
-
- 	                              	       Ԁ              w	 `   `   <                
-              E  0   @  
-
- 	                              	 `   `   <                
-              E  0   @  
-
- 	                               	 `   `   <                
-              E  0   @  
-
- 	                              @	 `   `   <                
-              E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                     
-         E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                
-              E  0   @  
-
- 	                              	       Ԁ              F	 `   `   <                
-              E  0   @  
-
- 	                              	 `   `   <                     
-         E  0   @  
-
- 	                              	 `   `   <                     
-         E  0   @  
-
- 	                              V	       Ԁ              	 `   `   <                
-               E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                
-              E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                
-              E  0   @  
-
- 	                                F   F               M         $0H`lx
- EFrmesh         F   F               h9M         $0H`lx
-MGLrmesh       W A   A               M         $0H`lxkErmesh       @` -   -   Ѐ<                rmeshu  4        P`       Ԁ              ` -   -   Ѐ<                rmeshu  7        /a       Ԁ              a F   F               T         $0H`lx
- 9MMrmesh       c >   >   Ј<                  $0H`lrmeshq   9u        c       Ԁ              d -   -   Ѐ<                rmeshu  4        d       Ԁ              %e -   -   Ѐ<                rmeshu  7        5e       Ԁ               A   A                #U         $0H`lxTrmesh        >   >   Ѐ<                  $0H`lrmeshq  9u               Ԁ               -   -   Ѐ<                rmeshu  4        ,       Ԁ              z -   -   Ѐ<                 rmeshu  7               Ԁ              	 /   /   Ѐ<                                   	       Ԁ              *	 /   /   Ѐ<                                    )	 /   /   Ј<                                     	 /   /   Ј<                                    ɏ	 /   /   Ј<                                    	 /   /   Ј<                                    < <   <   Ѐ<                                  
-            <       Ԁ              = -   -   Ѐ<                 rmeshu  4        > -   -   Ј<                 rmeshu  4        P? -   -   Ј<                 rmeshu  4        @ -   -   Ј<                 rmeshu  4        A -   -   Ј<                 rmeshu  4        A -   -   Ј<                 rmeshu  4          A   A                N\         $0H`lx 9Mrmesh         >   >   Ѐ<                   $0H`lrmeshq   9u                Ԁ                <   <   Ѐ<                0   $0H`lq  9u                 Ԁ                >   >   Ѐ<                @  $0H`lrmeshq  9u        r        Ԁ                <   <   Ѐ<                0   $0H`lq  9u                 Ԁ              `  -   -   Ѐ<                Prmeshu  4                Ԁ              g  -   -   Ѐ<                0rmeshu  7        w        Ԁ              # A   A               @ʰ\         $0H`lxN\rmesh       a A   A               `3c         $0H`lx\rmesh       b >   >   Ѐ<                P  $0H`lrmeshq   9u        b       Ԁ              c <   <   Ѐ<                p   $0H`lq  9u         c       Ԁ              c >   >   Ѐ<                  $0H`lrmeshq  9u        d       Ԁ              e <   <   Ј<                `   $0H`lq  9u         e       Ԁ              ی A   A               Pd         $0H`lxN\rmesh        A   A               pLd         $0H`lxcrmesh         -   -   Ѐ<                `rmeshu  4        (        Ԁ              v  -   -   Ѐ<                rmeshu  7                Ԁ                F   F               Sk         $0H`lx
-dMdrmesh         <   <               p
-k         $0H`lx rmesh        A   A               k         $0H`lxkrmesh       a A   A               s1s         $0H`lxkrmesh       c >   >   Ј<                  $0H`lrmeshq   9u        c       Ԁ              d <   <   Ѐ<                   $0H`lq  9u         d       Ԁ              d >   >   Ѐ<                  $0H`lrmeshq  9u        e >   >   Ј<                  $0H`lrmeshq  9u        ^f       Ԁ              f <   <   Ѐ<                   $0H`lq  9u         f       Ԁ              ۔ A   A               *ds         $0H`lx1srmesh         F   F               z         $0H`lx
-kdsrmesh        A   A               J{         $0H`lxzrmesh       X -   -   Ѐ<                rmeshu  4               Ԁ              _ -   -   Ѐ<                rmeshu  7        o       Ԁ               A   A               (0{         $0H`lxzrmesh        >   >   Ѐ<                   $0H`lrmeshq  9u        c       Ԁ               -   -   Ѐ<                rmeshu  4               Ԁ              @  -   -   Ѐ<                rmeshu  7                Ԁ              a A   A                s         $0H`lx{rmesh       b >   >   Ѐ<                  $0H`lrmeshq   9u        b       Ԁ              c <   <   Ѐ<                0   $0H`lq  9u	         c       Ԁ              c >   >   Ѐ<                @  $0H`lrmeshq  9u	        md       Ԁ              d <   <   Ѐ<                   $0H`lq  9u 	        e       Ԁ               A   A               H         $0H`lxtrmesh       ۬ A   A               j         $0H`lxtrmesh    	     F   F               P         $0H`lx
-rmesh    	    A   A                hV         $0H`lxrmesh    	    A   A               _         $0H`lxrmesh    	   a F   F               `         $0H`lx
-_Vrmesh    	    A   A                        $0H`lxrmesh    	   ۬ A   A                         $0H`lxrmesh    
\ No newline at end of file
+ 	                              :        Ԁ                F   F                2         $0H`lx
+rmesh         F   F                E         $0H`lx
+ 33rmesh       O A   A                         $0H`lx Ermesh               Ԁ              3 b   b   <                       
+          E  0   @  
+
+ 	                              C       Ԁ               b   b   <                       
+          E  0   @  
+
+ 	                              s       Ԁ              : b   b   <                
+                  E  0   @  
+
+ 	                              J       Ԁ               b   b   <                
+                 E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+                 E  0   @  
+
+ 	                              O F   F                &         $0H`lx
+ER&rmesh       a F   F                3&         $0H`lx
+ &rmesh        A   A                t'         $0H`lx &rmesh              Ԁ               /   /   Ѐ<                       
+                   Ԁ              a /   /   Ѐ<                        
+            J /   /   Ј<                        
+            E /   /   Ј<                        
+                   Ԁ                F   F                t.         $0H`lx
+&-rmesh         F   F                S.         $0H`lx
+ u.u'rmesh       O A   A                
+/         $0H`lx .rmesh       O F   F               06         $0H`lx
+.h5rmesh       a F   F               s(6         $0H`lx
+ 6/rmesh        A   A                *6         $0H`lx (6rmesh       T E   E   Ѐ            @%         
+                        E   E   Ѐ             %         
+     `                   ?   ?   Ѐ<                         
+                               Ԁ               ?   ?   Ѐ<                0      
+                              Ԁ              ; ?   ?   Ѐ<                P      
+     u                        Ԁ               b   b   <                0      
+          E  0   @  
+
+ 	                                     Ԁ               b   b   <                0      
+          E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+0                 E  0   @  
+
+ 	                              ɓ       Ԁ              _ b   b   <                
+0                E  0   @  
+
+ 	                               b   b   <                
+0                E  0   @  
+
+ 	                              Ø b   b   <                
+0                E  0   @  
+
+ 	                                     Ԁ              ݜ b   b   <                @      
+          E  0   @  
+
+ 	                                     Ԁ              ! b   b   <                
+0                E  0   @  
+
+ 	                                     Ԁ               b   b   <                @      
+          E  0   @  
+
+ 	                              j       Ԁ              1 b   b   <                
+@                 E  0   @  
+
+ 	                              A       Ԁ               b   b   <                
+@                E  0   @  
+
+ 	                              Ӥ b   b   <                
+@                E  0   @  
+
+ 	                                     Ԁ              9        Ԁ              E:  /   /   Ѐ<                `       
+            U:        Ԁ              :  /   /   Ѐ<                @       
+            8;        Ԁ                F   F               p(=         $0H`lx
+(6<rmesh         F   F               P=         $0H`lx
+ =6rmesh       O A   A                JX>         $0H`lx =rmesh       O F   F               HXE         $0H`lx
+=Drmesh       a F   F               `jE         $0H`lx
+ XEX>rmesh        A   A                jE         $0H`lx kErmesh       
+	       Ԁ              	 b   b   <                P      
+          E  0   @  
+
+ 	                              	       Ԁ              8	 b   b   <                P      
+          E  0   @  
+
+ 	                              	       Ԁ              	 E   E   Ѐ            %                         
+           #	 E   E   Ѐ            p%                      
+           	       Ԁ              V	 b   b   <                `      
+          E  0   @  
+
+ 	                              f	       Ԁ              	 b   b   <                `      
+          E  0   @  
+
+ 	                              	       Ԁ              I E   E   Ѐ             %                         
+            E   E   Ѐ            %                      
+            E   E   Ѐ            %              8       
+           )       Ԁ               ?   ?   Ѐ<                                  
+                 Ԁ               ?   ?   Ѐ<                           `       
+                 Ԁ               b   b   <                
+P                 E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+P                E  0   @  
+
+ 	                              I       Ԁ               ?   ?   Ј<                                  
+                 Ԁ               ?   ?   Ѐ<                           ^       
+                 Ԁ               b   b   <                
+P                E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+0                E  0   @  
+
+ 	                              W b   b   <                
+`                 E  0   @  
+
+ 	                              g       Ԁ               b   b   <                
+`                E  0   @  
+
+ 	                               b   b   <                
+`                E  0   @  
+
+ 	                              o       Ԁ              6 b   b   <                
+@                E  0   @  
+
+ 	                                F   F               hL         $0H`lx
+kE/Lrmesh         F   F               M         $0H`lx
+ LErmesh       O A   A               0M         $0H`lx Mrmesh       O F   F               T         $0H`lx
+M/Lrmesh       a F   F               T         $0H`lx
+ TMrmesh       $ <   <   Ѐ<                                  
+            $       Ԁ              L% /   /   Ѐ<                       
+            r& -   -   Ѐ<                rmeshu  4        & /   /   Ј<                       
+            w'       Ԁ              ,( -   -   Ј<                rmeshu  4        ( -   -   Ј<                rmeshu  4        ) -   -   Ј<                rmeshu  4        * -   -   Ј<                rmeshu  4        + -   -   Ј<                rmeshu  4        , -   -   Ј<                rmeshu  4          A   A                ;\         $0H`lxTrmesh         F   F               N\         $0H`lx
+ <\Mrmesh       {M /   /   Ѐ<                                   N       Ԁ              2N -   -   Ѐ<                 rmeshu  4        N       Ԁ              9O -   -   Ѐ<                Prmeshu  7        IO       Ԁ              O A   A               `\         $0H`lx N\rmesh       !P >   >   Ѐ<                  $0H`lrmeshq  9u        @Q -   -   Ѐ<                prmeshu  4        PQ       Ԁ              Q >   >   Ј<                  $0H`lrmeshq  9u        GR       Ԁ              {R -   -   Ѐ<                 rmeshu  7        S       Ԁ              O A   A               c         $0H`lxN\rmesh       a A   A               03c         $0H`lx crmesh       b >   >   Ѐ<                  $0H`lrmeshq   9u        b       Ԁ              c <   <   Ѐ<                @   $0H`lq  9u         c       Ԁ              c >   >   Ѐ<                P  $0H`lrmeshq  9u        d >   >   Ј<                P  $0H`lrmeshq  9u        se       Ԁ              e <   <   Ѐ<                   $0H`lq  9u         f       Ԁ               A   A               ]d         $0H`lxcrmesh         A   A                }k         $0H`lxcrmesh         F   F               `Sk         $0H`lx
+ ~k^drmesh       O A   A               0s         $0H`lxkrmesh       a F   F               ps1s         $0H`lx
+ s^drmesh        -   -   Ѐ<                rmeshu  4        ,       Ԁ               -   -   Ј<                rmeshu  7               Ԁ              h A   A               *s         $0H`lx1srmesh        >   >   Ѐ<                  $0H`lrmeshq  9u        3       Ԁ               -   -   Ѐ<                rmeshu  4               Ԁ               -   -   Ѐ<                rmeshu  7               Ԁ                A   A               @(z         $0H`lx1srmesh         A   A               z         $0H`lx zrmesh         >   >   Ѐ<                  $0H`lrmeshq   9u                Ԁ                <   <   Ѐ<                   $0H`lq  9u                 Ԁ                >   >   Ѐ<                  $0H`lrmeshq  9u          >   >   Ј<                  $0H`lrmeshq  9u                Ԁ                <   <   Ѐ<                    $0H`lq  9u         $        Ԁ              W A   A               Ji{         $0H`lxzrmesh       O A   A               PHa         $0H`lx1srmesh       @` -   -   Ѐ<                `rmeshu  4        P`       Ԁ              ` -   -   Ѐ<                rmeshu  7        /a       Ԁ              a F   F               s         $0H`lx
+ ai{rmesh       b >   >   Ѐ<                p  $0H`lrmeshq   9u        b       Ԁ              c -   -   Ѐ<                 rmeshu  4        c       Ԁ              :d -   -   Ѐ<                rmeshu  7        Jd       Ԁ               A   A                j
+         $0H`lxtrmesh    	     A   A                        $0H`lx
+rmesh    	     >   >   Ѐ<                  $0H`lrmeshq   9u     	           Ԁ           	     <   <   Ѐ<                    $0H`lq  9u      	           Ԁ           	     >   >   Ѐ<                0  $0H`lrmeshq  9u     	   {        Ԁ           	     <   <   Ѐ<                   $0H`lq  9u      	           Ԁ           	     A   A               h         $0H`lxrmesh    	   W A   A               0         $0H`lxrmesh    	   a F   F               @         $0H`lx
+rmesh    	    A   A                        $0H`lxrmesh    	    A   A               @L         $0H`lxrmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,222 +1,208 @@
-ò            i       u$  <   <                 $          $0H`lx rmesh        $  >   >   Ѐ<                    $0H`lrmeshq   9u         %  >   >   Ј<                    $0H`lrmeshq   9u         &  >   >   Ј<                    $0H`lrmeshq   9u         |'  >   >   Ј<                    $0H`lrmeshq   9u         (  >   >   Ј<                    $0H`lrmeshq   9u         )  >   >   Ј<                    $0H`lrmeshq   9u         *  >   >   Ј<                    $0H`lrmeshq   9u         j@  >   >   Ѐ<      	             $0H`lrmeshq   9u         RB  >   >   Ј<      	             $0H`lrmeshq   9u         (  A   A                (          $0H`lx $ rmesh        u  >   >   Ѐ<                    $0H`lrmeshq   9u         i  >   >   Ј<                    $0H`lrmeshq   9u         o  >   >   Ј<                    $0H`lrmeshq   9u         Q  >   >   Ј<                    $0H`lrmeshq   9u         W  >   >   Ј<                    $0H`lrmeshq   9u           A   A                          $0H`lx  rmesh          >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ѐ<                0   $0H`lrmeshq   9u           >   >   Ј<                0   $0H`lrmeshq   9u           >   >   Ј<                0   $0H`lrmeshq   9u           >   >   Ј<                0   $0H`lrmeshq   9u           >   >   Ј<                0   $0H`lrmeshq   9u           >   >   Ј<                0   $0H`lrmeshq   9u                 Ԁ       	        8  -   -   Ѐ<      	          0 rmeshu  7           >   >   Ј<                0   $0H`lrmeshq   9u         c        Ԁ                 <   <   Ѐ<                      $0H`lq   9u                  Ԁ               T  -   -   Ѐ<                @ rmeshu   4                 Ԁ               [  -   -   Ѐ<                @ rmeshu  7         k        Ԁ               7 >   >   Ѐ<                0   $0H`lrmeshq   9u         7       Ԁ               c7 <   <   Ѐ<                P    $0H`lq  9u          8       Ԁ               2j       Ԁ               j <   <   Ѐ<                @    $0H`lq  9u          k >   >   Ѐ<                P   $0H`lrmeshq  9u         l       Ԁ                <   <               P -         $0H`lx rmesh         >   >   Ѐ<                `   $0H`lrmeshq  9u         Ɩ >   >   Ј<                `   $0H`lrmeshq  9u         × >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u         ƙ >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ѐ<      	          `   $0H`lrmeshq   9u                Ԁ       	        5 >   >   Ѐ<                p   $0H`lrmeshq  9u         6 >   >   Ј<                p   $0H`lrmeshq  9u         7 >   >   Ј<                p   $0H`lrmeshq  9u         _8 >   >   Ј<                p   $0H`lrmeshq  9u         S9 >   >   Ј<                p   $0H`lrmeshq  9u         k: >   >   Ј<                p   $0H`lrmeshq  9u         h; >   >   Ј<                p   $0H`lrmeshq  9u         A< -   -   Ѐ<                 rmeshu   4         <       Ԁ               J -   -   Ѐ<      	          p rmeshu  9         K       Ԁ       	        #b A   A               ` a         $0H`lx  rmesh        Hg F   F                Hg         $0H`lx
-brmesh        Oh >   >   Ѐ<                   $0H`lrmeshq   9u         _h       Ԁ               h -   -   Ѐ<                 rmeshu  4         >i       Ԁ               i -   -   Ѐ<                 rmeshu  7         i       Ԁ              j  >   >   Ѐ<      	             $0H`lrmeshq   9u        m	        Ԁ       	       J
-        Ԁ       	       
-  <   <   Ѐ<      	              $0H`lq  9u         },  A   A                Mn         $0H`lxJrmesh       ,  >   >   Ѐ<                   $0H`lrmeshq  9u        H-        Ԁ              -  <   <   Ѐ<                    $0H`lq  9u         -        Ԁ              .  >   >   Ѐ<                   $0H`lrmeshq  9u        .        Ԁ              /  <   <   Ѐ<                    $0H`lq  9u         /        Ԁ              (  F   F                h         $0H`lx
-bnrmesh         F   F               p          $0H`lx
- rmesh        A   A                m         $0H`lxJrmesh       +b F   F                         $0H`lx
- qrmesh       Hg F   F                         $0H`lx
-rmesh       
-
-  L   L               
-               
+ò            i       u$  <   <                 $          $0H`lx rmesh        $  >   >   Ѐ<                    $0H`lrmeshq   9u         %  >   >   Ј<                    $0H`lrmeshq   9u         &  >   >   Ј<                    $0H`lrmeshq   9u         |'  >   >   Ј<                    $0H`lrmeshq   9u         (  >   >   Ј<                    $0H`lrmeshq   9u         )  >   >   Ј<                    $0H`lrmeshq   9u         *  >   >   Ј<                    $0H`lrmeshq   9u         j@  >   >   Ѐ<      	             $0H`lrmeshq   9u         pA  >   >   Ј<      	             $0H`lrmeshq   9u         RB  >   >   Ј<      	             $0H`lrmeshq   9u         jC  >   >   Ј<      	             $0H`lrmeshq   9u         yD  >   >   Ј<      	             $0H`lrmeshq   9u         RE  >   >   Ј<      	             $0H`lrmeshq   9u         jF  >   >   Ј<      	             $0H`lrmeshq   9u         (  A   A                (          $0H`lx $ rmesh        u  >   >   Ѐ<                    $0H`lrmeshq   9u         i  >   >   Ј<                    $0H`lrmeshq   9u         o  >   >   Ј<                    $0H`lrmeshq   9u         Q  >   >   Ј<                    $0H`lrmeshq   9u         W  >   >   Ј<                    $0H`lrmeshq   9u           A   A                          $0H`lx  rmesh          >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ѐ<                0   $0H`lrmeshq   9u           >   >   Ј<                0   $0H`lrmeshq   9u           >   >   Ј<                0   $0H`lrmeshq   9u           >   >   Ј<                0   $0H`lrmeshq   9u           >   >   Ј<                0   $0H`lrmeshq   9u           >   >   Ј<                0   $0H`lrmeshq   9u         H        Ԁ               8  -   -   Ѐ<      	          0 rmeshu  7           <   <   Ј<                      $0H`lq   9u                  Ԁ               )  -   -   Ѐ<                @ rmeshu   4                 Ԁ               B  -   -   Ј<      	          0 rmeshu  7           -   -   Ѐ<                @ rmeshu  7                 Ԁ               7 >   >   Ѐ<                0   $0H`lrmeshq   9u         7       Ԁ               c7 <   <   Ѐ<                P    $0H`lq  9u          8       Ԁ               IP >   >   Ѐ<                @   $0H`lrmeshq  9u         LQ       Ԁ               2j       Ԁ               j <   <   Ѐ<                P    $0H`lq  9u           <   <               P -         $0H`lx rmesh         >   >   Ѐ<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u          >   >   Ј<                `   $0H`lrmeshq  9u         x >   >   Ј<                `   $0H`lrmeshq  9u         !       Ԁ                <   <   Ѐ<                `    $0H`lq   9u                 Ԁ                >   >   Ѐ<                p   $0H`lrmeshq   9u                Ԁ                <   <   Ѐ<                p    $0H`lq  9u                 Ԁ                >   >   Ѐ<      	             $0H`lrmeshq  9u                Ԁ       	        >6       Ԁ       	        6 <   <   Ѐ<      	              $0H`lq  9u          +b F   F               ` a         $0H`lx
+  Ormesh        Hg F   F                Hg         $0H`lx
+brmesh       },  A   A                Mn         $0H`lxrmesh       (  F   F                h         $0H`lx
+bnrmesh         F   F               p          $0H`lx
+ rmesh        F   F                m         $0H`lx
+rmesh       HO F   F                         $0H`lx
+rmesh       +b F   F                         $0H`lx
+ rmesh       	  N   N                
+                
 
 
-       5
-  L   L                
-               
+       	  N   N                
+                
 
 
-       a  L   L                
-               
+       
+  N   N                
+                
 
 
-         E   E   Ѐ             %                      
-             E   E   Ѐ             %              3       
-             E   E   Ѐ             %                     
-           s        Ԁ       	         ?   ?   Ј<                0           -       
-                  Ԁ              A  ?   ?   Ѐ<                                  
-                  Ԁ              x  ?   ?   Ѐ<                                   
-          4        Ԁ                L   L   <                
-                      
+       0  E   E   Ѐ             %                      
+             E   E   Ѐ             %              3       
+             E   E   Ѐ             %                     
+             ?   ?   Ѐ<                            /       
+                  Ԁ                ?   ?   Ѐ<                                   
+                  Ԁ              3  ?   ?   Ѐ<                                   
+          W        Ԁ                N   N   <                
+                        
      
 
-               Ԁ              F  L   L   <                
-                      
+               Ԁ              i  N   N   <                
+                        
      
 
-               Ԁ                L   L   <      	          
-@                     
+       &        Ԁ                N   N   <      	          
+                        
      
 
-       3        Ԁ       	         `   `   <                P     
-         E  0    @  
+                Ԁ       	         b   b   <                       
+          E  0    @  
 
- 	                                      Ԁ              ]  `   `   <                0     
-         E  0    @  
+ 	                                      Ԁ              N  b   b   <                       
+          E  0    @  
 
- 	                              2         Ԁ                 `   `   <                      
-         E  0    @  
+ 	                              '        Ԁ                b   b   <                       
+          E  0    @  
 
- 	                              5  L   L                               
+ 	                              ,  F   F                         $0H`lx
+`rmesh       1  N   N                                
 
-       5  L   L          @                    
+       1  N   N                                
 
-        7  L   L          `                    
+       2  N   N                                
 
-       9        Ԁ       	       /:  L   L   <                p     
-                
-
-     
-       ?:        Ԁ              :  L   L   <                P     
-                
+       5        Ԁ       	       6  N   N   <                      
+                 
 
      
-       <  L   L   <                P     
-                
+       6        Ԁ              7  N   N   <                      
+                 
 
      
-       <=        Ԁ              =  L   L   <                      
-                
+       7        Ԁ              l8  N   N   <                      
+                 
 
      
-       #?        Ԁ              ?  `   `   <                
-               E  0    @  
+       9        Ԁ              :  b   b   <                
+                E  0    @  
+
+ 	                              :        Ԁ              :  b   b   <                
+                E  0    @  
 
- 	                              @        Ԁ              _@  `   `   <                
-`              E  0    @  
+ 	                              ;        Ԁ              <  b   b   <      	          
+                E  0    @  
 
- 	                              4A        Ԁ                F   F               E         $0H`lx
- rmesh       (  F   F               pr         $0H`lx
-Ermesh        F   F               	&         $0H`lx
-srmesh              Ԁ       	        `   `   <                     
-         E  0   @  
-
- 	                              ǣ       Ԁ               `   `   <                     
-         E  0   @  
-
- 	                                     Ԁ               `   `   <                      
-         E  0   @  
-
- 	                                     Ԁ               `   `   <                
-0              E  0   @  
-
- 	                                     Ԁ              [ `   `   <                
-              E  0   @  
-
- 	                              n `   `   <                
-              E  0   @  
-
- 	                              # `   `   <                
-              E  0   @  
-
- 	                                     Ԁ              +b F   F               @3&         $0H`lx
- srmesh       H F   F               '         $0H`lx
-&
-&rmesh       }       Ԁ       	        /   /   Ѐ<                       
-                   Ԁ              U /   /   Ѐ<                       
-                   Ԁ              d /   /   Ѐ<                P       
-            & F   F               ͪ-         $0H`lx
-'rmesh         -   -   Ѐ<      	          rmeshu  4                Ԁ       	       d
-  >   >   Ј<      	            $0H`lrmeshq  9u        H  >   >   Ѐ<      	             $0H`lrmeshq  9u        K        Ԁ       	               Ԁ       	         <   <   Ѐ<      	             $0H`lq  9u 	          F   F               `S.         $0H`lx
- 'U'rmesh       (  F   F               .         $0H`lx
-.-rmesh       ! ?   ?   Ѐ<      	                   
-                      # E   E   Ѐ            0%         
-     8                  # E   E   Ѐ            %         
-                       % E   E   Ѐ            p%         
-                       &       Ԁ              2+ ?   ?   Ј<                      
-                       B+       Ԁ              + ?   ?   Ѐ<                      
-     -                 9,       Ԁ              , ?   ?   Ѐ<      	          P      
-                      / `   `   <                @     
-         E  0   @  
-
- 	                              /       Ԁ              *0 `   `   <                     
-         E  0   @  
-
- 	                              0       Ԁ              1 `   `   <                     
-         E  0   @  
-
- 	                              2       Ԁ              M5 `   `   <                
-              E  0   @  
-
- 	                              ]5       Ԁ              5 `   `   <                
-               E  0   @  
-
- 	                              7 `   `   <                
-               E  0   @  
-
- 	                              T8       Ԁ              9 `   `   <      	          
-`              E  0   @  
-
- 	                                     Ԁ       	        `   `   <                p     
-         E  0   @  
-
- 	                              ǣ       Ԁ               `   `   <                     
-         E  0   @  
-
- 	                                     Ԁ               `   `   <                     
-         E  0   @  
-
- 	                                     Ԁ              3 `   `   <                
-              E  0   @  
-
- 	                              C       Ԁ               `   `   <                
-               E  0   @  
-
- 	                                F   F               o5         $0H`lx
-.-rmesh       s `   `   <                
-               E  0   @  
-
- 	                              H       Ԁ               `   `   <      	          
-              E  0   @  
-
- 	                              +b F   F               s(6         $0H`lx
- .U'rmesh       H F   F               0V6         $0H`lx
-(6p5rmesh        /   /   Ѐ<                                          Ԁ              Q /   /   Ѐ<                @                          Ԁ              % -   -   Ј<                rmeshu  4               Ԁ              9       Ԁ               E   E   Ѐ            %         
-     >                  J E   E   Ѐ            P%         
-                         E   E   Ѐ             %         
-                       > F   F               =         $0H`lx
-V6<rmesh         A   A               =         $0H`lx V6rmesh               Ԁ              X  <   <   Ѐ<                    $0H`lq  9u         H  <   <   Ј<                    $0H`lq  9u         .  >   >   Ѐ<                0  $0H`lrmeshq  9u        1        Ԁ              (  F   F               `(=         $0H`lx
-==rmesh        F   F               -D         $0H`lx
-=Drmesh       +b F   F               @jE         $0H`lx
- =`>rmesh       H F   F               pHE         $0H`lx
-kEDrmesh       	 E   E   Ѐ            %         
-     >                  
-	 E   E   Ѐ            %         
-                        B	 E   E   Ѐ            P%         
-                       	       Ԁ              	 ?   ?   Ѐ<                `      
-                       	       Ԁ              	 ?   ?   Ѐ<                      
-     T                 	       Ԁ              0	 ?   ?   Ѐ<      	                
-     +                 	       Ԁ       	       F	 `   `   <                      
-         E  0   @  
-
- 	                              V	       Ԁ              	 `   `   <                     
-         E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                p     
-         E  0   @  
-
- 	                              	 `   `   <                     
-         E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                     
-         E  0   @  
-
- 	                              	       Ԁ              F	 `   `   <                
-              E  0   @  
-
- 	                              V	       Ԁ              	 `   `   <                
-              E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                     
-         E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                
-              E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                
-              E  0   @  
-
- 	                              	       Ԁ              	 `   `   <      	          
-0              E  0   @  
-
- 	                              > F   F               @MGL         $0H`lx
-E'Lrmesh         F   F               M         $0H`lx
- EFrmesh       (  F   F               h9M         $0H`lx
-MGLrmesh       |`       Ԁ              ` -   -   Ѐ<                rmeshu  7        +b F   F               T         $0H`lx
- 9MMrmesh       c       Ԁ              `d -   -   Ѐ<                rmeshu  4        ae       Ԁ              H F   F               T         $0H`lx
-TGLrmesh       X       Ԁ               -   -   Ѐ<                 rmeshu  7        s	 /   /   Ѐ<                                   	       Ԁ              ъ	 /   /   Ѐ<                                    ̋	 /   /   Ј<                                    Ќ	 /   /   Ј<                                    	 /   /   Ј<                                    	 /   /   Ј<                                    p	 /   /   Ј<                                    P	 /   /   Ј<                                    < <   <   Ѐ<                                  
-            *=       Ԁ              L= -   -   Ѐ<                 rmeshu  4        :> -   -   Ј<                 rmeshu  4        > -   -   Ј<                 rmeshu  4        ? -   -   Ј<                 rmeshu  4        @ -   -   Ј<                 rmeshu  4        A -   -   Ј<                 rmeshu  4        O   -   -   Ј<                 rmeshu  4          A   A                N\         $0H`lx 9Mrmesh               Ԁ              X  <   <   Ѐ<                0   $0H`lq  9u         5  >   >   Ѐ<                @  $0H`lrmeshq  9u        8        Ԁ                -   -   Ѐ<                Prmeshu  4                Ԁ                -   -   Ѐ<                0rmeshu  7                Ԁ              (  A   A               @{\         $0H`lxN\rmesh       #b A   A               `3c         $0H`lx\rmesh       Eb >   >   Ѐ<                P  $0H`lrmeshq   9u        b       Ԁ              xc <   <   Ѐ<                p   $0H`lq  9u         c       Ԁ              ^d >   >   Ѐ<                  $0H`lrmeshq  9u        nd       Ԁ              d <   <   Ѐ<                `   $0H`lq  9u         ~e <   <   Ј<                `   $0H`lq  9u         #f       Ԁ              H A   A               pLd         $0H`lxcrmesh       T        Ԁ              ʿ  -   -   Ѐ<                rmeshu  7          F   F               Sk         $0H`lx
-dMdrmesh       ( A   A               k         $0H`lxkrmesh       #b A   A               s1s         $0H`lxkrmesh       c       Ԁ              kd <   <   Ѐ<                   $0H`lq  9u         !f >   >   Ј<                  $0H`lrmeshq  9u        $g       Ԁ              H A   A               s         $0H`lx1srmesh         F   F               z         $0H`lx
-kdsrmesh        -   -   Ѐ<                rmeshu  4               Ԁ               -   -   Ѐ<                rmeshu  7               Ԁ              ( A   A               (0{         $0H`lxzrmesh       ' >   >   Ѐ<                   $0H`lrmeshq  9u        7       Ԁ               -   -   Ѐ<                rmeshu  4                Ԁ                -   -   Ѐ<                rmeshu  7                Ԁ              #b A   A                s         $0H`lx{rmesh       Eb >   >   Ѐ<                  $0H`lrmeshq   9u        b       Ԁ              xc <   <   Ѐ<                0   $0H`lq  9u	         c       Ԁ              0d >   >   Ѐ<                @  $0H`lrmeshq  9u	        @d       Ԁ              d <   <   Ѐ<                   $0H`lq  9u 	        3e       Ԁ              H A   A               H         $0H`lxtrmesh    	     F   F               P         $0H`lx
-rmesh    	   ( A   A                hV         $0H`lxrmesh    	   +b F   F               `         $0H`lx
-_Vrmesh    	   H A   A                        $0H`lxrmesh    
\ No newline at end of file
+ 	                              (  F   F                2         $0H`lx
+rmesh         F   F                E         $0H`lx
+ 33rmesh              Ԁ       	       ã b   b   <                       
+          E  0   @  
+
+ 	                              ӣ       Ԁ              * b   b   <                       
+          E  0   @  
+
+ 	                               b   b   <                       
+          E  0   @  
+
+ 	                              o       Ԁ              6 b   b   <                       
+          E  0   @  
+
+ 	                              v       Ԁ              | b   b   <                
+                 E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+                 E  0   @  
+
+ 	                                     Ԁ               F   F               Q&         $0H`lx
+3`rmesh       HO F   F                &         $0H`lx
+ER&rmesh       +b F   F                3&         $0H`lx
+ &rmesh       L <   <   Ѐ<                        	           
+            \       Ԁ               /   /   Ѐ<                       
+            ?       Ԁ               /   /   Ѐ<                        
+             /   /   Ј<                        
+            },  A   A               @-         $0H`lx&rmesh       (  F   F                t.         $0H`lx
+&-rmesh         F   F                S.         $0H`lx
+ u.u'rmesh       } >   >   Ѐ<      	          P  $0H`lrmeshq  9u        ~       Ԁ       	       s       Ԁ       	        <   <   Ѐ<      	          `   $0H`lq  9u          F   F               pg5         $0H`lx
+u.C5rmesh       HO F   F               06         $0H`lx
+.h5rmesh       +b F   F               s(6         $0H`lx
+ 6/rmesh       Ɓ ?   ?   Ѐ<      	                  
+                       E   E   Ѐ            %         
+     ,                  ߃ E   E   Ѐ            @%         
+                        E   E   Ѐ             %         
+     `                         Ԁ              p ?   ?   Ѐ<                0      
+                              Ԁ              Ά ?   ?   Ѐ<                P      
+     u                 w       Ԁ               ?   ?   Ј<      	                
+                       ?   ?   Ј<      	                
+                             Ԁ       	        b   b   <                0      
+          E  0   @  
+
+ 	                                     Ԁ               b   b   <                0      
+          E  0   @  
+
+ 	                                     Ԁ               b   b   <                0      
+          E  0   @  
+
+ 	                              ]       Ԁ       	       ٛ b   b   <                @      
+          E  0   @  
+
+ 	                                     Ԁ              @ b   b   <                @      
+          E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+0                E  0   @  
+
+ 	                              ͟       Ԁ              - b   b   <                @      
+          E  0   @  
+
+ 	                              m       Ԁ              o b   b   <                
+@                E  0   @  
+
+ 	                                     Ԁ              & F   F               <         $0H`lx
+6<rmesh       9        Ԁ       	       9  /   /   Ѐ<                       
+            9        Ԁ              9  /   /   Ѐ<                `       
+            :        Ԁ              :  /   /   Ѐ<                @       
+            (  F   F               p(=         $0H`lx
+(6<rmesh         F   F               P=         $0H`lx
+ =6rmesh        F   F               -D         $0H`lx
+=^Drmesh       HO F   F               HXE         $0H`lx
+=Drmesh       +b F   F               `jE         $0H`lx
+ XEX>rmesh       	       Ԁ       	       	 b   b   <                P      
+          E  0   @  
+
+ 	                              	       Ԁ              4	 b   b   <                P      
+          E  0   @  
+
+ 	                              	       Ԁ              	 b   b   <                P      
+          E  0   @  
+
+ 	                              R	 b   b   <                `      
+          E  0   @  
+
+ 	                              b	       Ԁ              	 b   b   <                `      
+          E  0   @  
+
+ 	                              	       Ԁ              Y	 b   b   <                `      
+          E  0   @  
+
+ 	                               E   E   Ѐ            %                      
+           [ E   E   Ѐ            %              8       
+            E   E   Ѐ            %                     
+           ^       Ԁ       	        ?   ?   Ѐ<                           1       
+                 Ԁ              J ?   ?   Ѐ<                                  
+                 Ԁ               ?   ?   Ѐ<                           `       
+                 Ԁ       	        ?   ?   Ј<                            /       
+                 Ԁ              j ?   ?   Ѐ<                                  
+          g ?   ?   Ј<                                  
+          @ ?   ?   Ј<                                  
+                 Ԁ              w ?   ?   Ѐ<                           ^       
+           b   b   <                
+P                E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+0                E  0   @  
+
+ 	                                     Ԁ              2 b   b   <                
+`                E  0   @  
+
+ 	                              B       Ԁ               b   b   <                
+@                E  0   @  
+
+ 	                              r       Ԁ              9 b   b   <      	          
+@                E  0   @  
+
+ 	                              & F   F               M/L         $0H`lx
+XEKrmesh       (  F   F               hL         $0H`lx
+kE/Lrmesh         F   F               M         $0H`lx
+ LErmesh       HO F   F               T         $0H`lx
+M/Lrmesh       +b F   F               T         $0H`lx
+ TMrmesh       $ <   <   Ѐ<                                  
+            *%       Ԁ              % /   /   Ѐ<                       
+            & -   -   Ѐ<                rmeshu  4        :' /   /   Ј<                       
+            ' -   -   Ј<                rmeshu  4        ( -   -   Ј<                rmeshu  4        ) -   -   Ј<                rmeshu  4        k* -   -   Ј<                rmeshu  4        b+ -   -   Ј<                rmeshu  4        5, -   -   Ј<                rmeshu  4        (  A   A                ;\         $0H`lxTrmesh         F   F               N\         $0H`lx
+ <\Mrmesh       M /   /   Ѐ<                                   M       Ԁ              N -   -   Ѐ<                 rmeshu  4        uO       Ԁ              P >   >   Ѐ<                  $0H`lrmeshq  9u        |Q       Ԁ              
+R >   >   Ј<                  $0H`lrmeshq  9u        R -   -   Ѐ<                 rmeshu  7        HO A   A               c         $0H`lxN\rmesh       #b A   A               03c         $0H`lx crmesh       b       Ԁ              xc <   <   Ѐ<                @   $0H`lq  9u         6e >   >   Ј<                P  $0H`lrmeshq  9u        9f       Ԁ              (  A   A                }k         $0H`lxcrmesh         F   F               `Sk         $0H`lx
+ ~k^drmesh       HO A   A               0s         $0H`lxkrmesh       +b F   F               ps1s         $0H`lx
+ s^drmesh        -   -   Ѐ<                rmeshu  4               Ԁ               >   >   Ѐ<                  $0H`lrmeshq  9u               Ԁ              m -   -   Ѐ<                rmeshu  7        (  A   A               @(z         $0H`lx1srmesh               Ԁ              X  <   <   Ѐ<                   $0H`lq  9u         5  >   >   Ѐ<                  $0H`lrmeshq  9u        M  >   >   Ј<                  $0H`lrmeshq  9u        P        Ԁ              HO A   A               PHa         $0H`lx1srmesh       _ -   -   Ѐ<                `rmeshu  4        |`       Ԁ              ` -   -   Ѐ<                rmeshu  7        a       Ԁ              +b F   F               s         $0H`lx
+ ai{rmesh       Mb >   >   Ѐ<                p  $0H`lrmeshq   9u        b       Ԁ              lc -   -   Ѐ<                 rmeshu  4        |c       Ԁ              c -   -   Ѐ<                rmeshu  7        vd       Ԁ           	     A   A                        $0H`lx
+rmesh    	   %  >   >   Ѐ<                  $0H`lrmeshq   9u     	           Ԁ           	   X  <   <   Ѐ<                    $0H`lq  9u      	   h        Ԁ           	   >  >   >   Ѐ<                0  $0H`lrmeshq  9u     	   N        Ԁ           	     <   <   Ѐ<                   $0H`lq  9u      	   A        Ԁ           	   (  A   A               h         $0H`lxrmesh    	   +b F   F               @         $0H`lx
+rmesh    	   H A   A                        $0H`lxrmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-3-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-3-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-3-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-3-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,267 +1,226 @@
-ò            i       $  <   <                 $          $0H`lx rmesh        ?  A   A          	     	 k?          $0H`lx $ rmesh        ?  >   >   Ѐ<      	             $0H`lrmeshq   9u         A  >   >   Ј<      	             $0H`lrmeshq   9u         A  >   >   Ј<      	             $0H`lrmeshq   9u         B  >   >   Ј<      	             $0H`lrmeshq   9u         D  >   >   Ј<      	             $0H`lrmeshq   9u         D  >   >   Ј<      	             $0H`lrmeshq   9u         E  >   >   Ј<      	             $0H`lrmeshq   9u           A   A                (          $0H`lx $ rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u         ɗ  >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           -   -   Ј<           	     	@ rmeshu   4                 Ԁ       	          -   -   Ѐ<      	          0 rmeshu  7         u        Ԁ               '  >   >   Ј<                0   $0H`lrmeshq   9u         *        Ԁ                 -   -   Ѐ<                @ rmeshu   4                 Ԁ                 -   -   Ѐ<                @ rmeshu  7                 Ԁ                       Ԁ       
+ò            i       $  <   <                 $          $0H`lx rmesh        ?  A   A          	     	 k?          $0H`lx $ rmesh        ?  >   >   Ѐ<      	             $0H`lrmeshq   9u         A  >   >   Ј<      	             $0H`lrmeshq   9u         A  >   >   Ј<      	             $0H`lrmeshq   9u         B  >   >   Ј<      	             $0H`lrmeshq   9u         D  >   >   Ј<      	             $0H`lrmeshq   9u         D  >   >   Ј<      	             $0H`lrmeshq   9u         E  >   >   Ј<      	             $0H`lrmeshq   9u           A   A                (          $0H`lx $ rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u         ɗ  >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           -   -   Ј<           	     	@ rmeshu   4                 Ԁ       	          -   -   Ѐ<      	          0 rmeshu  7                 Ԁ               ~  -   -   Ѐ<                @ rmeshu   4                 Ԁ                 -   -   Ј<      	          0 rmeshu  7                 Ԁ                 -   -   Ѐ<                @ rmeshu  7         D        Ԁ                       Ԁ       
           <   <   Ѐ<      
-     	     	P    $0H`lq  9u          A7       Ԁ               7 <   <   Ѐ<                P    $0H`lq  9u          - <   <               P -         $0H`lx rmesh         F   F          	     	p          $0H`lx
- rmesh        & >   >   Ѐ<      	          `   $0H`lrmeshq   9u         ϩ       Ԁ               Y <   <   Ѐ<           	     	    $0H`lq  9u          i       Ԁ       	        < -   -   Ѐ<                 rmeshu   4         <       Ԁ               YJ -   -   Ѐ<      	          p rmeshu  9         J       Ԁ               `K -   -   Ѐ<           	     	 rmeshu  7         pK       Ԁ       	        g F   F                Hg         $0H`lx
-brmesh        g >   >   Ѐ<                   $0H`lrmeshq   9u         h       Ԁ               i -   -   Ѐ<                 rmeshu  4         i       Ԁ               qi -   -   Ѐ<                 rmeshu  7         j       Ԁ                A   A          	     	 I         $0H`lx rmesh         >   >   Ѐ<      	             $0H`lrmeshq   9u                Ԁ              1	  <   <   Ѐ<           	     	    $0H`lq  9u         A	        Ԁ       	       
-  >   >   Ѐ<           	     	   $0H`lrmeshq  9u        
-        Ԁ       	       l
-  <   <   Ѐ<      	              $0H`lq  9u                 Ԁ              ,  A   A                Mn         $0H`lxJrmesh       -  >   >   Ѐ<                   $0H`lrmeshq  9u        -        Ԁ              j-  <   <   Ѐ<                    $0H`lq  9u         .        Ԁ              1.  >   >   Ѐ<                   $0H`lrmeshq  9u        .        Ԁ              /  <   <   Ѐ<                    $0H`lq  9u         /        Ԁ              }  -   -   Ѐ<      
-     	     	 rmeshu  4        l        Ԁ       
-         >   >   Ѐ<      
-     	     	   $0H`lrmeshq  9u        w        Ԁ       
-         -   -   Ѐ<      
-     	     	 rmeshu  7        - A   A                m         $0H`lxJrmesh        A   A          	     	         $0H`lxrmesh       ǩ       Ԁ       
-       . >   >   Ѐ<      
-     	     	0  $0H`lrmeshq  9u        1       Ԁ       
-       M& A   A                h         $0H`lxrmesh         F   F          	     	@         $0H`lx
-hrmesh       _	  L   L          	P     
-               
+     	     	P    $0H`lq  9u          A7       Ԁ               7 <   <   Ѐ<                P    $0H`lq  9u          - <   <               P -         $0H`lx rmesh         >   >   Ј<                `   $0H`lrmeshq  9u                Ԁ               C <   <   Ѐ<                `    $0H`lq   9u                 Ԁ               % >   >   Ѐ<                p   $0H`lrmeshq   9u         Ν       Ԁ               X <   <   Ѐ<                p    $0H`lq  9u          h       Ԁ                F   F          	     	p          $0H`lx
+ rmesh        & >   >   Ѐ<      	             $0H`lrmeshq  9u         ϩ       Ԁ               Y <   <   Ѐ<           	     	    $0H`lq  9u          i       Ԁ       	        6 >   >   Ѐ<           	     	   $0H`lrmeshq  9u         6       Ԁ       	        `6 <   <   Ѐ<      	              $0H`lq  9u          7       Ԁ               $ F   F          	     	          $0H`lx
+irmesh       ,  A   A                Mn         $0H`lxrmesh         F   F                h         $0H`lx
+bnrmesh       } F   F          	     	 ˾         $0H`lx
+
+nrmesh       - F   F                m         $0H`lx
+rmesh       O F   F                         $0H`lx
+rmesh       $ F   F          	     	 _         $0H`lx
+rmesh         N   N          	      
+                
 
 
-       	  L   L               
-               
+       '	  N   N                
+                
 
 
-       
-  L   L                
-               
+       S
+  N   N                
+                
 
 
-       W  E   E   Ѐ             %              3       
-             E   E   Ѐ             %                     
-             E   E   Ѐ       	     	`%                     
-                   Ԁ       
-       7  ?   ?   Ѐ<           	     	p                   
-          G        Ԁ       	         ?   ?   Ѐ<                0           -       
-          w  ?   ?   Ј<                0           -       
-                   Ԁ                ?   ?   Ѐ<                                  
-                  Ԁ                L   L   <                
-                      
+         E   E   Ѐ             %              3       
+           C  E   E   Ѐ             %                     
+           {  E   E   Ѐ       	     	 %                     
+           F        Ԁ       
+         ?   ?   Ѐ<           	     	                    
+                  Ԁ       	       2  ?   ?   Ѐ<                            /       
+                  Ԁ              i  ?   ?   Ѐ<                                   
+          ?        Ԁ                N   N   <                
+                        
      
 
-               Ԁ              .  L   L   <      	          
-@                     
+               Ԁ              Q  N   N   <      	          
+                        
      
 
-               Ԁ                L   L   <      
+               Ԁ                N   N   <      
      	     
-                     
+                        
      
 
-         L   L   <      
-     	     
-                     
-     
-
-               Ԁ       
-         `   `   <           	          
-         E  0    @  
-
- 	                                      Ԁ       	       ^  `   `   <                P     
-         E  0    @  
+               Ԁ       
+         b   b   <           	            
+          E  0    @  
 
- 	                              3        Ԁ                `   `   <                0     
-         E  0    @  
+ 	                                      Ԁ       	       K  b   b   <                       
+          E  0    @  
 
- 	                              U6  L   L          @                    
+ 	                              $        Ԁ              ,  F   F                         $0H`lx
+`rmesh       N2  N   N                                
 
-       6  L   L          `                    
+       y2  N   N                                
 
-       7  L   L          	                    
+       3  N   N          	                      
 
-       8        Ԁ       
-       H9  L   L   <           	          
-                
-
-     
-       X9        Ԁ       	       9  L   L   <                p     
-                
-
-     
-       l:        Ԁ              ;  L   L   <                P     
-                
+       5  N   N   <           	           
+                 
 
      
-        =  L   L   <                P     
-                
+       5        Ԁ       	       6  N   N   <                      
+                 
 
      
-       5@        Ԁ              @  `   `   <                
-`              E  0    @  
-
- 	                              A        Ԁ              _A  `   `   <      	          
-              E  0    @  
-
- 	                              B  `   `   <      	          
-              E  0    @  
-
- 	                              C        Ԁ              DD  `   `   <      
-     	     
-              E  0    @  
-
- 	                              K        Ԁ       
-         F   F               pr         $0H`lx
-Ermesh       - F   F               	&         $0H`lx
-srmesh              Ԁ       
-        `   `   <           	          
-         E  0   @  
-
- 	                              Ȣ       Ԁ       	        `   `   <                     
-         E  0   @  
-
- 	                                     Ԁ               `   `   <                     
-         E  0   @  
-
- 	                              1       Ԁ               `   `   <                
-              E  0   @  
-
- 	                              ̭       Ԁ              # `   `   <      	          
-              E  0   @  
-
- 	                                     Ԁ              . -   -   Ѐ<      
-     	     	 rmeshu  4               Ԁ       
-        >   >   Ѐ<      
-     	     	  $0H`lrmeshq  9u               Ԁ       
-        -   -   Ѐ<      
-     	     	 rmeshu  7         F   F               '         $0H`lx
-&
-&rmesh       A /   /   Ѐ<           	     	0       
-            Q       Ԁ       	        /   /   Ѐ<                       
-            4       Ԁ               /   /   Ѐ<                       
-            M& F   F               ͪ-         $0H`lx
-'rmesh         -   -   Ѐ<      	          rmeshu  4        5        Ԁ                -   -   Ѐ<           	     	@rmeshu  7                Ԁ       	         A   A          	     	P+-         $0H`lx-rmesh         >   >   Ѐ<      	            $0H`lrmeshq  9u        	  >   >   Ј<      	            $0H`lrmeshq  9u        	  >   >   Ј<      	            $0H`lrmeshq  9u          >   >   Ј<      	            $0H`lrmeshq  9u          >   >   Ј<      	            $0H`lrmeshq  9u          >   >   Ј<      	            $0H`lrmeshq  9u          >   >   Ј<      	            $0H`lrmeshq  9u          <   <   Ѐ<      
-     	     	`   $0H`lq   9u           >   >   Ѐ<      
-     	     	p  $0H`lrmeshq   9u          >   >   Ј<      
-     	     	p  $0H`lrmeshq   9u                Ԁ       
-       ܧ  >   >   Ѐ<      	             $0H`lrmeshq  9u                Ԁ                <   <   Ѐ<           	     	   $0H`lq  9u	                 Ԁ       	       ߪ  >   >   Ј<           	     	  $0H`lrmeshq  9u	                Ԁ       	       =  <   <   Ѐ<      	             $0H`lq  9u 	                Ԁ                F   F               .         $0H`lx
-.-rmesh        <   <   Ѐ<      
-     	     	                              8! E   E   Ѐ       	     	%         
-                        Z! ?   ?   Ѐ<      	                   
-                      "       Ԁ              " ?   ?   Ѐ<      
-     	     	      
-     f                 # E   E   Ѐ            0%         
-     8                  T$ E   E   Ѐ            %         
-                       ( `   `   <           	          
-         E  0   @  
-
- 	                              -(       Ԁ       	       ( `   `   <                @     
-         E  0   @  
-
- 	                              ) `   `   <                @     
-         E  0   @  
-
- 	                              o+       Ԁ              + ?   ?   Ѐ<                      
-     -                 ,       Ԁ              [, ?   ?   Ѐ<      	          P      
-                      -       Ԁ              - ?   ?   Ѐ<      
-     	     	      
-                      +/ `   `   <                @     
-         E  0   @  
-
- 	                               0       Ԁ              0 `   `   <                     
-         E  0   @  
-
- 	                              5       Ԁ              6       Ԁ       
-       8 `   `   <                
-               E  0   @  
-
- 	                              (8       Ԁ              8 `   `   <      	          
-`              E  0   @  
-
- 	                              T9       Ԁ              : `   `   <      
-     	     
-              E  0   @  
+       6        Ԁ              :        Ԁ              ;  b   b   <                
+                E  0    @  
 
- 	                              < `   `   <      
-     	     
-              E  0   @  
-
- 	                                     Ԁ       
-        `   `   <           	          
-         E  0   @  
-
- 	                              Ȣ       Ԁ       	        `   `   <                p     
-         E  0   @  
-
- 	                                     Ԁ               `   `   <                     
-         E  0   @  
-
- 	                              p       Ԁ               F   F               o5         $0H`lx
-.-rmesh        `   `   <                
-               E  0   @  
-
- 	                                     Ԁ              s `   `   <      	          
-              E  0   @  
-
- 	                              H       Ԁ               `   `   <      
-     	     
-               E  0   @  
+ 	                              ;        Ԁ              ;  b   b   <      	          
+                E  0    @  
 
- 	                               F   F               0V6         $0H`lx
-(6p5rmesh       0       Ԁ               /   /   Ѐ<                @                          Ԁ               /   /   Ѐ<      	                                    Ԁ               /   /   Ѐ<      
-     	     	0                    /   /   Ј<      
-     	     	0                    /   /   Ј<      
-     	     	0                   8 E   E   Ѐ       	     	@%         
-                         E   E   Ѐ            %         
-     >                  $ F   F          	     	Pk<         $0H`lx
-W6p5rmesh       M> F   F               =         $0H`lx
-V6<rmesh         F   F               `(=         $0H`lx
-==rmesh       } F   F          	     	`D         $0H`lx
-==rmesh       - F   F               -D         $0H`lx
-=Drmesh        F   F               pHE         $0H`lx
-kEDrmesh       	 E   E   Ѐ       	     	p%         
-                        G	 E   E   Ѐ            %         
-     >                  	 E   E   Ѐ            %         
-                        	       Ԁ              f	 ?   ?   Ѐ<                      
-     T                 v	       Ԁ              	 ?   ?   Ѐ<      	                
-     +                 m	       Ԁ              	 ?   ?   Ѐ<      
-     	     	      
-                      7	       Ԁ       
-       G	 `   `   <           	          
-         E  0   @  
-
- 	                              W	       Ԁ       	       	 `   `   <                      
-         E  0   @  
-
- 	                              	       Ԁ              F	 `   `   <                     
-         E  0   @  
-
- 	                              	       Ԁ       
-       	 `   `   <           	          
-         E  0   @  
-
- 	                              	       Ԁ       	       	 `   `   <                     
-         E  0   @  
-
- 	                              V	 `   `   <                     
-         E  0   @  
-
- 	                              	 `   `   <                     
-         E  0   @  
-
- 	                              	 `   `   <                     
-         E  0   @  
-
- 	                              	       Ԁ              	       Ԁ              F	 `   `   <                
-              E  0   @  
-
- 	                              V	       Ԁ              	 `   `   <      	          
-               E  0   @  
-
- 	                              	       Ԁ              E	 `   `   <      
-     	     
-              E  0   @  
-
- 	                              	 `   `   <      
+ 	                              <        Ԁ              =  b   b   <      
      	     
-              E  0   @  
-
- 	                              	       Ԁ              	 `   `   <                
-              E  0   @  
-
- 	                              	       Ԁ              	 `   `   <      	          
-0              E  0   @  
-
- 	                              	       Ԁ              $ F   F          	     	&L         $0H`lx
-EDrmesh       M> F   F               @MGL         $0H`lx
-E'Lrmesh       - F   F               PmS         $0H`lx
-E'Lrmesh        -   -   Ѐ<                `rmeshu  4        A -   -   Ј<                `rmeshu  4        8 -   -   Ј<                `rmeshu  4        / -   -   Ј<                `rmeshu  4         -   -   Ј<                `rmeshu  4        Ց -   -   Ј<                `rmeshu  4         -   -   Ј<                `rmeshu  4        { <   <   Ѐ<      	          p                              s <   <   Ј<      	          p                              Q <   <   Ј<      	          p                              A <   <   Ј<      	          p                              C <   <   Ј<      	          p                              ! <   <   Ј<      	          p                               <   <   Ј<      	          p                               -   -   Ѐ<      	          rmeshu 	 4         -   -   Ј<      	          rmeshu 	 4         -   -   Ј<      	          rmeshu 	 4         -   -   Ј<      	          rmeshu 	 4        x -   -   Ј<      	          rmeshu 	 4        K  -   -   Ј<      	          rmeshu 	 4        ! -   -   Ј<      	          rmeshu 	 4        M> A   A               [         $0H`lx'Lrmesh       -i <   <               b         $0H`lx rmesh       M> <   <               j         $0H`lx rmesh       - <   <               Tr         $0H`lx rmesh       M" <   <               y         $0H`lx rmesh       - <   <               -         $0H`lx rmesh       M* <   <               M<         $0H`lx rmesh    	   -q <   <                mŐ         $0H`lx rmesh    
\ No newline at end of file
+                E  0    @  
+
+ 	                                F   F                2         $0H`lx
+rmesh              Ԁ       
+        b   b   <           	            
+          E  0   @  
+
+ 	                              Т       Ԁ       	       ' b   b   <                       
+          E  0   @  
+
+ 	                                      Ԁ              Ǥ b   b   <                       
+          E  0   @  
+
+ 	                              3 b   b   <                       
+          E  0   @  
+
+ 	                                     Ԁ               b   b   <                
+                 E  0   @  
+
+ 	                                     Ԁ               b   b   <      	          
+                 E  0   @  
+
+ 	                                     Ԁ               b   b   <      
+     	     
+                 E  0   @  
+
+ 	                              - F   F               Q&         $0H`lx
+3`rmesh       O F   F                &         $0H`lx
+ER&rmesh        <   <   Ѐ<                        	           
+                   Ԁ               -   -   Ѐ<      	          0rmeshu  4        <       Ԁ               <   <   Ѐ<      
+     	     	                                F   F          	     	0+-         $0H`lx
+&R&rmesh       
+ -   -   Ѐ<           	     	@rmeshu  7               Ԁ       	       8  E   E   Ѐ       	     	P%         
+                        ,  A   A               @-         $0H`lx&rmesh         F   F                t.         $0H`lx
+&-rmesh       8! E   E   Ѐ       	     	`%         
+                        | A   A          	     	pKC5         $0H`lx.rmesh       } >   >   Ѐ<      	          P  $0H`lrmeshq  9u        }       Ԁ              Q~ <   <   Ѐ<           	     	   $0H`lq  9u         a~       Ԁ       	       7 >   >   Ѐ<           	     	  $0H`lrmeshq  9u        G       Ԁ       	        <   <   Ѐ<      	          `   $0H`lq  9u         :       Ԁ              - F   F               pg5         $0H`lx
+u.C5rmesh       O F   F               06         $0H`lx
+.h5rmesh       8 E   E   Ѐ       	     	%         
+                        Z ?   ?   Ѐ<      	                  
+                             Ԁ               ?   ?   Ѐ<      
+     	     	      
+     f                  E   E   Ѐ            %         
+     ,                  T E   E   Ѐ            @%         
+                       ͅ       Ԁ       
+       ; ?   ?   Ѐ<                P      
+     u                 K       Ԁ               ?   ?   Ѐ<      	                
+                       ?   ?   Ј<      	                
+                       ?   ?   Ј<      	                
+                      0       Ԁ               ?   ?   Ѐ<      
+     	     	      
+                      ߍ       Ԁ       
+        b   b   <           	     0      
+          E  0   @  
+
+ 	                                     Ԁ       	        b   b   <                0      
+          E  0   @  
+
+ 	                                     Ԁ               b   b   <           	     @      
+          E  0   @  
+
+ 	                                     Ԁ       	        b   b   <                @      
+          E  0   @  
+
+ 	                              0 b   b   <                @      
+          E  0   @  
+
+ 	                              ! b   b   <           	     @      
+          E  0   @  
+
+ 	                              1       Ԁ       	        b   b   <                @      
+          E  0   @  
+
+ 	                              = b   b   <                @      
+          E  0   @  
+
+ 	                                     Ԁ              ݜ b   b   <                @      
+          E  0   @  
+
+ 	                                     Ԁ                     Ԁ                     Ԁ       
+       [ -   -   Ѐ<      
+     	     	rmeshu  7        ) F   F          	     	k<         $0H`lx
+/6h5rmesh              Ԁ       
+        -   -   Ѐ<      
+     	     	rmeshu  4                Ԁ       
+       M& F   F               <         $0H`lx
+6<rmesh       8  /   /   Ѐ<           	     	        
+            8        Ԁ       	       69  /   /   Ѐ<                       
+            9        Ԁ              E:  /   /   Ѐ<                `       
+              F   F               p(=         $0H`lx
+(6<rmesh       X  >   >   Ј<      
+     	     	  $0H`lrmeshq  9u        [        Ԁ       
+       A        Ԁ       
+         <   <   Ѐ<      
+     	     	    $0H`lq  9u         U F   F          	     	0]D         $0H`lx
+<=rmesh       - F   F               -D         $0H`lx
+=^Drmesh       O F   F               HXE         $0H`lx
+=Drmesh       þ	 ?   ?   Ѐ<      
+     	     	@        
+   j                   	       Ԁ       
+       	 b   b   <           	     P      
+          E  0   @  
+
+ 	                              	       Ԁ       	       1	 b   b   <                P      
+          E  0   @  
+
+ 	                              
+	       Ԁ              I	       Ԁ       
+       	 b   b   <           	     `      
+          E  0   @  
+
+ 	                               	       Ԁ       	       w	 b   b   <                `      
+          E  0   @  
+
+ 	                              	 b   b   <                `      
+          E  0   @  
+
+ 	                              	       Ԁ              V	 b   b   <                `      
+          E  0   @  
+
+ 	                               E   E   Ѐ            %              8       
+            E   E   Ѐ            %                     
+           " ?   ?   Ѐ<           	     	`                     
+          2       Ԁ       	        ?   ?   Ѐ<                           1       
+          )       Ԁ                     Ԁ       
+       E ?   ?   Ѐ<           	     	                   
+          U       Ԁ       	        ?   ?   Ѐ<                            /       
+           ?   ?   Ј<                            /       
+          I       Ԁ               ?   ?   Ј<                                  
+           ?   ?   Ј<                                  
+                 Ԁ               b   b   <                
+0                E  0   @  
+
+ 	                                     Ԁ               b   b   <      	          
+0                E  0   @  
+
+ 	                                     Ԁ               b   b   <      
+     	     
+0                E  0   @  
+
+ 	                              o       Ԁ              6 b   b   <                
+@                E  0   @  
+
+ 	                              F       Ԁ               b   b   <      	          
+@                E  0   @  
+
+ 	                              v       Ԁ              = b   b   <      
+     	     
+@                E  0   @  
+
+ 	                              $ F   F          	     	K         $0H`lx
+DErmesh       M& F   F               M/L         $0H`lx
+XEKrmesh       - F   F                mS         $0H`lx
+XEKrmesh       M -   -   Ѐ<                0rmeshu  4        eN -   -   Ј<                0rmeshu  4        SO -   -   Ј<                0rmeshu  4        P -   -   Ј<                0rmeshu  4        P -   -   Ј<                0rmeshu  4        Q -   -   Ј<                0rmeshu  4        R -   -   Ј<                0rmeshu  4        $e <   <   Ѐ<      	          @                              e <   <   Ј<      	          @                              g <   <   Ј<      	          @                              h <   <   Ј<      	          @                              i <   <   Ј<      	          @                              i <   <   Ј<      	          @                              j <   <   Ј<      	          @                               -   -   Ѐ<      	          Prmeshu  4         -   -   Ј<      	          Prmeshu  4         -   -   Ј<      	          Prmeshu  4         -   -   Ј<      	          Prmeshu  4        x -   -   Ј<      	          Prmeshu  4        B -   -   Ј<      	          Prmeshu  4         -   -   Ј<      	          Prmeshu  4        M& A   A               `q[         $0H`lxKrmesh       - <   <               p6c         $0H`lx rmesh       M> <   <               j         $0H`lx rmesh       -i <   <               8r         $0H`lx rmesh       M> <   <               z         $0H`lx rmesh       - <   <               -         $0H`lx rmesh       M" <   <               M4         $0H`lx rmesh    	   - <   <               mِ         $0H`lx rmesh    	   M* <   <               ~         $0H`lx rmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,439 +1,370 @@
-ò            i       u$  <   <                 $          $0H`lx rmesh        $  >   >   Ѐ<           	     	    $0H`lrmeshq   9u         %  >   >   Ј<           	     	    $0H`lrmeshq   9u         &  >   >   Ј<           	     	    $0H`lrmeshq   9u         '  >   >   Ј<           	     	    $0H`lrmeshq   9u         (  >   >   Ј<           	     	    $0H`lrmeshq   9u         )  >   >   Ј<           	     	    $0H`lrmeshq   9u         *  >   >   Ј<           	     	    $0H`lrmeshq   9u         k?  A   A          	     	 k?          $0H`lx $ rmesh        '  >   >   Ѐ<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u         u  >   >   Ѐ<           	     	    $0H`lrmeshq   9u         r  >   >   Ј<           	     	    $0H`lrmeshq   9u         ]  >   >   Ј<           	     	    $0H`lrmeshq   9u         6  >   >   Ј<           	     	    $0H`lrmeshq   9u         h  A   A          
+ò            i       u$  <   <                 $          $0H`lx rmesh        $  >   >   Ѐ<           	     	    $0H`lrmeshq   9u         %  >   >   Ј<           	     	    $0H`lrmeshq   9u         &  >   >   Ј<           	     	    $0H`lrmeshq   9u         '  >   >   Ј<           	     	    $0H`lrmeshq   9u         (  >   >   Ј<           	     	    $0H`lrmeshq   9u         )  >   >   Ј<           	     	    $0H`lrmeshq   9u         *  >   >   Ј<           	     	    $0H`lrmeshq   9u         k?  A   A          	     	 k?          $0H`lx $ rmesh        '  >   >   Ѐ<                    $0H`lrmeshq   9u         6  >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u           >   >   Ј<                    $0H`lrmeshq   9u         u  >   >   Ѐ<           	     	    $0H`lrmeshq   9u         r  >   >   Ј<           	     	    $0H`lrmeshq   9u         ]  >   >   Ј<           	     	    $0H`lrmeshq   9u         6  >   >   Ј<           	     	    $0H`lrmeshq   9u         h  A   A          
      
            $0H`lx ? rmesh          >   >   Ј<           	     	    $0H`lrmeshq   9u         u  >   >   Ј<           	     	    $0H`lrmeshq   9u         {  >   >   Ј<           	     	    $0H`lrmeshq   9u         T  >   >   Ѐ<      
      	     	0   $0H`lrmeshq   9u                 Ԁ       	          <   <   Ѐ<      	     
      
       $0H`lq   9u                  Ԁ       
-          -   -   Ѐ<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4         p  -   -   Ј<           	     	@ rmeshu   4         1  -   -   Ј<           	     	@ rmeshu   4                 Ԁ       	        8  -   -   Ѐ<      	          0 rmeshu  7         H        Ԁ                       Ԁ               [  -   -   Ѐ<                @ rmeshu  7         H  >   >   Ѐ<      	     
+          -   -   Ѐ<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4         p  -   -   Ј<           	     	@ rmeshu   4         1  -   -   Ј<           	     	@ rmeshu   4                 Ԁ       	        8  -   -   Ѐ<      	          0 rmeshu  7         H        Ԁ                       Ԁ               B  -   -   Ј<      	          0 rmeshu  7         R        Ԁ                 -   -   Ѐ<                @ rmeshu  7         H  >   >   Ѐ<      	     
      
 0   $0H`lrmeshq   9u         X        Ԁ       
           <   <   Ѐ<      
-     	     	P    $0H`lq  9u          K        Ԁ       	         <   <               P -         $0H`lx rmesh         >   >   Ѐ<           	     	`   $0H`lrmeshq  9u          >   >   Ј<           	     	`   $0H`lrmeshq  9u          >   >   Ј<           	     	`   $0H`lrmeshq  9u         ɘ >   >   Ј<           	     	`   $0H`lrmeshq  9u         ؙ >   >   Ј<           	     	`   $0H`lrmeshq  9u         ̚ >   >   Ј<           	     	`   $0H`lrmeshq  9u          >   >   Ј<           	     	`   $0H`lrmeshq  9u          F   F          	     	p          $0H`lx
- rmesh         >   >   Ѐ<      	          `   $0H`lrmeshq   9u                Ԁ                <   <   Ѐ<           	     	    $0H`lq  9u                 Ԁ       	        5 >   >   Ѐ<           	     	   $0H`lrmeshq  9u         6 >   >   Ј<           	     	   $0H`lrmeshq  9u         7 >   >   Ј<           	     	   $0H`lrmeshq  9u         h8 >   >   Ј<           	     	   $0H`lrmeshq  9u         J9 >   >   Ј<           	     	   $0H`lrmeshq  9u         b: >   >   Ј<           	     	   $0H`lrmeshq  9u         D; >   >   Ј<           	     	   $0H`lrmeshq  9u         <       Ԁ               J -   -   Ѐ<      	          p rmeshu  9         J       Ԁ               K -   -   Ѐ<           	     	 rmeshu  7         K       Ԁ       	        Oh >   >   Ѐ<                   $0H`lrmeshq   9u         i -   -   Ѐ<                 rmeshu  7        k  A   A          	     	 I         $0H`lx rmesh       j  >   >   Ѐ<      	             $0H`lrmeshq   9u        z        Ԁ                <   <   Ѐ<           	     	    $0H`lq  9u         m	        Ԁ       	       	  >   >   Ѐ<           	     	   $0H`lrmeshq  9u        J
-        Ԁ       	       
-  <   <   Ѐ<      	              $0H`lq  9u         
-        Ԁ              },  A   A                Mn         $0H`lxJrmesh       H-        Ԁ              -  <   <   Ѐ<                    $0H`lq  9u         .  >   >   Ѐ<                   $0H`lrmeshq  9u        /        Ԁ              (  -   -   Ѐ<      
-     	     	 rmeshu  4                Ԁ       	       /  -   -   Ѐ<      	     
-     
-P rmeshu  7        ?        Ԁ       
-         A   A          
-     
-` 	         $0H`lx Jrmesh         >   >   Ѐ<      
-     	     	   $0H`lrmeshq  9u                Ԁ       	       :  -   -   Ѐ<      	     
-     
-p rmeshu  4        J        Ԁ       
-         -   -   Ѐ<      
-     	     	 rmeshu  7        2        Ԁ       	        A   A                m         $0H`lxJrmesh        A   A          	     	         $0H`lxrmesh        >   >   Ѐ<      	     
-     
-   $0H`lrmeshq   9u               Ԁ       
-        <   <   Ѐ<      
-     	     	    $0H`lq  9u                Ԁ       	        >   >   Ѐ<      
-     	     	0  $0H`lrmeshq  9u        j       Ԁ       	        <   <   Ѐ<      	     
-     
-    $0H`lq  9u                Ԁ       
-        A   A          
-     
-          $0H`lxrmesh       & A   A                h         $0H`lxrmesh       k  F   F          	     	@         $0H`lx
-hrmesh         L   L          
-      
-                
+     	     	P    $0H`lq  9u          K        Ԁ       	         <   <               P -         $0H`lx rmesh         >   >   Ѐ<           	     	`   $0H`lrmeshq  9u          >   >   Ј<           	     	`   $0H`lrmeshq  9u          >   >   Ј<           	     	`   $0H`lrmeshq  9u         ɘ >   >   Ј<           	     	`   $0H`lrmeshq  9u         ؙ >   >   Ј<           	     	`   $0H`lrmeshq  9u         ̚ >   >   Ј<           	     	`   $0H`lrmeshq  9u          >   >   Ј<           	     	`   $0H`lrmeshq  9u                Ԁ                F   F          	     	p          $0H`lx
+ rmesh         >   >   Ѐ<      	             $0H`lrmeshq  9u                Ԁ                <   <   Ѐ<           	     	    $0H`lq  9u                 Ԁ       	        5 >   >   Ѐ<           	     	   $0H`lrmeshq  9u         >6       Ԁ       	        6 <   <   Ѐ<      	              $0H`lq  9u          6       Ԁ               i A   A          
+     
+@ h         $0H`lx rmesh         F   F          	     	          $0H`lx
+irmesh       },  A   A                Mn         $0H`lxrmesh         A   A          
+     
+P 	         $0H`lx rmesh       | F   F          	     	 ˾         $0H`lx
+
+nrmesh        F   F                m         $0H`lx
+rmesh       i A   A          
+     
+`          $0H`lx rmesh        F   F          	     	 _         $0H`lx
+rmesh       P  N   N          
+p      
+                 
 
 
-         L   L          	P     
-               
+       {  N   N          	      
+                
 
 
-       
-
-  L   L               
-               
+       	  N   N                
+                
 
 
-         E   E   Ѐ             %                     
-           i  E   E   Ѐ       	     	`%                     
-           l  ?   ?   Ѐ<      	     
-     
-                       
-          |        Ԁ       
-         ?   ?   Ѐ<           	     	p                   
-          s        Ԁ       	         ?   ?   Ѐ<                0           -       
-                  Ԁ                L   L   <      	          
-@                     
+         E   E   Ѐ             %                     
+             E   E   Ѐ       	     	 %                     
+           	  ?   ?   Ѐ<      	     
+     
+                       
+                  Ԁ       
+       g  ?   ?   Ѐ<           	     	                    
+                  Ԁ       	         ?   ?   Ѐ<                            /       
+          &        Ԁ                N   N   <      	          
+                        
      
 
-               Ԁ                L   L   <      
+               Ԁ              8  N   N   <      
      	     
-                     
+                        
      
 
-       S  L   L   <      
-     	     
-                     
-     
-
-               Ԁ       	         `   `   <      	     
-           
-          E  0    @  
-
- 	                                      Ԁ       
-       ^  `   `   <           	          
-         E  0    @  
+               Ԁ       	         b   b   <      	     
+            
+           E  0    @  
+
+ 	                                      Ԁ       
+       G  b   b   <           	            
+          E  0    @  
 
- 	                              3        Ԁ       	         `   `   <                P     
-         E  0    @  
+ 	                                       Ԁ       	         b   b   <                       
+          E  0    @  
 
- 	                               7  L   L          `                    
+ 	                              ,  F   F                         $0H`lx
+`rmesh       2  N   N                                
 
-       +7  L   L          	                    
+       $3  N   N          	                      
 
-       W8  L   L   <      	     
-           
-                 
-
-     
-       g8        Ԁ       
-       8  L   L   <           	          
-                
+       P4  N   N   <      	     
+           
+                  
 
      
-       9        Ԁ       	       4A        Ԁ              DC  `   `   <      	          
-              E  0    @  
-
- 	                              TC        Ԁ              C  `   `   <      
-     	     
-              E  0    @  
-
- 	                              D        Ԁ       	       K  L   L   <      	     
-           
-                 
+       `4        Ԁ       
+       55  N   N   <           	           
+                 
 
      
-       K        Ԁ       
-       L  L   L          
-                     
-
-        F   F               	&         $0H`lx
-srmesh        `   `   <      	     
-          
-          E  0   @  
-
- 	                              ȡ       Ԁ       
-        `   `   <           	          
-         E  0   @  
-
- 	                                     Ԁ       	        `   `   <                     
-         E  0   @  
-
- 	                               F   F          	     	-&         $0H`lx
-
-&rmesh              Ԁ               `   `   <      	          
-              E  0   @  
-
- 	                              ˮ       Ԁ              " `   `   <      
-     	     
-              E  0   @  
-
- 	                                     Ԁ       	       ي -   -   Ѐ<      
-     	     	 rmeshu  4        j       Ԁ       	        -   -   Ѐ<      	     
-     
- rmeshu  7               Ԁ       
-        A   A          
-     
-0)'         $0H`lxrmesh       ; >   >   Ѐ<      
-     	     	  $0H`lrmeshq  9u               Ԁ       	       Z -   -   Ѐ<      	     
-     
-@rmeshu  4        j       Ԁ       
-        -   -   Ѐ<      
-     	     	 rmeshu  7        I       Ԁ       	        /   /   Ѐ<           	     	0       
-            }       Ԁ       	        /   /   Ѐ<                       
-            & F   F               ͪ-         $0H`lx
-'rmesh       t   E   E   Ѐ       
-     
-P%           
-                           -   -   Ѐ<      	          rmeshu  4                Ԁ              V  -   -   Ѐ<           	     	@rmeshu  7                Ԁ       	       k  A   A          	     	P+-         $0H`lx-rmesh         >   >   Ј<      	     
-     
-`  $0H`lrmeshq   9u                Ԁ       
-       z  <   <   Ѐ<      
-     	     	`   $0H`lq   9u                 Ԁ       	       \  >   >   Ѐ<      
-     	     	p  $0H`lrmeshq   9u        O  >   >   Ј<      
-     	     	p  $0H`lrmeshq   9u                Ԁ       	         <   <   Ѐ<      	     
-     
-p   $0H`lq  9u                 Ԁ       
-       H  >   >   Ѐ<      	             $0H`lrmeshq  9u        X        Ԁ                <   <   Ѐ<           	     	   $0H`lq  9u	         K        Ԁ       	         >   >   Ѐ<           	     	  $0H`lrmeshq  9u	        r  >   >   Ј<           	     	  $0H`lrmeshq  9u	                Ԁ       	         <   <   Ѐ<      	             $0H`lq  9u 	                Ԁ                A   A          
-     
-I.         $0H`lx-rmesh        <   <   Ѐ<      
-     	     	                              M       Ԁ       	       t  E   E   Ѐ       
-     
-%           
-                           E   E   Ѐ       	     	%         
-                        ! ?   ?   Ѐ<      	                   
-                      !       Ԁ              $" ?   ?   Ѐ<      
-     	     	      
-     f                 "       Ԁ       	       ' `   `   <      	     
-          
-          E  0   @  
-
- 	                              -'       Ԁ       
-       ' `   `   <           	          
-         E  0   @  
-
- 	                              Y(       Ԁ       	       ) `   `   <                @     
-         E  0   @  
-
- 	                              9,       Ԁ              , ?   ?   Ѐ<      	          P      
-                      ,       Ԁ              %- ?   ?   Ѐ<      
-     	     	      
-                      -       Ԁ       	       / `   `   <                @     
-         E  0   @  
-
- 	                              D6 `   `   <      	     
-          
-          E  0   @  
-
- 	                              T6       Ԁ       
-       T8       Ԁ              9 `   `   <      	          
-`              E  0   @  
+       5        Ԁ       	       ;        Ԁ              <  b   b   <      	          
+                E  0    @  
 
- 	                              '9       Ԁ              ~9 `   `   <      
+ 	                              <        Ԁ              <  b   b   <      
      	     
-              E  0   @  
+                E  0    @  
 
- 	                              v; `   `   <      
-     	     
-              E  0   @  
-
- 	                              K<       Ԁ       	       | A   A          	     	 KC5         $0H`lx.rmesh        `   `   <      	     
-          
-          E  0   @  
-
- 	                              ȡ       Ԁ       
-        `   `   <           	          
-         E  0   @  
-
- 	                                     Ԁ       	        `   `   <                p     
-         E  0   @  
-
- 	                                F   F               o5         $0H`lx
-.-rmesh       H       Ԁ               `   `   <      	          
-              E  0   @  
-
- 	                                     Ԁ              r `   `   <      
-     	     
-               E  0   @  
-
- 	                              G       Ԁ       	        A   A          
+ 	                              =        Ԁ       	         A   A          
      
-iW6         $0H`lxC5rmesh              Ԁ              ` /   /   Ѐ<      	                             p       Ԁ               /   /   Ѐ<      
-     	     	0                    /   /   Ј<      
-     	     	0                    /   /   Ј<      
-     	     	0                   z /   /   Ј<      
-     	     	0                    /   /   Ј<      
-     	     	0                   8       Ԁ       	       t E   E   Ѐ       
-     
-%           
-                         À E   E   Ѐ       	     	@%         
-                         E   E   Ѐ            %         
-     >                   F   F          	     	Pk<         $0H`lx
-W6p5rmesh       > F   F               =         $0H`lx
-V6<rmesh         A   A          
-     
-=         $0H`lx<rmesh       | F   F          	     	`D         $0H`lx
-==rmesh        F   F               -D         $0H`lx
-=Drmesh        A   A          
-     
-E         $0H`lxDrmesh       4	 E   E   Ѐ       
-     
- %           
-                         	 E   E   Ѐ       	     	p%         
-                        	 E   E   Ѐ            %         
-     >                  	       Ԁ              0	 ?   ?   Ѐ<      	                
-     +                 @	       Ԁ              	 ?   ?   Ѐ<      
-     	     	      
-                      7	       Ԁ       	       	 `   `   <      	     
-          
-          E  0   @  
-
- 	                              
-	       Ԁ       
-       a	 `   `   <           	          
-         E  0   @  
-
- 	                              	 `   `   <           	          
-         E  0   @  
-
- 	                              	       Ԁ       	       	 `   `   <      	     
-           
-          E  0   @  
-
- 	                              	       Ԁ       
-       	 `   `   <           	          
-         E  0   @  
+ 	L         $0H`lx `rmesh       | F   F          	     	&         $0H`lx
+Lrmesh        b   b   <      	     
+            
+           E  0   @  
 
- 	                              	       Ԁ       	       	 `   `   <                     
-         E  0   @  
+ 	                              ̡       Ԁ       
+       # b   b   <           	            
+          E  0   @  
 
- 	                              	       Ԁ              E	 `   `   <      	          
-               E  0   @  
+ 	                                     Ԁ       	       ã b   b   <                       
+          E  0   @  
+
+ 	                                     Ԁ               b   b   <      	          
+                 E  0   @  
 
- 	                              U	       Ԁ              	 `   `   <      
+ 	                                     Ԁ               b   b   <      
      	     
-              E  0   @  
+                 E  0   @  
+
+ 	                              ì       Ԁ       	        F   F               Q&         $0H`lx
+3`rmesh       i A   A          
+     
+ )&         $0H`lx &rmesh       L <   <   Ѐ<                        	           
+             -   -   Ѐ<      	          0rmeshu  4               Ԁ              ] <   <   Ѐ<      
+     	     	                                      Ԁ       	        F   F          	     	0+-         $0H`lx
+&R&rmesh        -   -   Ѐ<           	     	@rmeshu  7        F       Ԁ       	       t   E   E   Ѐ       
+     
+ %           
+                            E   E   Ѐ       	     	P%         
+                        },  A   A               @-         $0H`lx&rmesh         A   A          
+     
+ I.         $0H`lx -rmesh       t  E   E   Ѐ       
+     
+ %           
+                           E   E   Ѐ       	     	`%         
+                        | A   A          	     	pKC5         $0H`lx.rmesh       } >   >   Ѐ<      	          P  $0H`lrmeshq  9u        }       Ԁ              } <   <   Ѐ<           	     	   $0H`lq  9u         ~       Ԁ       	       ~ >   >   Ѐ<           	     	  $0H`lrmeshq  9u        s       Ԁ       	        <   <   Ѐ<      	          `   $0H`lq  9u                Ԁ               F   F               pg5         $0H`lx
+u.C5rmesh       i A   A          
+     
+ i/6         $0H`lx -rmesh       t E   E   Ѐ       
+     
+ %           
+                         À E   E   Ѐ       	     	%         
+                        Ɓ ?   ?   Ѐ<      	                  
+                      ց       Ԁ              $ ?   ?   Ѐ<      
+     	     	      
+     f                 ͂       Ԁ       	        b   b   <      	     
+     0      
+           E  0   @  
+
+ 	                                     Ԁ       
+        b   b   <           	     0      
+          E  0   @  
+
+ 	                              w       Ԁ              t b   b   <           	     0      
+          E  0   @  
+
+ 	                               ?   ?   Ј<      	                
+                             Ԁ              Q ?   ?   Ѐ<      
+     	     	      
+                             Ԁ       	        b   b   <      	     
+     @      
+           E  0   @  
+
+ 	                                     Ԁ       
+        b   b   <           	     0      
+          E  0   @  
+
+ 	                                     Ԁ       	        b   b   <                0      
+          E  0   @  
+
+ 	                               b   b   <           	     @      
+          E  0   @  
+
+ 	                               b   b   <           	     @      
+          E  0   @  
+
+ 	                               b   b   <                @      
+          E  0   @  
+
+ 	                              ̕ b   b   <                @      
+          E  0   @  
+
+ 	                               b   b   <           	     @      
+          E  0   @  
+
+ 	                              ]       Ԁ       	        b   b   <                @      
+          E  0   @  
+
+ 	                              ٛ b   b   <                @      
+          E  0   @  
+
+ 	                               -   -   Ѐ<      	     
+     
+rmeshu  4               Ԁ       
+        -   -   Ѐ<      
+     	     	rmeshu  7               Ԁ       	        F   F          	     	k<         $0H`lx
+/6h5rmesh        >   >   Ѐ<      	     
+     
+   $0H`lrmeshq   9u               Ԁ       
+       0 -   -   Ѐ<      
+     	     	rmeshu  4               Ԁ       	       I  -   -   Ѐ<      	     
+     
+0rmeshu  7        Y        Ԁ       
+       & F   F               <         $0H`lx
+6<rmesh       8  /   /   Ѐ<           	     	        
+            9        Ԁ       	       9  /   /   Ѐ<                       
+              <   <          
+     
+@=         $0H`lx rmesh         >   >   Ѐ<      
+     	     	  $0H`lrmeshq  9u          >   >   Ј<      
+     	     	  $0H`lrmeshq  9u                Ԁ       	         <   <   Ѐ<      	     
+     
+P   $0H`lq   9u         .        Ԁ       
+         >   >   Ѐ<      	     
+     
+`  $0H`lrmeshq   9u                Ԁ       
+       b  <   <   Ѐ<      
+     	     	    $0H`lq  9u                 Ԁ       	       T F   F          	     	0]D         $0H`lx
+<=rmesh        F   F               -D         $0H`lx
+=^Drmesh        A   A          
+     
+pE         $0H`lx^Drmesh       4	 E   E   Ѐ       
+     
+%           
+                         V	 ?   ?   Ѐ<      
+     	     	@        
+   j                   	       Ԁ       	       ƿ	 b   b   <      	     
+     P      
+           E  0   @  
+
+ 	                              ֿ	       Ԁ       
+       -	 b   b   <           	     P      
+          E  0   @  
+
+ 	                              	       Ԁ       	       v	 E   E   Ѐ       	     	P%         
+                        	 b   b   <      	     
+     `      
+           E  0   @  
+
+ 	                              	       Ԁ       
+       s	 b   b   <           	     `      
+          E  0   @  
+
+ 	                              L	       Ԁ       	       	 b   b   <                `      
+          E  0   @  
+
+ 	                              R	 b   b   <                `      
+          E  0   @  
+
+ 	                               E   E   Ѐ            %                     
+            ?   ?   Ѐ<           	     	`                     
+          ^       Ԁ       	        ?   ?   Ѐ<                           1       
+          w E   E   Ѐ       	     	p%              s       
+           z ?   ?   Ѐ<      	     
+     
+                      
+                 Ԁ       
+        ?   ?   Ѐ<           	     	                   
+                 Ԁ       	        ?   ?   Ѐ<                            /       
+           ?   ?   Ј<                            /       
+                 Ԁ               b   b   <      	          
+0                E  0   @  
 
- 	                              	 `   `   <      
+ 	                                     Ԁ               b   b   <      
      	     
-              E  0   @  
+0                E  0   @  
 
- 	                              	       Ԁ       	       	       Ԁ              	 `   `   <      	          
-0              E  0   @  
+ 	                                     Ԁ       	       r       Ԁ              9 b   b   <      	          
+@                E  0   @  
 
- 	                              	       Ԁ              	 `   `   <      
+ 	                              I       Ԁ               b   b   <      
      	     
-              E  0   @  
+@                E  0   @  
 
- 	                              	       Ԁ       	        F   F          	     	&L         $0H`lx
-EDrmesh       > F   F               @MGL         $0H`lx
-E'Lrmesh          `   `   <      	     
-     0     
-          E  0   @  
+ 	                              y       Ԁ       	        F   F          	     	K         $0H`lx
+DErmesh       & F   F               M/L         $0H`lx
+XEKrmesh          b   b   <      	     
+     p      
+           E  0   @  
 
- 	                                       Ԁ       
-          `   `   <           	          
-         E  0   @  
+ 	                                       Ԁ       
+         b   b   <           	     p      
+          E  0   @  
 
- 	                              p  `   `   <           	          
-         E  0   @  
+ 	                                b   b   <           	     p      
+          E  0   @  
 
- 	                                `   `   <           	          
-         E  0   @  
+ 	                                b   b   <           	     p      
+          E  0   @  
 
- 	                                `   `   <           	          
-         E  0   @  
+ 	                              H  b   b   <           	     p      
+          E  0   @  
 
- 	                              -  `   `   <           	          
-         E  0   @  
+ 	                              	  b   b   <           	     p      
+          E  0   @  
 
- 	                                `   `   <           	          
-         E  0   @  
+ 	                              2  b   b   <           	     p      
+          E  0   @  
 
- 	                              P  `   `   <           	          
-         E  0   @  
+ 	                              %  b   b   <           	     p      
+          E  0   @  
 
- 	                                A   A          
+ 	                                A   A          
      
-@:M         $0H`lx'Lrmesh       | F   F          	     	S         $0H`lx
-;MGLrmesh        `   `   <      	     
-     P     
-          E  0   @  
+6M         $0H`lxKrmesh       T F   F          	     	˟S         $0H`lx
+/L7Mrmesh        b   b   <      	     
+           
+           E  0   @  
 
- 	                              ȡ       Ԁ       
-        `   `   <           	           
-         E  0   @  
+ 	                              ̡       Ԁ       
+       # b   b   <           	           
+          E  0   @  
 
- 	                               `   `   <           	           
-         E  0   @  
+ 	                              G b   b   <           	           
+          E  0   @  
 
- 	                              J `   `   <           	           
-         E  0   @  
+ 	                              Τ b   b   <           	           
+          E  0   @  
 
- 	                              ] `   `   <           	           
-         E  0   @  
+ 	                              @ b   b   <           	           
+          E  0   @  
 
- 	                               `   `   <           	           
-         E  0   @  
+ 	                              @ b   b   <           	           
+          E  0   @  
 
- 	                               `   `   <           	           
-         E  0   @  
+ 	                               b   b   <           	           
+          E  0   @  
 
- 	                              ݶ `   `   <           	           
-         E  0   @  
+ 	                               b   b   <           	           
+          E  0   @  
 
- 	                               -   -   Ѐ<           	     	rmeshu	  4         -   -   Ј<           	     	rmeshu	  4         -   -   Ј<           	     	rmeshu	  4        R -   -   Ј<           	     	rmeshu	  4        7 -   -   Ј<           	     	rmeshu	  4         -   -   Ј<           	     	rmeshu	  4         -   -   Ј<           	     	rmeshu	  4        (} <   <   Ѐ<      
-     	     	                               3~ <   <   Ј<      
-     	     	                               ~       Ԁ       	        A   A          	     	0h[         $0H`lx;Mrmesh       t   E   E   Ѐ       
-     
-p%           
-                            E   E   Ѐ       	     	@%         
-                          -   -   Ѐ<      
-     	     	Prmeshu  4        J        Ԁ       	         -   -   Ј<      	     
+ 	                               -   -   Ѐ<           	     	rmeshu  4        ۻ -   -   Ј<           	     	rmeshu  4        ɼ -   -   Ј<           	     	rmeshu  4         -   -   Ј<           	     	rmeshu  4        x -   -   Ј<           	     	rmeshu  4        x -   -   Ј<           	     	rmeshu  4        o -   -   Ј<           	     	rmeshu  4        ?f <   <   Ѐ<      
+     	     	                              f       Ԁ       	        A   A          
      
-rmeshu  7                Ԁ       
-         A   A          
+T         $0H`lxSrmesh        A   A          	     	@[         $0H`lxTrmesh       t   E   E   Ѐ       
      
-	}\         $0H`lxi[rmesh         >   >   Ѐ<      
-     	     	`  $0H`lrmeshq   9u
-        Q        Ԁ       	         -   -   Ѐ<      	     
+%           
+                            E   E   Ѐ       	     	%         
+                          A   A          
      
-rmeshu 
- 4                Ԁ       
-       7  -   -   Ѐ<      
-     	     	prmeshu
-  7                Ԁ       	       t  E   E   Ѐ       
+	y\         $0H`lxA[rmesh       t  E   E   Ѐ       
      
-%           
-                         T <   <          	     	b         $0H`lx rmesh       U >   >   Ѐ<      	     
+%           
+	                           E   E   Ѐ       	     	%         
+	                        T A   A          	     	 b         $0H`lxy\rmesh        A   A          
      
-  $0H`lrmeshq   9u        U       Ԁ       
-       U <   <   Ѐ<      
-     	     	  
- $0H`lq   9u         V       Ԁ       	       V >   >   Ѐ<      
-     	     	  $0H`lrmeshq   9u        PW       Ԁ       	       W <   <   Ѐ<      	     
+)d         $0H`lxbrmesh       t E   E   Ѐ       
      
-   $0H`lq  9u         W       Ԁ       
-       e A   A          
-     
-)c         $0H`lxbrmesh       t E   E   Ѐ       
-     
-%           
-	                         À E   E   Ѐ       	     	%         
-	                         A   A          	     	+j         $0H`lx
-crmesh         A   A          
-     
- Ik         $0H`lxjrmesh       T A   A          	     	K$r         $0H`lx
-krmesh       e A   A          
-     
-i4s         $0H`lx$rrmesh       4	 E   E   Ѐ       
-     
- %           
+ %           
 
-                         	 E   E   Ѐ       	     	%         
+                         À E   E   Ѐ       	     	%         
 
-                         A   A          	     	ky         $0H`lx
-4srmesh         A   A          
+                         A   A          	     	 +j         $0H`lxdrmesh         A   A          
      
-0z         $0H`lxyrmesh       T A   A          	     	 f         $0H`lx
-zrmesh        A   A          	     	         $0H`lx
-zrmesh    	   t   E   E   Ѐ       
+Ik         $0H`lxjrmesh       T A   A          	     	0K$r         $0H`lxkrmesh        A   A          
      
-P%   	        
-                      	      E   E   Ѐ       	     	 % 	        
-                     	     -   -   Ѐ<      
-     	     	0rmeshu  4     	   J        Ԁ       	    	     -   -   Ѐ<      	     
+ i\s         $0H`lx$rrmesh       4	 E   E   Ѐ       
      
-`rmeshu  7     	           Ԁ       
-    	     A   A          
+0%           
+                         	 E   E   Ѐ       	     	@%         
+                         A   A          	     	Pky         $0H`lx\srmesh         A   A          
      
-p         $0H`lxrmesh    	     >   >   Ѐ<      
-     	     	@  $0H`lrmeshq   9u     	           Ԁ       	    	   :  -   -   Ѐ<      	     
+@z         $0H`lxyrmesh       T A   A          	     	`f         $0H`lxzrmesh        A   A          
      
-rmeshu  4     	   J        Ԁ       
-    	     -   -   Ѐ<      
-     	     	Prmeshu  7     	   D        Ԁ       	    	   t  E   E   Ѐ       
+P         $0H`lxfrmesh        A   A          	     	p         $0H`lxrmesh    	   t   E   E   Ѐ       
      
-%   
+`%   	        
+                      	      E   E   Ѐ       	     	% 	        
+                     	     A   A          
+     
+p?         $0H`lxrmesh    	   t  E   E   Ѐ       
+     
+%   
         
-                      	   L <   <          	     	`ˠ         $0H`lx rmesh    	   M >   >   Ѐ<      	     
+                      	     E   E   Ѐ       	     	% 
+        
+                     	   T A   A          	     	˨         $0H`lx@rmesh    	    A   A          
+     
+         $0H`lxrmesh    	   t E   E   Ѐ       
      
-  $0H`lrmeshq   9u     	   M       Ԁ       
-    	   M <   <   Ѐ<      
-     	     	p   $0H`lq   9u      	   N <   <   Ј<      
-     	     	p   $0H`lq   9u      	   PO       Ԁ       	    	   O >   >   Ѐ<      
-     	     	  $0H`lrmeshq   9u     	   6P       Ԁ       	    	   P <   <   Ѐ<      	     
-     
-   $0H`lq  9u      	   P       Ԁ       
-    	    A   A          
-     
-         $0H`lxrmesh    	   t E   E   Ѐ       
-     
-%           
-                      	   À E   E   Ѐ       	     	%         
-                     	    A   A          	     	A         $0H`lxrmesh    
\ No newline at end of file
+%           
+                      	   À E   E   Ѐ       	     	%         
+                     	    A   A          	     	I         $0H`lxrmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-5-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-5-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-5-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-reactive-regression-test-5-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,5 +1,5 @@
 ò            i       
-&  >   >   Ј<           	     	    $0H`lrmeshq   9u         ?  A   A          	     	 k?          $0H`lx $ rmesh        ?  >   >   Ѐ<      	     
+&  >   >   Ј<           	     	    $0H`lrmeshq   9u         "'  >   >   Ј<           	     	    $0H`lrmeshq   9u         (  >   >   Ј<           	     	    $0H`lrmeshq   9u         %)  >   >   Ј<           	     	    $0H`lrmeshq   9u         )  >   >   Ј<           	     	    $0H`lrmeshq   9u         +  >   >   Ј<           	     	    $0H`lrmeshq   9u         ?  A   A          	     	 k?          $0H`lx $ rmesh        ?  >   >   Ѐ<      	     
      
     $0H`lrmeshq   9u         @  >   >   Ј<      	     
      
@@ -13,406 +13,320 @@
      
     $0H`lrmeshq   9u         E  >   >   Ј<      	     
      
-    $0H`lrmeshq   9u           >   >   Ѐ<           	     	    $0H`lrmeshq   9u           >   >   Ј<           	     	    $0H`lrmeshq   9u           >   >   Ј<           	     	    $0H`lrmeshq   9u           A   A          
+    $0H`lrmeshq   9u           >   >   Ѐ<           	     	    $0H`lrmeshq   9u           >   >   Ј<           	     	    $0H`lrmeshq   9u           >   >   Ј<           	     	    $0H`lrmeshq   9u           >   >   Ј<           	     	    $0H`lrmeshq   9u           A   A          
      
-           $0H`lx ? rmesh          >   >   Ј<           	     	    $0H`lrmeshq   9u           >   >   Ѐ<      
+           $0H`lx ? rmesh        	  >   >   Ј<           	     	    $0H`lrmeshq   9u           >   >   Ј<           	     	    $0H`lrmeshq   9u           >   >   Ѐ<      
      	     	0   $0H`lrmeshq   9u                 Ԁ       	          <   <   Ѐ<      	     
      
       $0H`lq   9u                  Ԁ       
-          -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4         u        Ԁ                 >   >   Ѐ<      	     
+        L  -   -   Ѐ<           	     	@ rmeshu   4         (  -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4           -   -   Ј<           	     	@ rmeshu   4         u        Ԁ                       Ԁ                 >   >   Ѐ<      	     
      
 0   $0H`lrmeshq   9u                 Ԁ       
           <   <   Ѐ<      
-     	     	P    $0H`lq  9u                  Ԁ       	        $ >   >   Ѐ<           	     	`   $0H`lrmeshq  9u         * >   >   Ј<           	     	`   $0H`lrmeshq  9u         ' >   >   Ј<           	     	`   $0H`lrmeshq  9u          F   F          	     	p          $0H`lx
- rmesh        ϩ       Ԁ               Y <   <   Ѐ<           	     	    $0H`lq  9u          6 >   >   Ѐ<           	     	   $0H`lrmeshq  9u         7 >   >   Ј<           	     	   $0H`lrmeshq  9u         9 >   >   Ј<           	     	   $0H`lrmeshq  9u         : >   >   Ј<           	     	   $0H`lrmeshq  9u         ; >   >   Ј<           	     	   $0H`lrmeshq  9u         J       Ԁ               `K -   -   Ѐ<           	     	 rmeshu  7         h A   A          
+     	     	P    $0H`lq  9u                  Ԁ       	        $ >   >   Ѐ<           	     	`   $0H`lrmeshq  9u         ' >   >   Ј<           	     	`   $0H`lrmeshq  9u         6 >   >   Ј<           	     	`   $0H`lrmeshq  9u         E >   >   Ј<           	     	`   $0H`lrmeshq  9u         9 >   >   Ј<           	     	`   $0H`lrmeshq  9u         Q >   >   Ј<           	     	`   $0H`lrmeshq  9u          F   F          	     	p          $0H`lx
+ rmesh        ϩ       Ԁ               Y <   <   Ѐ<           	     	    $0H`lq  9u          7       Ԁ               h A   A          
      
-@ h         $0H`lx rmesh         A   A          	     	 I         $0H`lx rmesh               Ԁ              1	  <   <   Ѐ<           	     	    $0H`lq  9u         
-  >   >   Ѐ<           	     	   $0H`lrmeshq  9u                Ԁ              }  -   -   Ѐ<      
-     	     	 rmeshu  4                Ԁ       	         -   -   Ѐ<      	     
-     
-P rmeshu  7        l        Ԁ       
-         A   A          
-     
-` 	         $0H`lx Jrmesh         >   >   Ѐ<      
-     	     	   $0H`lrmeshq  9u                Ԁ       	         -   -   Ѐ<      	     
-     
-p rmeshu  4        w        Ԁ       
-         -   -   Ѐ<      
-     	     	 rmeshu  7                Ԁ       	        A   A          	     	         $0H`lxrmesh        >   >   Ѐ<      	     
-     
-   $0H`lrmeshq   9u        ǩ       Ԁ       
-       Q <   <   Ѐ<      
-     	     	    $0H`lq  9u         a       Ԁ       	       . >   >   Ѐ<      
-     	     	0  $0H`lrmeshq  9u        >       Ԁ       	        <   <   Ѐ<      	     
-     
-    $0H`lq  9u         1       Ԁ       
-        A   A          
-     
-          $0H`lxrmesh         F   F          	     	@         $0H`lx
-hrmesh       3  L   L          
-      
-                
+@ h         $0H`lx rmesh        $ F   F          	     	          $0H`lx
+irmesh         A   A          
+     
+P 	         $0H`lx rmesh       } F   F          	     	 ˾         $0H`lx
+
+nrmesh       h A   A          
+     
+`          $0H`lx rmesh       $ F   F          	     	 _         $0H`lx
+rmesh         N   N          
+p      
+                 
 
 
-       _	  L   L          	P     
-               
+         N   N          	      
+                
 
 
-         E   E   Ѐ       	     	`%                     
-              ?   ?   Ѐ<      	     
+       {  E   E   Ѐ       	     	 %                     
+             ?   ?   Ѐ<      	     
      
-                       
-                  Ԁ       
-       7  ?   ?   Ѐ<           	     	p                   
-                  Ԁ                L   L   <      
+                       
+          F        Ԁ       
+         ?   ?   Ѐ<           	     	                    
+                  Ԁ                N   N   <      
      	     
-                     
+                        
      
 
-               Ԁ       	       ;  `   `   <      	     
-           
-          E  0    @  
-
- 	                                      Ԁ       
-         `   `   <           	          
-         E  0    @  
+               Ԁ       	          b   b   <      	     
+            
+           E  0    @  
+
+ 	                                      Ԁ       
+         b   b   <           	            
+          E  0    @  
 
- 	                              7  L   L          	                    
+ 	                              3  N   N          	                      
 
-       7  L   L   <      	     
-           
-                 
-
-     
-       H9  L   L   <           	          
-                
-
-     
-        :  L   L   <      	     
-           
-                 
-
-     
-       <  L   L   <      	     
-           
-                 
+       3  N   N   <      	     
+           
+                  
 
      
-       2A  L   L   <      	     
-           
-                 
+       4        Ԁ       
+       5  N   N   <           	           
+                 
 
      
-       C        Ԁ              DD  `   `   <      
-     	     
-              E  0    @  
-
- 	                              TD        Ԁ       	       K  L   L   <      	     
-           
-                 
-
-     
-       K        Ԁ       
-       &L  L   L          
-                     
+       &6  N   N          
+                      
 
-         A   A          
-     
- 	p         $0H`lxrmesh         `   `   <      	     
-          
-          E  0   @  
-
- 	                                     Ԁ       
-        `   `   <           	          
-         E  0   @  
-
- 	                                     Ԁ               `   `   <      
+       <        Ԁ              =  b   b   <      
      	     
-              E  0   @  
+                E  0    @  
 
- 	                              ˯       Ԁ       	       . -   -   Ѐ<      
-     	     	 rmeshu  4        >       Ԁ       	        -   -   Ѐ<      	     
-     
- rmeshu  7               Ԁ       
-        A   A          
-     
-0)'         $0H`lxrmesh        >   >   Ѐ<      
-     	     	  $0H`lrmeshq  9u               Ԁ       	        -   -   Ѐ<      	     
-     
-@rmeshu  4               Ԁ       
-        -   -   Ѐ<      
-     	     	 rmeshu  7               Ԁ       	       A /   /   Ѐ<           	     	0       
-                E   E   Ѐ       
-     
-P%           
-                         5        Ԁ                -   -   Ѐ<           	     	@rmeshu  7          A   A          	     	P+-         $0H`lx-rmesh         >   >   Ѐ<      	     
-     
-`  $0H`lrmeshq   9u        	  >   >   Ј<      	     
-     
-`  $0H`lrmeshq   9u        	  >   >   Ј<      	     
-     
-`  $0H`lrmeshq   9u        
-  >   >   Ј<      	     
-     
-`  $0H`lrmeshq   9u          >   >   Ј<      	     
-     
-`  $0H`lrmeshq   9u          >   >   Ј<      	     
-     
-`  $0H`lrmeshq   9u          >   >   Ј<      	     
-     
-`  $0H`lrmeshq   9u        D        Ԁ       
-         <   <   Ѐ<      
-     	     	`   $0H`lq   9u                 Ԁ       	         >   >   Ј<      
-     	     	p  $0H`lrmeshq   9u                Ԁ       	         <   <   Ѐ<      	     
+ 	                              =        Ԁ       	         A   A          
      
-p   $0H`lq  9u                 Ԁ       
-               Ԁ                <   <   Ѐ<           	     	   $0H`lq  9u	                 Ԁ                A   A          
-     
-I.         $0H`lx-rmesh        <   <   Ѐ<      
-     	     	                              !       Ԁ       	          E   E   Ѐ       
-     
-%           
-                         8! E   E   Ѐ       	     	%         
-                        "       Ԁ              " ?   ?   Ѐ<      
-     	     	      
-     f                 "       Ԁ       	       " `   `   <      	     
-          
-          E  0   @  
-
- 	                              $ `   `   <      	     
-          
-          E  0   @  
-
- 	                              & `   `   <      	     
-          
-          E  0   @  
-
- 	                              ( `   `   <           	          
-         E  0   @  
-
- 	                              * `   `   <      	     
-          
-          E  0   @  
-
- 	                              -       Ԁ              - ?   ?   Ѐ<      
-     	     	      
-                      -       Ԁ       	       5 `   `   <      	     
-          
-          E  0   @  
+ 	L         $0H`lx `rmesh       } F   F          	     	&         $0H`lx
+Lrmesh         b   b   <      	     
+            
+           E  0   @  
+
+ 	                                     Ԁ       
+        b   b   <           	            
+          E  0   @  
 
- 	                              6       Ԁ       
-       T9       Ԁ              < `   `   <      
+ 	                                     Ԁ               b   b   <      
      	     
-              E  0   @  
+                 E  0   @  
 
- 	                              <       Ԁ       	       | A   A          	     	 KC5         $0H`lx.rmesh         `   `   <      	     
-          
-          E  0   @  
-
- 	                                     Ԁ       
-        `   `   <           	          
-         E  0   @  
-
- 	                              H       Ԁ               `   `   <      
-     	     
-               E  0   @  
-
- 	                                     Ԁ       	        A   A          
+ 	                                     Ԁ       	       h A   A          
      
-iW6         $0H`lxC5rmesh              Ԁ               /   /   Ѐ<      
-     	     	0                   '       Ԁ       	        /   /   Ј<      
-     	     	0                          Ԁ       	        /   /   Ј<      
-     	     	0                          Ԁ       	         E   E   Ѐ       
-     
-%           
-                         8 E   E   Ѐ       	     	@%         
-                        $ F   F          	     	Pk<         $0H`lx
-W6p5rmesh         A   A          
-     
-=         $0H`lx<rmesh       } F   F          	     	`D         $0H`lx
-==rmesh        A   A          
-     
-E         $0H`lxDrmesh       	 E   E   Ѐ       
-     
- %           
-                         	 E   E   Ѐ       	     	p%         
-                        m	       Ԁ              	 ?   ?   Ѐ<      
-     	     	      
-                      	       Ԁ       	       b	 `   `   <      	     
-          
-          E  0   @  
-
- 	                              7	       Ԁ       
-       	 `   `   <           	          
-         E  0   @  
-
- 	                              G	 `   `   <           	          
-         E  0   @  
-
- 	                              	 `   `   <      	     
-           
-          E  0   @  
-
- 	                              L	 `   `   <      	     
-           
-          E  0   @  
-
- 	                              	 `   `   <      	     
-           
-          E  0   @  
-
- 	                              	       Ԁ       
-       	 `   `   <           	          
-         E  0   @  
-
- 	                              	       Ԁ              	 `   `   <      
+ )&         $0H`lx &rmesh       <       Ԁ               <   <   Ѐ<      
+     	     	                                      Ԁ       	        F   F          	     	0+-         $0H`lx
+&R&rmesh       
+ -   -   Ѐ<           	     	@rmeshu  7            E   E   Ѐ       
+     
+ %           
+                         8  E   E   Ѐ       	     	P%         
+                          A   A          
+     
+ I.         $0H`lx -rmesh          E   E   Ѐ       
+     
+ %           
+                         8! E   E   Ѐ       	     	`%         
+                        }       Ԁ              Q~ <   <   Ѐ<           	     	   $0H`lq  9u         7 >   >   Ѐ<           	     	  $0H`lrmeshq  9u        :       Ԁ              h A   A          
+     
+ i/6         $0H`lx -rmesh         E   E   Ѐ       
+     
+ %           
+                         8 E   E   Ѐ       	     	%         
+                               Ԁ               ?   ?   Ѐ<      
+     	     	      
+     f                        Ԁ       	        b   b   <      	     
+     0      
+           E  0   @  
+
+ 	                               b   b   <      	     
+     0      
+           E  0   @  
+
+ 	                              ͅ       Ԁ       
+        b   b   <           	     0      
+          E  0   @  
+
+ 	                              p b   b   <      	     
+     @      
+           E  0   @  
+
+ 	                               b   b   <           	     0      
+          E  0   @  
+
+ 	                              ɉ b   b   <      	     
+     @      
+           E  0   @  
+
+ 	                              0       Ԁ               ?   ?   Ѐ<      
+     	     	      
+                      ΋       Ԁ       	        b   b   <      	     
+     @      
+           E  0   @  
+
+ 	                              ߍ       Ԁ       
+        b   b   <           	     0      
+          E  0   @  
+
+ 	                              ' b   b   <           	     @      
+          E  0   @  
+
+ 	                               b   b   <           	     @      
+          E  0   @  
+
+ 	                              ! b   b   <           	     @      
+          E  0   @  
+
+ 	                              T -   -   Ѐ<      	     
+     
+rmeshu  4               Ԁ       
+       [ -   -   Ѐ<      
+     	     	rmeshu  7        k       Ԁ       	       ) F   F          	     	k<         $0H`lx
+/6h5rmesh       f >   >   Ѐ<      	     
+     
+   $0H`lrmeshq   9u               Ԁ       
+        -   -   Ѐ<      
+     	     	rmeshu  4               Ԁ       	        -   -   Ѐ<      	     
+     
+0rmeshu  7                Ԁ       
+       8  /   /   Ѐ<           	     	        
+              <   <          
+     
+@=         $0H`lx rmesh       X  >   >   Ј<      
+     	     	  $0H`lrmeshq  9u        h        Ԁ       	         <   <   Ѐ<      	     
+     
+P   $0H`lq   9u         [        Ԁ       
+         >   >   Ѐ<      	     
+     
+`  $0H`lrmeshq   9u        A        Ԁ       
+         <   <   Ѐ<      
+     	     	    $0H`lq  9u                 Ԁ       	       U F   F          	     	0]D         $0H`lx
+<=rmesh        A   A          
+     
+pE         $0H`lx^Drmesh       	 E   E   Ѐ       
+     
+%           
+                         þ	 ?   ?   Ѐ<      
+     	     	@        
+   j                   Ӿ	       Ԁ       	       *	 b   b   <      	     
+     P      
+           E  0   @  
+
+ 	                              	       Ԁ       
+       	 b   b   <           	     P      
+          E  0   @  
+
+ 	                              	 b   b   <      	     
+     `      
+           E  0   @  
+
+ 	                              	 E   E   Ѐ       	     	P%         
+                        p	 b   b   <      	     
+     `      
+           E  0   @  
+
+ 	                              I	       Ԁ       
+       	 b   b   <           	     `      
+          E  0   @  
+
+ 	                              " ?   ?   Ѐ<           	     	`                     
+           E   E   Ѐ       	     	p%              s       
+            ?   ?   Ѐ<      	     
+     
+                      
+                 Ԁ       
+       E ?   ?   Ѐ<           	     	                   
+                 Ԁ               b   b   <      
      	     
-              E  0   @  
+0                E  0   @  
 
- 	                              	       Ԁ       	       	       Ԁ              	 `   `   <      
+ 	                                     Ԁ       	       v       Ԁ              = b   b   <      
      	     
-              E  0   @  
+@                E  0   @  
 
- 	                              	       Ԁ       	       $ F   F          	     	&L         $0H`lx
-EDrmesh           `   `   <      	     
-     0     
-          E  0   @  
+ 	                              M       Ԁ       	       $ F   F          	     	K         $0H`lx
+DErmesh           b   b   <      	     
+     p      
+           E  0   @  
 
- 	                                       Ԁ       
-         `   `   <           	          
-         E  0   @  
+ 	                                       Ԁ       
+         b   b   <           	     p      
+          E  0   @  
 
- 	                              	  `   `   <           	          
-         E  0   @  
+ 	                              o  b   b   <           	     p      
+          E  0   @  
 
- 	                                `   `   <           	          
-         E  0   @  
+ 	                              G  b   b   <           	     p      
+          E  0   @  
 
- 	                                `   `   <           	          
-         E  0   @  
+ 	                                b   b   <           	     p      
+          E  0   @  
 
- 	                                `   `   <           	          
-         E  0   @  
+ 	                                b   b   <           	     p      
+          E  0   @  
 
- 	                                A   A          
-     
-@:M         $0H`lx'Lrmesh       } F   F          	     	S         $0H`lx
-;MGLrmesh         `   `   <      	     
-     P     
-          E  0   @  
+ 	                              %  b   b   <           	     p      
+          E  0   @  
 
- 	                                     Ԁ       
-        `   `   <           	           
-         E  0   @  
+ 	                                A   A          
+     
+6M         $0H`lxKrmesh       U F   F          	     	˟S         $0H`lx
+/L7Mrmesh         b   b   <      	     
+           
+           E  0   @  
 
- 	                               `   `   <           	           
-         E  0   @  
+ 	                                     Ԁ       
+        b   b   <           	           
+          E  0   @  
 
- 	                               `   `   <           	           
-         E  0   @  
+ 	                              k b   b   <           	           
+          E  0   @  
 
- 	                               `   `   <           	           
-         E  0   @  
+ 	                              ݩ b   b   <           	           
+          E  0   @  
 
- 	                               `   `   <           	           
-         E  0   @  
+ 	                              ݳ b   b   <           	           
+          E  0   @  
 
- 	                               `   `   <           	           
-         E  0   @  
+ 	                               b   b   <           	           
+          E  0   @  
 
- 	                              v `   `   <           	           
-         E  0   @  
+ 	                               b   b   <           	           
+          E  0   @  
 
- 	                              7 -   -   Ѐ<           	     	rmeshu	  4         -   -   Ј<           	     	rmeshu	  4        ݹ -   -   Ј<           	     	rmeshu	  4         -   -   Ј<           	     	rmeshu	  4         -   -   Ј<           	     	rmeshu	  4        M -   -   Ј<           	     	rmeshu	  4        M -   -   Ј<           	     	rmeshu	  4        ~ <   <   Ј<      
-     	     	                               ~       Ԁ       	        A   A          
+ 	                              f -   -   Ѐ<           	     	rmeshu  4        0 -   -   Ј<           	     	rmeshu  4         -   -   Ј<           	     	rmeshu  4         -   -   Ј<           	     	rmeshu  4        ; -   -   Ј<           	     	rmeshu  4        Ϳ -   -   Ј<           	     	rmeshu  4         -   -   Ј<           	     	rmeshu  4        f <   <   Ѐ<      
+     	     	                              f       Ԁ       	        A   A          
      
-`T         $0H`lxSrmesh        A   A          	     	0h[         $0H`lx;Mrmesh           E   E   Ѐ       
+T         $0H`lxSrmesh        A   A          	     	@[         $0H`lxTrmesh           E   E   Ѐ       
      
-p%           
-                         8  E   E   Ѐ       	     	@%         
-                          -   -   Ѐ<      
-     	     	Prmeshu  4                Ԁ       	       l  -   -   Ѐ<      	     
+%           
+                         8  E   E   Ѐ       	     	%         
+                          A   A          
      
-rmeshu  7        l  -   -   Ј<      	     
+	y\         $0H`lxA[rmesh          E   E   Ѐ       
      
-rmeshu  7                Ԁ       
-         A   A          
+%           
+	                         8! E   E   Ѐ       	     	%         
+	                        T A   A          	     	 b         $0H`lxy\rmesh        A   A          
      
-	}\         $0H`lxi[rmesh         >   >   Ѐ<      
-     	     	`  $0H`lrmeshq   9u
-        %        Ԁ       	         -   -   Ѐ<      	     
+)d         $0H`lxbrmesh         E   E   Ѐ       
      
-rmeshu 
- 4                Ԁ       
-         -   -   Ѐ<      
-     	     	prmeshu
-  7                Ԁ       	          E   E   Ѐ       
-     
-%           
-                         T <   <          	     	b         $0H`lx rmesh       U >   >   Ѐ<      	     
-     
-  $0H`lrmeshq   9u        U       Ԁ       
-       IV <   <   Ѐ<      
-     	     	  
- $0H`lq   9u         YV       Ԁ       	       W >   >   Ѐ<      
-     	     	  $0H`lrmeshq   9u        $W       Ԁ       	       rW <   <   Ѐ<      	     
-     
-   $0H`lq  9u         X       Ԁ       
-       d A   A          
-     
-)c         $0H`lxbrmesh         E   E   Ѐ       
-     
-%           
-	                         8 E   E   Ѐ       	     	%         
-	                         A   A          	     	+j         $0H`lx
-crmesh         A   A          
-     
- Ik         $0H`lxjrmesh       T A   A          	     	K$r         $0H`lx
-krmesh       d A   A          
-     
-i4s         $0H`lx$rrmesh       	 E   E   Ѐ       
-     
- %           
+ %           
+
+                         8 E   E   Ѐ       	     	%         
 
-                          A   A          	     	ky         $0H`lx
-4srmesh         A   A          
+                         A   A          	     	 +j         $0H`lxdrmesh         A   A          
      
-0z         $0H`lxyrmesh       T A   A          	     	 f         $0H`lx
-zrmesh       d A   A          
+Ik         $0H`lxjrmesh       T A   A          	     	0K$r         $0H`lxkrmesh        A   A          
      
-@v         $0H`lxfrmesh        A   A          	     	         $0H`lx
-zrmesh    	       E   E   Ѐ       
+ i\s         $0H`lx$rrmesh       	 E   E   Ѐ       
      
-P%   	        
-                      	   8  E   E   Ѐ       	     	 % 	        
-                     	     -   -   Ѐ<      
-     	     	0rmeshu  4     	           Ԁ       	    	   l  -   -   Ѐ<      	     
+0%           
+                         	 E   E   Ѐ       	     	@%         
+                         A   A          	     	Pky         $0H`lx\srmesh         A   A          
      
-`rmeshu  7     	           Ԁ       
-    	     A   A          
+@z         $0H`lxyrmesh       T A   A          	     	`f         $0H`lxzrmesh        A   A          
      
-p         $0H`lxrmesh    	     >   >   Ѐ<      
-     	     	@  $0H`lrmeshq   9u     	           Ԁ       	    	     -   -   Ѐ<      	     
+P         $0H`lxfrmesh        A   A          	     	p         $0H`lxrmesh    	       E   E   Ѐ       
      
-rmeshu  4     	   w        Ԁ       
-    	     -   -   Ѐ<      
-     	     	Prmeshu  7     	           Ԁ       	    	      E   E   Ѐ       
+`%   	        
+                      	   8  E   E   Ѐ       	     	% 	        
+                     	     A   A          
      
-%   
+p?         $0H`lxrmesh    	      E   E   Ѐ       
+     
+%   
+        
+                      	   8! E   E   Ѐ       	     	% 
         
-                      	   L <   <          	     	`ˠ         $0H`lx rmesh    	   M >   >   Ѐ<      	     
+                     	   T A   A          	     	˨         $0H`lx@rmesh    	    A   A          
+     
+         $0H`lxrmesh    	     E   E   Ѐ       
      
-  $0H`lrmeshq   9u     	   M       Ԁ       
-    	   O <   <   Ј<      
-     	     	p   $0H`lq   9u      	   $O       Ԁ       	    	   O >   >   Ѐ<      
-     	     	  $0H`lrmeshq   9u     	   
-P       Ԁ       	    	   XP <   <   Ѐ<      	     
-     
-   $0H`lq  9u      	   P       Ԁ       
-    	    A   A          
-     
-         $0H`lxrmesh    	     E   E   Ѐ       
-     
-%           
-                      	   8 E   E   Ѐ       	     	%         
-                     	    A   A          	     	A         $0H`lxrmesh    
\ No newline at end of file
+%           
+                      	   8 E   E   Ѐ       	     	%         
+                     	    A   A          	     	I         $0H`lxrmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-simplest-regression.cc ns-3.24/src/mesh/test/dot11s/hwmp-simplest-regression.cc
--- ns-3.23/src/mesh/test/dot11s/hwmp-simplest-regression.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-simplest-regression.cc	2015-09-15 11:18:44.000000000 -0700
@@ -30,7 +30,6 @@
 #include "ns3/internet-stack-helper.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/abort.h"
-#include "ns3/udp-echo-helper.h"
 #include "ns3/mobility-model.h"
 #include "ns3/pcap-test.h"
 #include <sstream>
@@ -44,7 +43,8 @@
 
 HwmpSimplestRegressionTest::HwmpSimplestRegressionTest () : TestCase ("Simplest HWMP regression test"),
                                                             m_nodes (0),
-                                                            m_time (Seconds (15))
+                                                            m_time (Seconds (15)),
+                                                            m_sentPktsCounter (0)
 {
 }
 
@@ -100,17 +100,18 @@
 void
 HwmpSimplestRegressionTest::InstallApplications ()
 {
-  UdpEchoServerHelper echoServer (9);
-  ApplicationContainer serverApps = echoServer.Install (m_nodes->Get (0));
-  serverApps.Start (Seconds (0.0));
-  serverApps.Stop (m_time);
-  UdpEchoClientHelper echoClient (m_interfaces.GetAddress (0), 9);
-  echoClient.SetAttribute ("MaxPackets", UintegerValue (300));
-  echoClient.SetAttribute ("Interval", TimeValue (Seconds (0.05)));
-  echoClient.SetAttribute ("PacketSize", UintegerValue (100));
-  ApplicationContainer clientApps = echoClient.Install (m_nodes->Get (1));
-  clientApps.Start (Seconds (2.0));
-  clientApps.Stop (m_time);
+  // client socket
+  m_clientSocket = Socket::CreateSocket (m_nodes->Get (1), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_clientSocket->Bind ();
+  m_clientSocket->Connect (InetSocketAddress (m_interfaces.GetAddress (0), 9));
+  m_clientSocket->SetRecvCallback (MakeCallback (&HwmpSimplestRegressionTest::HandleReadClient, this));
+  Simulator::ScheduleWithContext (m_clientSocket->GetNode ()->GetId (), Seconds (2.0),
+                                  &HwmpSimplestRegressionTest::SendData, this, m_clientSocket);
+
+  // server socket
+  m_serverSocket = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_serverSocket->Bind (InetSocketAddress (Ipv4Address::GetAny (), 9));
+  m_serverSocket->SetRecvCallback (MakeCallback (&HwmpSimplestRegressionTest::HandleReadServer, this));
 }
 void
 HwmpSimplestRegressionTest::CreateDevices ()
@@ -153,3 +154,38 @@
     }
 }
 
+void
+HwmpSimplestRegressionTest::SendData (Ptr<Socket> socket)
+{
+  if ((Simulator::Now () < m_time) && (m_sentPktsCounter < 300))
+    {
+      socket->Send (Create<Packet> (100));
+      m_sentPktsCounter ++;
+      Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0.05),
+                                      &HwmpSimplestRegressionTest::SendData, this, socket);
+    }
+}
+
+void
+HwmpSimplestRegressionTest::HandleReadServer (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+      packet->RemoveAllPacketTags ();
+      packet->RemoveAllByteTags ();
+
+      socket->SendTo (packet, 0, from);
+    }
+}
+
+void
+HwmpSimplestRegressionTest::HandleReadClient (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+    }
+}
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-simplest-regression.h ns-3.24/src/mesh/test/dot11s/hwmp-simplest-regression.h
--- ns-3.23/src/mesh/test/dot11s/hwmp-simplest-regression.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-simplest-regression.h	2015-09-15 11:18:44.000000000 -0700
@@ -85,5 +85,37 @@
   void CreateDevices ();
   void InstallApplications ();
   void ResetPosition ();
+
+  /// Server-side socket
+  Ptr<Socket> m_serverSocket;
+  /// Client-side socket
+  Ptr<Socket> m_clientSocket;
+
+  // sent packets counter
+  uint32_t m_sentPktsCounter;
+
+  /**
+   * Send data
+   * \param socket the sending socket
+   */
+  void SendData (Ptr<Socket> socket);
+
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
+  void HandleReadServer (Ptr<Socket> socket);
+
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
+  void HandleReadClient (Ptr<Socket> socket);
 };
 
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-simplest-regression-test-0-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-simplest-regression-test-0-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-simplest-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-simplest-regression-test-0-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,732 +1,702 @@
 ò            i         <   <                           $0H`lx rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u                 Ԁ               O  <   <   Ѐ<                     $0H`lq   9u          _        Ԁ               +  >   >   Ѐ<                    $0H`lrmeshq   9u         ;        Ԁ                 <   <   Ѐ<                     $0H`lq  9u          -        Ԁ               JO A   A                 JO         $0H`lx  rmesh        #j A   A               0 i         $0H`lx Ormesh        j A   A               0 j         $0H`lx jrmesh         A   A               @ 
-         $0H`lx rmesh       JO A   A               @          $0H`lx rmesh       #j A   A               P          $0H`lx rmesh       j A   A               P 2         $0H`lx rmesh       #  L   L          `                      
+         $0H`lx rmesh       JO A   A               @          $0H`lx rmesh       #j A   A               P          $0H`lx rmesh       j A   A               P 2         $0H`lx rmesh       #  N   N          `                       
 
-       #  L   L          `                     
+       #  N   N          `                      
 
-       $  E   E   Ѐ            p %                                    %  ?   ?   Ѐ<                p                                 %        Ԁ              &  L   L   <                                       
+       $  E   E   Ѐ            p %                                    %  ?   ?   Ѐ<                p                                 %        Ԁ              &  N   N   <                                         
      
-       &        Ԁ              (        <                                E      @  
+       &        Ԁ              (        <                                  E      @  
 
- 	 l                                                                                                             !(        Ԁ              9K  L   L                                
+ 	 l                                                                                                             %(        Ԁ              =K  N   N                                 
 
-       dL  L   L   <                                       
+       hL  N   N   <                                        
      
-       tL        Ԁ              M  L   L                               
+       xL        Ԁ              M  N   N                                
 
-       M        <                                E      @  
+       N        <                                 E      @  
 
- 	 l                                                                                                             =O        Ԁ              T        <                                E     @  
+ 	 l                                                                                                             EO        Ԁ              X        <                                  E     @  
 
- 	 l                                                                                                             d        Ԁ                      <                                E     @  
+ 	 l                                                                                                             h        Ԁ                      <                                  E     @  
 
- 	 l                                                                                                                     Ԁ                A   A                M         $0H`lx 3rmesh       JO A   A                         $0H`lx Mrmesh              <                                E     @  
+ 	 l                                                                                                                     Ԁ                A   A                M         $0H`lx 3rmesh       JO A   A                         $0H`lx Mrmesh              <                0                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                                E     @  
+ 	 l                                                                                                                    Ԁ                     <                0                 E     @  
 
- 	 l                                                                                                             K       Ԁ              J       <                                E     @  
+ 	 l                                                                                                             S       Ԁ              J       <                @                 E     @  
 
- 	 l                                                                                                             K       Ԁ              [K       <                                E     @  
+ 	 l                                                                                                             K       Ԁ              _K       <                @                 E     @  
 
- 	 l                                                                                                             L       Ԁ              D       <                                E     @  
+ 	 l                                                                                                             L       Ԁ              H       <                P                 E     @  
 
- 	 l                                                                                                             T       Ԁ                     <                                E     @  
+ 	 l                                                                                                             X       Ԁ                     <                P                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                                E     @  
+ 	 l                                                                                                                    Ԁ                     <                `                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                                E     @  
+ 	 l                                                                                                                    Ԁ                     <                `                 E     @  
 
- 	 l                                                                                                             ;       Ԁ                     <                               E     @  
+ 	 l                                                                                                             C       Ԁ                     <                p                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                                    Ԁ                     <                p                 E     @  
 
- 	 l                                                                                                             ;       Ԁ              W       <                                E     @  
+ 	 l                                                                                                             C       Ԁ              W       <                                 E     @  
 
- 	 l                                                                                                             W       Ԁ              KX       <                                E     @  
+ 	 l                                                                                                             W       Ԁ              OX       <                                 E     @  
 
- 	 l                                                                                                             ;Y       Ԁ              4       <                0               E     @  
+ 	 l                                                                                                             CY       Ԁ              8       <                                 E     @  
 
- 	 l                                                                                                             D       Ԁ                     <                0               E     @  
+ 	 l                                                                                                             H       Ԁ                     <                                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                @               E   	  @  
+ 	 l                                                                                                                    Ԁ                     <                                 E   	  @  
 
- 	 l                                                                                                                    Ԁ                     <                @               E   	  @  
+ 	 l                                                                                                                    Ԁ                     <                                 E   	  @  
 
- 	 l                                                                                                                    Ԁ              ԡ       <                P               E   
+ 	 l                                                                                                                    Ԁ              ء       <                                 E   
   @  
 
- 	 l                                                                                                                    Ԁ              ;       <                P               E   
+ 	 l                                                                                                                    Ԁ              ?       <                                 E   
   @  
 
- 	 l                                                                                                             +       Ԁ              $e       <                `               E     @  
+ 	 l                                                                                                             3       Ԁ              (e       <                                 E     @  
 
- 	 l                                                                                                             4e       Ԁ              e       <                `               E     @  
+ 	 l                                                                                                             8e       Ԁ              e       <                                 E     @  
 
- 	 l                                                                                                             {f       Ԁ              #j A   A               p3&         $0H`lx rmesh       j A   A               pt'         $0H`lx &rmesh       t(	       <                               E     @  
+ 	 l                                                                                                             f       Ԁ              #j A   A                3&         $0H`lx rmesh       j A   A                t'         $0H`lx &rmesh       x(	       <                                 E     @  
 
- 	 l                                                                                                             (	       Ԁ              (	       <                               E     @  
+ 	 l                                                                                                             (	       Ԁ              (	       <                                 E     @  
 
- 	 l                                                                                                             )	       Ԁ              	       <                               E     @  
+ 	 l                                                                                                             )	       Ԁ              	       <                                 E     @  
 
- 	 l                                                                                                             	       Ԁ              +	       <                               E     @  
+ 	 l                                                                                                             	       Ԁ              /	       <                                 E     @  
 
- 	 l                                                                                                             	       Ԁ              
-       <                               E     @  
+ 	 l                                                                                                             #	       Ԁ              
+       <                                 E     @  
 
- 	 l                                                                                                             $
-       Ԁ              {
-       <                               E     @  
+ 	 l                                                                                                             (
+       Ԁ              
+       <                                 E     @  
 
- 	 l                                                                                                             k
-       Ԁ              dr       <                               E     @  
+ 	 l                                                                                                             s
+       Ԁ              hr       <                                 E     @  
 
- 	 l                                                                                                             tr       Ԁ              r       <                               E     @  
+ 	 l                                                                                                             xr       Ԁ              r       <                                 E     @  
 
- 	 l                                                                                                             s       Ԁ              5       <                               E     @  
+ 	 l                                                                                                             s       Ԁ              5       <                                E     @  
 
- 	 l                                                                                                             5       Ԁ              5       <                               E     @  
+ 	 l                                                                                                             5       Ԁ              5       <                                E     @  
 
- 	 l                                                                                                             6       Ԁ                     <                               E     @  
+ 	 l                                                                                                             6       Ԁ                     <                                 E     @  
 
- 	 l                                                                                                                    Ԁ              C       <                               E     @  
+ 	 l                                                                                                                    Ԁ              G       <                                 E     @  
 
- 	 l                                                                                                                    Ԁ              ,       <                               E     @  
+ 	 l                                                                                                                    Ԁ              0       <                0                E     @  
 
- 	 l                                                                                                             <       Ԁ                     <                               E     @  
+ 	 l                                                                                                             @       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                             [       Ԁ              |       <                               E     @  
+ 	 l                                                                                                             c       Ԁ                     <                @                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                                    Ԁ                     <                @                E     @  
 
- 	 l                                                                                                                    Ԁ                       <                                E     @  
+ 	 l                                                                                                                    Ԁ                       <                P                E     @  
 
- 	 l                                                                                                                      Ԁ                       <                                E     @  
+ 	 l                                                                                                                      Ԁ                       <                P                E     @  
 
- 	 l                                                                                                                     Ԁ                      <                               E     @  
+ 	 l                                                                                                                     Ԁ                      <                `                E     @  
 
- 	 l                                                                                                                     Ԁ              C        <                               E     @  
+ 	 l                                                                                                                     Ԁ              G        <                `                E     @  
 
- 	 l                                                                                                                     Ԁ                A   A                S.         $0H`lx u'rmesh       JO A   A                
-/         $0H`lx .rmesh       ,       <                0               E     @  
+ 	 l                                                                                                                     Ԁ                A   A                S.         $0H`lx u'rmesh       JO A   A                
+/         $0H`lx .rmesh       0       <                p                E     @  
 
- 	 l                                                                                                             <       Ԁ                     <                0               E     @  
+ 	 l                                                                                                             @       Ԁ                     <                p                E     @  
 
- 	 l                                                                                                             [       Ԁ              |J       <                @               E     @  
+ 	 l                                                                                                             c       Ԁ              J       <                                E     @  
 
- 	 l                                                                                                             J       Ԁ              J       <                @               E     @  
+ 	 l                                                                                                             J       Ԁ              J       <                                E     @  
 
- 	 l                                                                                                             K       Ԁ                     <                P               E     @  
+ 	 l                                                                                                             K       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ              3       <                P               E     @  
+ 	 l                                                                                                                    Ԁ              7       <                                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                `               E     @  
+ 	 l                                                                                                                    Ԁ                      <                                E     @  
 
- 	 l                                                                                                             ,       Ԁ                     <                `               E     @  
+ 	 l                                                                                                             0       Ԁ                     <                                E     @  
 
- 	 l                                                                                                             K       Ԁ              D       <                p               E     @  
+ 	 l                                                                                                             S       Ԁ              H       <                                E     @  
 
- 	 l                                                                                                             T       Ԁ                     <                p               E     @  
+ 	 l                                                                                                             X       Ԁ                     <                                E     @  
 
- 	 l                                                                                                             s       Ԁ              W       <                               E     @  
+ 	 l                                                                                                             {       Ԁ              W       <                                E     @  
 
- 	 l                                                                                                             W       Ԁ              W       <                               E     @  
+ 	 l                                                                                                             W       Ԁ              W       <                                E     @  
 
- 	 l                                                                                                             X       Ԁ                     <                               E     @  
+ 	 l                                                                                                             X       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ              K       <                               E     @  
+ 	 l                                                                                                                    Ԁ              O       <                                E     @  
 
- 	 l                                                                                                                    Ԁ              4       <                               E     @  
+ 	 l                                                                                                                    Ԁ              8       <                                E     @  
 
- 	 l                                                                                                             D       Ԁ                     <                               E     @  
+ 	 l                                                                                                             H       Ԁ                     <                                E     @  
 
- 	 l                                                                                                             ;       Ԁ                     <                               E     @  
+ 	 l                                                                                                             C       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                                    Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ              d       <                               E     @  
+ 	 l                                                                                                                    Ԁ              d       <                                 E     @  
 
- 	 l                                                                                                             d       Ԁ              ;e       <                               E     @  
+ 	 l                                                                                                             d       Ԁ              ?e       <                                 E     @  
 
- 	 l                                                                                                             e       Ԁ              #j A   A               s06         $0H`lx /rmesh       j A   A               *6         $0H`lx 06rmesh       $(	       <                               E      @  
+ 	 l                                                                                                             e       Ԁ              #j A   A                s06         $0H`lx /rmesh       j A   A                *6         $0H`lx 06rmesh       ((	       <                                E      @  
 
- 	 l                                                                                                             4(	       Ԁ              (	       <                               E      @  
+ 	 l                                                                                                             8(	       Ԁ              (	       <                                E      @  
 
- 	 l                                                                                                             +)	       Ԁ              t	       <                               E   !  @  
+ 	 l                                                                                                             3)	       Ԁ              x	       <                                 E   !  @  
 
- 	 l                                                                                                             	       Ԁ              	       <                               E   !  @  
+ 	 l                                                                                                             	       Ԁ              	       <                                 E   !  @  
 
- 	 l                                                                                                             {	       Ԁ              Į
-       <                                E   "  @  
+ 	 l                                                                                                             	       Ԁ              Ȯ
+       <                0                E   "  @  
 
- 	 l                                                                                                             Ԯ
-       Ԁ              +
-       <                                E   "  @  
+ 	 l                                                                                                             خ
+       Ԁ              /
+       <                0                E   "  @  
 
- 	 l                                                                                                             ˯
-       Ԁ              r       <                               E   #  @  
+ 	 l                                                                                                             ӯ
+       Ԁ              r       <                @                E   #  @  
 
- 	 l                                                                                                             $r       Ԁ              {r       <                               E   #  @  
+ 	 l                                                                                                             (r       Ԁ              r       <                @                E   #  @  
 
- 	 l                                                                                                             s       Ԁ              P5       <                                E   $  @  
+ 	 l                                                                                                             #s       Ԁ              T5       <                P                E   $  @  
 
- 	 l                                                                                                             `5       Ԁ              5       <                                E   $  @  
+ 	 l                                                                                                             d5       Ԁ              5       <                P                E   $  @  
 
- 	 l                                                                                                             W6       Ԁ                     <                0               E   %  @  
+ 	 l                                                                                                             _6       Ԁ                     <                `                E   %  @  
 
- 	 l                                                                                                                    Ԁ                     <                0               E   %  @  
+ 	 l                                                                                                                    Ԁ                     <                `                E   %  @  
 
- 	 l                                                                                                                    Ԁ                     <                @               E   &  @  
+ 	 l                                                                                                                    Ԁ                     <                p                E   &  @  
 
- 	 l                                                                                                                     Ԁ              W       <                @               E   &  @  
+ 	 l                                                                                                                    Ԁ              [       <                p                E   &  @  
 
- 	 l                                                                                                                    Ԁ              @       <                P               E   '  @  
+ 	 l                                                                                                                    Ԁ              D       <                                E   '  @  
 
- 	 l                                                                                                             P       Ԁ                     <                P               E   '  @  
+ 	 l                                                                                                             T       Ԁ                     <                                E   '  @  
 
- 	 l                                                                                                             3       Ԁ              P         <                `               E   (  @  
+ 	 l                                                                                                             ;       Ԁ              T         <                                E   (  @  
 
- 	 l                                                                                                             `         Ԁ                       <                `               E   (  @  
+ 	 l                                                                                                             d         Ԁ                       <                                E   (  @  
 
- 	 l                                                                                                             C        Ԁ                      <                p               E   )  @  
+ 	 l                                                                                                             K        Ԁ                      <                                E   )  @  
 
- 	 l                                                                                                                     Ԁ                      <                p               E   )  @  
+ 	 l                                                                                                                     Ԁ                      <                                E   )  @  
 
- 	 l                                                                                                                     Ԁ                A   A               =         $0H`lx 6rmesh       JO A   A               JX>         $0H`lx =rmesh              <                               E   *  @  
+ 	 l                                                                                                                     Ԁ                A   A                =         $0H`lx 6rmesh       JO A   A                JX>         $0H`lx =rmesh              <                                E   *  @  
 
- 	 l                                                                                                                     Ԁ              W       <                               E   *  @  
+ 	 l                                                                                                                    Ԁ              [       <                                E   *  @  
 
- 	 l                                                                                                                    Ԁ              @J       <                               E   +  @  
+ 	 l                                                                                                                    Ԁ              DJ       <                                E   +  @  
 
- 	 l                                                                                                             PJ       Ԁ              J       <                               E   +  @  
+ 	 l                                                                                                             TJ       Ԁ              J       <                                E   +  @  
 
- 	 l                                                                                                             3K       Ԁ                     <                               E   ,  @  
+ 	 l                                                                                                             ;K       Ԁ                     <                                E   ,  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   ,  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   ,  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   -  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   -  @  
 
- 	 l                                                                                                                    Ԁ              G       <                               E   -  @  
+ 	 l                                                                                                                    Ԁ              K       <                                E   -  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   .  @  
+ 	 l                                                                                                                    Ԁ                      <                                E   .  @  
 
- 	 l                                                                                                             ,       Ԁ                     <                               E   .  @  
+ 	 l                                                                                                             0       Ԁ                     <                                E   .  @  
 
- 	 l                                                                                                                    Ԁ              lW       <                               E   /  @  
+ 	 l                                                                                                                    Ԁ              pW       <                                 E   /  @  
 
- 	 l                                                                                                             |W       Ԁ              W       <                               E   /  @  
+ 	 l                                                                                                             W       Ԁ              W       <                                 E   /  @  
 
- 	 l                                                                                                             KX       Ԁ                     <                               E   0  @  
+ 	 l                                                                                                             SX       Ԁ                     <                                E   0  @  
 
- 	 l                                                                                                                    Ԁ              #       <                               E   0  @  
+ 	 l                                                                                                                    Ԁ              '       <                                E   0  @  
 
- 	 l                                                                                                                    Ԁ                     <                                E   1  @  
+ 	 l                                                                                                                    Ԁ                     <                                 E   1  @  
 
- 	 l                                                                                                                    Ԁ              s       <                                E   1  @  
+ 	 l                                                                                                                     Ԁ              w       <                                 E   1  @  
 
- 	 l                                                                                                                    Ԁ              \       <                               E   2  @  
+ 	 l                                                                                                                    Ԁ              `       <                0                E   2  @  
 
- 	 l                                                                                                             l       Ԁ              á       <                               E   2  @  
+ 	 l                                                                                                             p       Ԁ              ǡ       <                0                E   2  @  
 
- 	 l                                                                                                             ;       Ԁ              d       <                                E   3  @  
+ 	 l                                                                                                             C       Ԁ              d       <                @                E   3  @  
 
- 	 l                                                                                                             d       Ԁ              e       <                                E   3  @  
+ 	 l                                                                                                             d       Ԁ              e       <                @                E   3  @  
 
- 	 l                                                                                                             e       Ԁ              #j A   A               0rE         $0H`lx X>rmesh       j A   A               0jE         $0H`lx sErmesh       '	       <                @               E   4  @  
+ 	 l                                                                                                             e       Ԁ              #j A   A                rE         $0H`lx X>rmesh       j A   A                jE         $0H`lx sErmesh        (	       <                P                E   4  @  
 
- 	 l                                                                                                             (	       Ԁ              c(	       <                @               E   4  @  
+ 	 l                                                                                                             (	       Ԁ              g(	       <                P                E   4  @  
 
- 	 l                                                                                                             (	       Ԁ              L	       <                P               E   5  @  
+ 	 l                                                                                                             (	       Ԁ              P	       <                `                E   5  @  
 
- 	 l                                                                                                             \	       Ԁ              	       <                P               E   5  @  
+ 	 l                                                                                                             `	       Ԁ              	       <                `                E   5  @  
 
- 	 l                                                                                                             +	       Ԁ              
-       <                `               E   6  @  
+ 	 l                                                                                                             3	       Ԁ              
+       <                p                E   6  @  
 
- 	 l                                                                                                             
-       Ԁ              
-       <                `               E   6  @  
+ 	 l                                                                                                             
+       Ԁ              
+       <                p                E   6  @  
 
- 	 l                                                                                                             {
-       Ԁ              q       <                p               E   7  @  
+ 	 l                                                                                                             
+       Ԁ              q       <                                E   7  @  
 
- 	 l                                                                                                             q       Ԁ              Sr       <                p               E   7  @  
+ 	 l                                                                                                              r       Ԁ              Wr       <                                E   7  @  
 
- 	 l                                                                                                             r       Ԁ              45       <                               E   8  @  
+ 	 l                                                                                                             r       Ԁ              45       <                                E   8  @  
 
- 	 l                                                                                                             D5       Ԁ              5       <                               E   8  @  
+ 	 l                                                                                                             D5       Ԁ              5       <                                E   8  @  
 
- 	 l                                                                                                             6       Ԁ                     <                               E   9  @  
+ 	 l                                                                                                             6       Ԁ                     <                                E   9  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   9  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   9  @  
 
- 	 l                                                                                                             [       Ԁ              Ի       <                               E   :  @  
+ 	 l                                                                                                             [       Ԁ              Ի       <                                E   :  @  
 
- 	 l                                                                                                                    Ԁ              ;       <                               E   :  @  
+ 	 l                                                                                                                    Ԁ              ;       <                                E   :  @  
 
- 	 l                                                                                                                    Ԁ              $       <                               E   ;  @  
+ 	 l                                                                                                                    Ԁ              $       <                                E   ;  @  
 
- 	 l                                                                                                             4       Ԁ                     <                               E   ;  @  
+ 	 l                                                                                                             4       Ԁ                     <                                E   ;  @  
 
- 	 l                                                                                                                    Ԁ              4         <                               E   <  @  
+ 	 l                                                                                                                    Ԁ              4         <                                E   <  @  
 
- 	 l                                                                                                             D         Ԁ                       <                               E   <  @  
+ 	 l                                                                                                             D         Ԁ                       <                                E   <  @  
 
- 	 l                                                                                                                     Ԁ                      <                               E   =  @  
+ 	 l                                                                                                                     Ԁ                      <                                E   =  @  
 
- 	 l                                                                                                                     Ԁ                      <                               E   =  @  
+ 	 l                                                                                                                     Ԁ                      <                                E   =  @  
 
- 	 l                                                                                                             [        Ԁ                A   A               M         $0H`lx Ermesh       JO A   A               M         $0H`lx Mrmesh       Ԇ       <                               E   >  @  
+ 	 l                                                                                                             [        Ԁ                A   A                M         $0H`lx Ermesh       JO A   A                M         $0H`lx Mrmesh       Ԇ       <                                E   >  @  
 
- 	 l                                                                                                                    Ԁ              ;       <                               E   >  @  
+ 	 l                                                                                                                    Ԁ              ;       <                                E   >  @  
 
- 	 l                                                                                                                    Ԁ              $J       <                                E   ?  @  
+ 	 l                                                                                                                    Ԁ              $J       <                                 E   ?  @  
 
- 	 l                                                                                                             4J       Ԁ              J       <                                E   ?  @  
+ 	 l                                                                                                             4J       Ԁ              J       <                                 E   ?  @  
 
- 	 l                                                                                                             J       Ԁ              t       <                               E   @  @  
+ 	 l                                                                                                             J       Ԁ              t       <                                E   @  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   @  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   @  @  
 
- 	 l                                                                                                             K       Ԁ                     <                                E   A  @  
+ 	 l                                                                                                             K       Ԁ                     <                                 E   A  @  
 
- 	 l                                                                                                                    Ԁ              +       <                                E   A  @  
+ 	 l                                                                                                                    Ԁ              +       <                                 E   A  @  
 
- 	 l                                                                                                                    Ԁ                     <                0               E   B  @  
+ 	 l                                                                                                                    Ԁ                     <                0                E   B  @  
 
- 	 l                                                                                                                     Ԁ              w       <                0               E   B  @  
+ 	 l                                                                                                                     Ԁ              w       <                0                E   B  @  
 
- 	 l                                                                                                                    Ԁ              `W       <                @               E   C  @  
+ 	 l                                                                                                                    Ԁ              `W       <                @                E   C  @  
 
- 	 l                                                                                                             pW       Ԁ              W       <                @               E   C  @  
+ 	 l                                                                                                             pW       Ԁ              W       <                @                E   C  @  
 
- 	 l                                                                                                             3X       Ԁ                     <                P               E   D  @  
+ 	 l                                                                                                             3X       Ԁ                     <                P                E   D  @  
 
- 	 l                                                                                                                    Ԁ                     <                P               E   D  @  
+ 	 l                                                                                                                    Ԁ                     <                P                E   D  @  
 
- 	 l                                                                                                                    Ԁ                      <                `               E   E  @  
+ 	 l                                                                                                                    Ԁ                      <                `                E   E  @  
 
- 	 l                                                                                                                    Ԁ              g       <                `               E   E  @  
+ 	 l                                                                                                                    Ԁ              g       <                `                E   E  @  
 
- 	 l                                                                                                                    Ԁ              P       <                p               E   F  @  
+ 	 l                                                                                                                    Ԁ              P       <                p                E   F  @  
 
- 	 l                                                                                                             `       Ԁ                     <                p               E   F  @  
+ 	 l                                                                                                             `       Ԁ                     <                p                E   F  @  
 
- 	 l                                                                                                             #       Ԁ              d       <                               E   G  @  
+ 	 l                                                                                                             #       Ԁ              d       <                                E   G  @  
 
- 	 l                                                                                                             d       Ԁ              e       <                               E   G  @  
+ 	 l                                                                                                             d       Ԁ              e       <                                E   G  @  
 
- 	 l                                                                                                             se       Ԁ              #j A   A               T         $0H`lx Mrmesh       j A   A               ;U         $0H`lx Trmesh       '	       <                               E   H  @  
+ 	 l                                                                                                             se       Ԁ              #j A   A                T         $0H`lx Mrmesh       j A   A                ;U         $0H`lx Trmesh       '	       <                                E   H  @  
 
- 	 l                                                                                                              (	       Ԁ              W(	       <                               E   H  @  
+ 	 l                                                                                                              (	       Ԁ              W(	       <                                E   H  @  
 
- 	 l                                                                                                             (	       Ԁ              @	       <                               E   I  @  
+ 	 l                                                                                                             (	       Ԁ              @	       <                                E   I  @  
 
- 	 l                                                                                                             P	       Ԁ              	       <                               E   I  @  
+ 	 l                                                                                                             P	       Ԁ              	       <                                E   I  @  
 
  	 l                                                                                                             	       Ԁ              
-       <                               E   J  @  
+       <                                E   J  @  
 
  	 l                                                                                                             
        Ԁ              
-       <                               E   J  @  
+       <                                E   J  @  
 
  	 l                                                                                                             c
-       Ԁ              q       <                               E   K  @  
+       Ԁ              q       <                                E   K  @  
 
- 	 l                                                                                                             q       Ԁ              Gr       <                               E   K  @  
+ 	 l                                                                                                             q       Ԁ              Gr       <                                E   K  @  
 
- 	 l                                                                                                             r       Ԁ              05       <                               E   L  @  
+ 	 l                                                                                                             r       Ԁ              05       <                                E   L  @  
 
- 	 l                                                                                                             @5       Ԁ              5       <                               E   L  @  
+ 	 l                                                                                                             @5       Ԁ              5       <                                E   L  @  
 
- 	 l                                                                                                             6       Ԁ                     <                               E   M  @  
+ 	 l                                                                                                             6       Ԁ                     <                                E   M  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   M  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   M  @  
 
- 	 l                                                                                                             S       Ԁ              л       <                                E   N  @  
+ 	 l                                                                                                             S       Ԁ              л       <                                E   N  @  
 
- 	 l                                                                                                                    Ԁ              7       <                                E   N  @  
+ 	 l                                                                                                                    Ԁ              7       <                                E   N  @  
 
- 	 l                                                                                                                    Ԁ                      <                               E   O  @  
+ 	 l                                                                                                                    Ԁ                      <                                 E   O  @  
 
- 	 l                                                                                                             0       Ԁ                     <                               E   O  @  
+ 	 l                                                                                                             0       Ԁ                     <                                 E   O  @  
 
- 	 l                                                                                                                    Ԁ              0         <                                E   P  @  
+ 	 l                                                                                                                    Ԁ              0         <                                E   P  @  
 
- 	 l                                                                                                             @         Ԁ                       <                                E   P  @  
+ 	 l                                                                                                             @         Ԁ                       <                                E   P  @  
 
- 	 l                                                                                                                     Ԁ                      <                0               E   Q  @  
+ 	 l                                                                                                                     Ԁ                      <                                 E   Q  @  
 
- 	 l                                                                                                                     Ԁ                      <                0               E   Q  @  
+ 	 l                                                                                                                     Ԁ                      <                                 E   Q  @  
 
- 	 l                                                                                                             S        Ԁ                A   A               @V\         $0H`lx <Urmesh       JO A   A               @\         $0H`lx V\rmesh       І       <                P               E   R  @  
+ 	 l                                                                                                             S        Ԁ                A   A               V\         $0H`lx <Urmesh       JO A   A               \         $0H`lx V\rmesh       І       <                0                E   R  @  
 
- 	 l                                                                                                                    Ԁ              7       <                P               E   R  @  
+ 	 l                                                                                                                    Ԁ              7       <                0                E   R  @  
 
- 	 l                                                                                                                    Ԁ               J       <                `               E   S  @  
+ 	 l                                                                                                                    Ԁ               J       <                @                E   S  @  
 
- 	 l                                                                                                             0J       Ԁ              J       <                `               E   S  @  
+ 	 l                                                                                                             0J       Ԁ              J       <                @                E   S  @  
 
- 	 l                                                                                                             J       Ԁ              p       <                p               E   T  @  
+ 	 l                                                                                                             J       Ԁ              p       <                P                E   T  @  
 
- 	 l                                                                                                                    Ԁ                     <                p               E   T  @  
+ 	 l                                                                                                                    Ԁ                     <                P                E   T  @  
 
- 	 l                                                                                                             C       Ԁ                     <                               E   U  @  
+ 	 l                                                                                                             C       Ԁ                     <                `                E   U  @  
 
- 	 l                                                                                                                    Ԁ              '       <                               E   U  @  
+ 	 l                                                                                                                    Ԁ              '       <                `                E   U  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   V  @  
+ 	 l                                                                                                                    Ԁ                     <                p                E   V  @  
 
- 	 l                                                                                                                     Ԁ              w       <                               E   V  @  
+ 	 l                                                                                                                     Ԁ              w       <                p                E   V  @  
 
- 	 l                                                                                                                    Ԁ              `W       <                               E   W  @  
+ 	 l                                                                                                                    Ԁ              `W       <                                E   W  @  
 
- 	 l                                                                                                             pW       Ԁ              W       <                               E   W  @  
+ 	 l                                                                                                             pW       Ԁ              W       <                                E   W  @  
 
- 	 l                                                                                                             3X       Ԁ                     <                               E   X  @  
+ 	 l                                                                                                             3X       Ԁ                     <                                E   X  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   X  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   X  @  
 
- 	 l                                                                                                                    Ԁ                      <                               E   Y  @  
+ 	 l                                                                                                                    Ԁ                      <                                E   Y  @  
 
- 	 l                                                                                                                    Ԁ              g       <                               E   Y  @  
+ 	 l                                                                                                                    Ԁ              g       <                                E   Y  @  
 
- 	 l                                                                                                                    Ԁ              P       <                               E   Z  @  
+ 	 l                                                                                                                    Ԁ              P       <                                E   Z  @  
 
- 	 l                                                                                                             `       Ԁ                     <                               E   Z  @  
+ 	 l                                                                                                             `       Ԁ                     <                                E   Z  @  
 
- 	 l                                                                                                             #       Ԁ              d       <                               E   [  @  
+ 	 l                                                                                                             #       Ԁ              d       <                                E   [  @  
 
- 	 l                                                                                                             d       Ԁ              e       <                               E   [  @  
+ 	 l                                                                                                             d       Ԁ              e       <                                E   [  @  
 
- 	 l                                                                                                             se       Ԁ              #j A   A               3c         $0H`lx \rmesh       j A   A               }d         $0H`lx crmesh       '	       <                                E   \  @  
+ 	 l                                                                                                             se       Ԁ              #j A   A                3c         $0H`lx \rmesh       j A   A                }d         $0H`lx crmesh       '	       <                                E   \  @  
 
- 	 l                                                                                                              (	       Ԁ              W(	       <                                E   \  @  
+ 	 l                                                                                                              (	       Ԁ              W(	       <                                E   \  @  
 
- 	 l                                                                                                             (	       Ԁ              @	       <                               E   ]  @  
+ 	 l                                                                                                             (	       Ԁ              @	       <                                E   ]  @  
 
- 	 l                                                                                                             P	       Ԁ              	       <                               E   ]  @  
+ 	 l                                                                                                             P	       Ԁ              	       <                                E   ]  @  
 
  	 l                                                                                                             	       Ԁ              
-       <                                E   ^  @  
+       <                                E   ^  @  
 
  	 l                                                                                                             
        Ԁ              
-       <                                E   ^  @  
+       <                                E   ^  @  
 
  	 l                                                                                                             c
-       Ԁ              q       <                0               E   _  @  
+       Ԁ              q       <                                 E   _  @  
 
- 	 l                                                                                                             q       Ԁ              Gr       <                0               E   _  @  
+ 	 l                                                                                                             q       Ԁ              Gr       <                                 E   _  @  
 
- 	 l                                                                                                             r       Ԁ              05       <                @               E   `  @  
+ 	 l                                                                                                             r       Ԁ              05       <                                E   `  @  
 
- 	 l                                                                                                             @5       Ԁ              5       <                @               E   `  @  
+ 	 l                                                                                                             @5       Ԁ              5       <                                E   `  @  
 
- 	 l                                                                                                             6       Ԁ                     <                P               E   a  @  
+ 	 l                                                                                                             6       Ԁ                     <                                 E   a  @  
 
- 	 l                                                                                                                    Ԁ                     <                P               E   a  @  
+ 	 l                                                                                                                    Ԁ                     <                                 E   a  @  
 
- 	 l                                                                                                             S       Ԁ              л       <                `               E   b  @  
+ 	 l                                                                                                             S       Ԁ              л       <                0                E   b  @  
 
- 	 l                                                                                                                    Ԁ              7       <                `               E   b  @  
+ 	 l                                                                                                                    Ԁ              7       <                0                E   b  @  
 
- 	 l                                                                                                                    Ԁ                      <                p               E   c  @  
+ 	 l                                                                                                                    Ԁ                      <                @                E   c  @  
 
- 	 l                                                                                                             0       Ԁ                     <                p               E   c  @  
+ 	 l                                                                                                             0       Ԁ                     <                @                E   c  @  
 
- 	 l                                                                                                                    Ԁ              0         <                               E   d  @  
+ 	 l                                                                                                                    Ԁ              0         <                P                E   d  @  
 
- 	 l                                                                                                             @         Ԁ                       <                               E   d  @  
+ 	 l                                                                                                             @         Ԁ                       <                P                E   d  @  
 
- 	 l                                                                                                                     Ԁ                      <                               E   e  @  
+ 	 l                                                                                                                     Ԁ                      <                `                E   e  @  
 
- 	 l                                                                                                                     Ԁ                      <                               E   e  @  
+ 	 l                                                                                                                     Ԁ                      <                `                E   e  @  
 
- 	 l                                                                                                             S        Ԁ                A   A               Sk         $0H`lx ~drmesh       JO A   A               
-l         $0H`lx krmesh       І       <                               E   f  @  
+ 	 l                                                                                                             S        Ԁ                A   A               0Sk         $0H`lx ~drmesh       JO A   A               0
+l         $0H`lx krmesh       І       <                p                E   f  @  
 
- 	 l                                                                                                                    Ԁ              7       <                               E   f  @  
+ 	 l                                                                                                                    Ԁ              7       <                p                E   f  @  
 
- 	 l                                                                                                                    Ԁ              dJ E   E   Ѐ            %                                   J ?   ?   Ѐ<                                                J       Ԁ              =K       <                               E   g  @  
+ 	 l                                                                                                                    Ԁ              dJ E   E   Ѐ            @%                                   J ?   ?   Ѐ<                @                                J       Ԁ              =K       <                                E   g  @  
 
- 	 l                                                                                                             MK       Ԁ              K       <                               E   g  @  
+ 	 l                                                                                                             MK       Ԁ              K       <                                E   g  @  
 
- 	 l                                                                                                             L       Ԁ              p       <                               E   h  @  
+ 	 l                                                                                                             L       Ԁ              p       <                                E   h  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   h  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   h  @  
 
- 	 l                                                                                                             C       Ԁ                     <                               E   i  @  
+ 	 l                                                                                                             C       Ԁ                     <                                E   i  @  
 
- 	 l                                                                                                                    Ԁ              '       <                               E   i  @  
+ 	 l                                                                                                                    Ԁ              '       <                                E   i  @  
 
- 	 l                                                                                                                    Ԁ                     <                                E   j  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   j  @  
 
- 	 l                                                                                                                     Ԁ              w       <                                E   j  @  
+ 	 l                                                                                                                     Ԁ              w       <                                E   j  @  
 
- 	 l                                                                                                                    Ԁ              `W       <                               E   k  @  
+ 	 l                                                                                                                    Ԁ              `W       <                                E   k  @  
 
- 	 l                                                                                                             pW       Ԁ              W       <                               E   k  @  
+ 	 l                                                                                                             pW       Ԁ              W       <                                E   k  @  
 
- 	 l                                                                                                             3X       Ԁ                     <                                E   l  @  
+ 	 l                                                                                                             3X       Ԁ                     <                                E   l  @  
 
- 	 l                                                                                                                    Ԁ                     <                                E   l  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   l  @  
 
- 	 l                                                                                                                    Ԁ                      <                0               E   m  @  
+ 	 l                                                                                                                    Ԁ                      <                                E   m  @  
 
- 	 l                                                                                                                    Ԁ              g       <                0               E   m  @  
+ 	 l                                                                                                                    Ԁ              g       <                                E   m  @  
 
- 	 l                                                                                                                    Ԁ              P       <                @               E   n  @  
+ 	 l                                                                                                                    Ԁ              P       <                                E   n  @  
 
- 	 l                                                                                                             `       Ԁ                     <                @               E   n  @  
+ 	 l                                                                                                             `       Ԁ                     <                                E   n  @  
 
- 	 l                                                                                                             #       Ԁ              d       <                P               E   o  @  
+ 	 l                                                                                                             #       Ԁ              d       <                                 E   o  @  
 
- 	 l                                                                                                             d       Ԁ              e       <                P               E   o  @  
+ 	 l                                                                                                             d       Ԁ              e       <                                 E   o  @  
 
- 	 l                                                                                                             se       Ԁ              #j A   A               `s9s         $0H`lx lrmesh       j A   A               `*s         $0H`lx 9srmesh       '	       <                p               E   p  @  
+ 	 l                                                                                                             se       Ԁ              #j A   A               Ps9s         $0H`lx lrmesh       j A   A               P*s         $0H`lx 9srmesh       '	       <                                E   p  @  
 
- 	 l                                                                                                              (	       Ԁ              W(	       <                p               E   p  @  
+ 	 l                                                                                                              (	       Ԁ              W(	       <                                E   p  @  
 
- 	 l                                                                                                             (	       Ԁ              @	       <                               E   q  @  
+ 	 l                                                                                                             (	       Ԁ              @	       <                                 E   q  @  
 
- 	 l                                                                                                             P	       Ԁ              	       <                               E   q  @  
+ 	 l                                                                                                             P	       Ԁ              	       <                                 E   q  @  
 
  	 l                                                                                                             	       Ԁ              
-       <                               E   r  @  
+       <                0                E   r  @  
 
  	 l                                                                                                             
        Ԁ              
-       <                               E   r  @  
+       <                0                E   r  @  
 
  	 l                                                                                                             c
-       Ԁ              q       <                               E   s  @  
+       Ԁ              q       <                @                E   s  @  
 
- 	 l                                                                                                             q       Ԁ              Gr       <                               E   s  @  
+ 	 l                                                                                                             q       Ԁ              Gr       <                @                E   s  @  
 
- 	 l                                                                                                             r       Ԁ              05       <                               E   t  @  
+ 	 l                                                                                                             r       Ԁ              05       <                P                E   t  @  
 
- 	 l                                                                                                             @5       Ԁ              5       <                               E   t  @  
+ 	 l                                                                                                             @5       Ԁ              5       <                P                E   t  @  
 
- 	 l                                                                                                             6       Ԁ                     <                               E   u  @  
+ 	 l                                                                                                             6       Ԁ                     <                `                E   u  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   u  @  
+ 	 l                                                                                                                    Ԁ                     <                `                E   u  @  
 
- 	 l                                                                                                             S       Ԁ              л       <                               E   v  @  
+ 	 l                                                                                                             S       Ԁ              л       <                p                E   v  @  
 
- 	 l                                                                                                                    Ԁ              7       <                               E   v  @  
+ 	 l                                                                                                                    Ԁ              7       <                p                E   v  @  
 
- 	 l                                                                                                                    Ԁ                      <                               E   w  @  
+ 	 l                                                                                                                    Ԁ                      <                                E   w  @  
 
- 	 l                                                                                                             0       Ԁ                     <                               E   w  @  
+ 	 l                                                                                                             0       Ԁ                     <                                E   w  @  
 
- 	 l                                                                                                                    Ԁ              0         <                               E   x  @  
+ 	 l                                                                                                                    Ԁ              0         <                                E   x  @  
 
- 	 l                                                                                                             @         Ԁ                       <                               E   x  @  
+ 	 l                                                                                                             @         Ԁ                       <                                E   x  @  
 
- 	 l                                                                                                                     Ԁ                      <                 	               E   y  @  
+ 	 l                                                                                                                     Ԁ                      <                                E   y  @  
 
- 	 l                                                                                                                     Ԁ                      <                 	               E   y  @  
+ 	 l                                                                                                                     Ԁ                      <                                E   y  @  
 
- 	 l                                                                                                             S        Ԁ                A   A               	z         $0H`lx srmesh       JO A   A               	Ja{         $0H`lx zrmesh       І       <                 	               E   z  @  
+ 	 l                                                                                                             S        Ԁ                A   A               `z         $0H`lx srmesh       JO A   A               `Ja{         $0H`lx zrmesh       І       <                                E   z  @  
 
- 	 l                                                                                                                    Ԁ              7       <                 	               E   z  @  
+ 	 l                                                                                                                    Ԁ              7       <                                E   z  @  
 
- 	 l                                                                                                                    Ԁ               J       <                0	               E   {  @  
+ 	 l                                                                                                                    Ԁ               J       <                                E   {  @  
 
- 	 l                                                                                                             0J       Ԁ              J       <                0	               E   {  @  
+ 	 l                                                                                                             0J       Ԁ              J       <                                E   {  @  
 
- 	 l                                                                                                             J       Ԁ              p       <                @	               E   |  @  
+ 	 l                                                                                                             J       Ԁ              p       <                                E   |  @  
 
- 	 l                                                                                                                    Ԁ                     <                @	               E   |  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   |  @  
 
- 	 l                                                                                                             C       Ԁ                     <                P	               E   }  @  
+ 	 l                                                                                                             C       Ԁ                     <                                E   }  @  
 
- 	 l                                                                                                                    Ԁ              '       <                P	               E   }  @  
+ 	 l                                                                                                                    Ԁ              '       <                                E   }  @  
 
- 	 l                                                                                                                    Ԁ                     <                `	               E   ~  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   ~  @  
 
- 	 l                                                                                                                     Ԁ              w       <                `	               E   ~  @  
+ 	 l                                                                                                                     Ԁ              w       <                                E   ~  @  
 
- 	 l                                                                                                                    Ԁ              `W       <                p	               E     @  
+ 	 l                                                                                                                    Ԁ              `W       <                                 E     @  
 
- 	 l                                                                                                             pW       Ԁ              W       <                p	               E     @  
+ 	 l                                                                                                             pW       Ԁ              W       <                                 E     @  
 
- 	 l                                                                                                             3X       Ԁ                     <                	               E     @  
+ 	 l                                                                                                             3X       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                	               E     @  
+ 	 l                                                                                                                    Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ                      <                	               E     @  
+ 	 l                                                                                                                    Ԁ                      <                                 E     @  
 
- 	 l                                                                                                                    Ԁ              g       <                	               E     @  
+ 	 l                                                                                                                    Ԁ              g       <                                 E     @  
 
- 	 l                                                                                                                    Ԁ              P       <                	               E     @  
+ 	 l                                                                                                                    Ԁ              P       <                0                E     @  
 
- 	 l                                                                                                             `       Ԁ                     <                	               E     @  
+ 	 l                                                                                                             `       Ԁ                     <                0                E     @  
 
- 	 l                                                                                                             #       Ԁ              d       <                	               E     @  
+ 	 l                                                                                                             #       Ԁ              d       <                @                E     @  
 
- 	 l                                                                                                             d       Ԁ              e       <                	               E     @  
+ 	 l                                                                                                             d       Ԁ              e       <                @                E     @  
 
- 	 l                                                                                                             se       Ԁ              #j A   A               	{         $0H`lx a{rmesh       j A   A               	j         $0H`lx |rmesh       '	       <                	               E     @  
+ 	 l                                                                                                             se       Ԁ              #j A   A               p{         $0H`lx a{rmesh       j A   A               pj         $0H`lx |rmesh       '	       <                P                E     @  
 
- 	 l                                                                                                              (	       Ԁ              W(	       <                	               E     @  
+ 	 l                                                                                                              (	       Ԁ              W(	       <                P                E     @  
 
- 	 l                                                                                                             (	       Ԁ              @	       <                	               E     @  
+ 	 l                                                                                                             (	       Ԁ              @	       <                `                E     @  
 
- 	 l                                                                                                             P	       Ԁ              	       <                	               E     @  
+ 	 l                                                                                                             P	       Ԁ              	       <                `                E     @  
 
  	 l                                                                                                             	       Ԁ              
-       <                	               E     @  
+       <                p                E     @  
 
  	 l                                                                                                             
        Ԁ              
-       <                	               E     @  
+       <                p                E     @  
 
  	 l                                                                                                             c
-       Ԁ              q       <                 
-               E     @  
+       Ԁ              q       <                                E     @  
 
- 	 l                                                                                                             q       Ԁ              Gr       <                 
-               E     @  
+ 	 l                                                                                                             q       Ԁ              Gr       <                                E     @  
 
- 	 l                                                                                                             r       Ԁ              05       <                
-               E     @  
+ 	 l                                                                                                             r       Ԁ              05       <                                E     @  
 
- 	 l                                                                                                             @5       Ԁ              5       <                
-               E     @  
+ 	 l                                                                                                             @5       Ԁ              5       <                                E     @  
 
- 	 l                                                                                                             6       Ԁ                     <                 
-               E     @  
+ 	 l                                                                                                             6       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                 
-               E     @  
+ 	 l                                                                                                                    Ԁ                     <                                E     @  
 
- 	 l                                                                                                             S       Ԁ              л       <                0
-               E     @  
+ 	 l                                                                                                             S       Ԁ              л       <                                E     @  
 
- 	 l                                                                                                                    Ԁ              7       <                0
-               E     @  
+ 	 l                                                                                                                    Ԁ              7       <                                E     @  
 
- 	 l                                                                                                                    Ԁ                      <                @
-               E     @  
+ 	 l                                                                                                                    Ԁ                      <                                E     @  
 
- 	 l                                                                                                             0       Ԁ                     <                @
-               E     @  
+ 	 l                                                                                                             0       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ           	   0         <                P
-               E     @  
+ 	 l                                                                                                                    Ԁ           	   0         <                                E     @  
 
- 	 l                                                                                                          	   @         Ԁ           	            <                P
-               E     @  
+ 	 l                                                                                                          	   @         Ԁ           	            <                                E     @  
 
- 	 l                                                                                                          	           Ԁ           	           <                `
-               E     @  
+ 	 l                                                                                                          	           Ԁ           	           <                                E     @  
 
- 	 l                                                                                                          	           Ԁ           	           <                `
-               E     @  
+ 	 l                                                                                                          	           Ԁ           	           <                                E     @  
 
- 	 l                                                                                                          	   S        Ԁ           	     A   A               p
-         $0H`lx rmesh    	   JO A   A               p
-         $0H`lx rmesh    	   І       <                
-               E     @  
+ 	 l                                                                                                          	   S        Ԁ           	     A   A                        $0H`lx rmesh    	   JO A   A                        $0H`lx rmesh    	   І       <                                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   7       <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	   7       <                                E     @  
 
- 	 l                                                                                                          	          Ԁ           	    J       <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	    J       <                 	                E     @  
 
- 	 l                                                                                                          	   0J       Ԁ           	   J       <                
-               E     @  
+ 	 l                                                                                                          	   0J       Ԁ           	   J       <                 	                E     @  
 
- 	 l                                                                                                          	   J       Ԁ           	   p       <                
-               E     @  
+ 	 l                                                                                                          	   J       Ԁ           	   p       <                	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	          <                	                E     @  
 
- 	 l                                                                                                          	   C       Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	   C       Ԁ           	          <                 	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   '       <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	   '       <                 	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	          <                0	                E     @  
 
- 	 l                                                                                                          	           Ԁ           	   w       <                
-               E     @  
+ 	 l                                                                                                          	           Ԁ           	   w       <                0	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   `W       <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	   `W       <                @	                E     @  
 
- 	 l                                                                                                          	   pW       Ԁ           	   W       <                
-               E     @  
+ 	 l                                                                                                          	   pW       Ԁ           	   W       <                @	                E     @  
 
- 	 l                                                                                                          	   3X       Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	   3X       Ԁ           	          <                P	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	          <                P	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	           <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	           <                `	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   g       <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	   g       <                `	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   P       <                                E     @  
+ 	 l                                                                                                          	          Ԁ           	   P       <                p	                E     @  
 
- 	 l                                                                                                          	   `       Ԁ           	          <                                E     @  
+ 	 l                                                                                                          	   `       Ԁ           	          <                p	                E     @  
 
- 	 l                                                                                                          	   #       Ԁ           	   d       <                               E     @  
+ 	 l                                                                                                          	   #       Ԁ           	   d       <                	                E     @  
 
- 	 l                                                                                                          	   d       Ԁ           	   e       <                               E     @  
+ 	 l                                                                                                          	   d       Ԁ           	   e       <                	                E     @  
 
- 	 l                                                                                                          	   se       Ԁ           	   #j A   A                         $0H`lx rmesh    	   j A   A                D         $0H`lx rmesh    	   '	       <                0               E     @  
+ 	 l                                                                                                          	   se       Ԁ           	   #j A   A                        $0H`lx rmesh    	   j A   A               D         $0H`lx rmesh    	   '	       <                	                E     @  
 
- 	 l                                                                                                          	    (	       Ԁ           	   W(	       <                0               E     @  
+ 	 l                                                                                                          	    (	       Ԁ           	   W(	       <                	                E     @  
 
- 	 l                                                                                                          	   (	       Ԁ           	   @	       <                @               E     @  
+ 	 l                                                                                                          	   (	       Ԁ           	   @	       <                	                E     @  
 
- 	 l                                                                                                          	   P	       Ԁ           	   	       <                @               E     @  
+ 	 l                                                                                                          	   P	       Ԁ           	   	       <                	                E     @  
 
  	 l                                                                                                          	   	       Ԁ           	   
-       <                P               E     @  
+       <                	                E     @  
 
  	 l                                                                                                          	   
        Ԁ           	   
-       <                P               E     @  
+       <                	                E     @  
 
  	 l                                                                                                          	   c
-       Ԁ           	   q       <                `               E     @  
+       Ԁ           	   q       <                	                E     @  
 
- 	 l                                                                                                          	   q       Ԁ           	   Gr       <                `               E     @  
+ 	 l                                                                                                          	   q       Ԁ           	   Gr       <                	                E     @  
 
- 	 l                                                                                                          	   r       Ԁ           	   05       <                p               E     @  
+ 	 l                                                                                                          	   r       Ԁ           	   05       <                	                E     @  
 
- 	 l                                                                                                          	   @5       Ԁ           	   5       <                p               E     @  
+ 	 l                                                                                                          	   @5       Ԁ           	   5       <                	                E     @  
 
- 	 l                                                                                                          	   6       Ԁ           	          <                               E     @  
+ 	 l                                                                                                          	   6       Ԁ           	          <                	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	          <                               E     @  
+ 	 l                                                                                                          	          Ԁ           	          <                	                E     @  
 
- 	 l                                                                                                          	   S       Ԁ           	   л       <                               E     @  
+ 	 l                                                                                                          	   S       Ԁ           	   л       <                	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   7       <                               E     @  
+ 	 l                                                                                                          	          Ԁ           	   7       <                	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	           <                               E     @  
+ 	 l                                                                                                          	          Ԁ           	           <                 
+                E     @  
 
- 	 l                                                                                                          	   0       Ԁ           	          <                               E     @  
+ 	 l                                                                                                          	   0       Ԁ           	          <                 
+                E     @  
 
  	 l                                                                                                          	          Ԁ           
-   JO A   A                        $0H`lx rmesh    
-   g -   -   Ѐ<                rmeshu  4     
-   h -   -   Ј<                rmeshu  4     
-   ai -   -   Ј<                rmeshu  4     
-    j -   -   Ј<                rmeshu  4     
-   j -   -   Ј<                rmeshu  4     
-   k -   -   Ј<                rmeshu  4     
-   Sl -   -   Ј<                rmeshu  4     
-   j A   A               ꆡ         $0H`lx rmesh       J/ <   <               
-         $0H`lx rmesh       j <   <               *Ѱ         $0H`lx rmesh       J7 <   <                JR         $0H`lx rmesh       j <   <               j߿         $0H`lx rmesh       J  <   <                H         $0H`lx rmesh       j <   <               0         $0H`lx rmesh       J  <   <               @ʒ         $0H`lx rmesh       j <   <               PK         $0H`lx rmesh    
\ No newline at end of file
+   JO A   A                        $0H`lx rmesh    
+   g -   -   Ѐ<                rmeshu  4     
+   h -   -   Ј<                rmeshu  4     
+   ai -   -   Ј<                rmeshu  4     
+    j -   -   Ј<                rmeshu  4     
+   j -   -   Ј<                rmeshu  4     
+   k -   -   Ј<                rmeshu  4     
+   Sl -   -   Ј<                rmeshu  4     
+   j A   A               ꆡ         $0H`lx rmesh       J/ <   <               
+         $0H`lx rmesh       j <   <               *Ѱ         $0H`lx rmesh       J7 <   <               JR         $0H`lx rmesh       j <   <                j߿         $0H`lx rmesh       J  <   <               H         $0H`lx rmesh       j <   <                         $0H`lx rmesh       J  <   <               0ʒ         $0H`lx rmesh       j <   <               @K         $0H`lx rmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-simplest-regression-test-1-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-simplest-regression-test-1-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-simplest-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-simplest-regression-test-1-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,778 +1,761 @@
 ò            i         <   <                           $0H`lx rmesh          >   >   Ѐ<                    $0H`lrmeshq   9u                 Ԁ                 <   <   Ѐ<                     $0H`lq   9u                  Ԁ                 >   >   Ѐ<                    $0H`lrmeshq   9u         g        Ԁ                 <   <   Ѐ<                     $0H`lq  9u                  Ԁ               O A   A                 JO         $0H`lx  rmesh        i A   A               0 i         $0H`lx Ormesh         A   A               0 j         $0H`lx jrmesh         A   A               @ 
-         $0H`lx rmesh       O A   A               @          $0H`lx rmesh       i A   A               P          $0H`lx rmesh        A   A               P 2         $0H`lx rmesh       (#  L   L          `                      
+         $0H`lx rmesh       O A   A               @          $0H`lx rmesh       i A   A               P          $0H`lx rmesh        A   A               P 2         $0H`lx rmesh       (#  N   N          `                       
 
-       S$  L   L          `                     
+       S$  N   N          `                      
 
-       %  E   E   Ѐ            p %                                    8%  ?   ?   Ѐ<                p                                 %        Ԁ              &  L   L   <                                       
+       %  E   E   Ѐ            p %                                    8%  ?   ?   Ѐ<                p                                 %        Ԁ              &  N   N   <                                         
      
-       &        Ԁ              '        <                                E      @  
+       &        Ԁ              '        <                                  E      @  
 
- 	 l                                                                                                             M(        Ԁ              K  L   L                                
+ 	 l                                                                                                             Q(        Ԁ              K  N   N                                 
 
-       K  L   L   <                                       
+       K  N   N   <                                        
      
-       L        Ԁ              
-M  L   L                               
+       L        Ԁ              M  N   N                                
 
-       O        <                                E      @  
+       	O        <                                 E      @  
 
- 	 l                                                                                                             O        Ԁ              P        <                                E     @  
+ 	 l                                                                                                             O        Ԁ              P        <                                  E     @  
 
- 	 l                                                                                                                     Ԁ                      <                                E     @  
+ 	 l                                                                                                                     Ԁ                      <                                  E     @  
 
- 	 l                                                                                                                     Ԁ                A   A                M         $0H`lx 3rmesh       O A   A                         $0H`lx Mrmesh              <                                E     @  
+ 	 l                                                                                                                     Ԁ                A   A                M         $0H`lx 3rmesh       O A   A                         $0H`lx Mrmesh              <                0                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                                E     @  
+ 	 l                                                                                                                    Ԁ                     <                0                 E     @  
 
- 	 l                                                                                                                    Ԁ              I       <                                E     @  
+ 	 l                                                                                                             '       Ԁ              I       <                @                 E     @  
 
- 	 l                                                                                                             0K       Ԁ              _L       <                                E     @  
+ 	 l                                                                                                             4K       Ԁ              gL       <                @                 E     @  
 
- 	 l                                                                                                             oL       Ԁ              @       <                                E     @  
+ 	 l                                                                                                             wL       Ԁ              @       <                P                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                                E     @  
+ 	 l                                                                                                                    Ԁ                     <                P                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                                E     @  
+ 	 l                                                                                                                    Ԁ                     <                `                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                                E     @  
+ 	 l                                                                                                                    Ԁ                     <                `                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                                    Ԁ                     <                p                 E     @  
 
- 	 l                                                                                                             Д       Ԁ                     <                               E     @  
+ 	 l                                                                                                             Ԕ       Ԁ                     <                p                 E     @  
 
- 	 l                                                                                                                    Ԁ              0W       <                                E     @  
+ 	 l                                                                                                                    Ԁ              0W       <                                 E     @  
 
- 	 l                                                                                                              X       Ԁ              X       <                                E     @  
+ 	 l                                                                                                             $X       Ԁ              Y       <                                 E     @  
 
- 	 l                                                                                                             Y       Ԁ                     <                0               E     @  
+ 	 l                                                                                                             Y       Ԁ                     <                                 E     @  
 
- 	 l                                                                                                             p       Ԁ              O       <                0               E     @  
+ 	 l                                                                                                             t       Ԁ              W       <                                 E     @  
 
- 	 l                                                                                                             _       Ԁ                     <                @               E   	  @  
+ 	 l                                                                                                             g       Ԁ                     <                                 E   	  @  
 
- 	 l                                                                                                                    Ԁ                     <                @               E   	  @  
+ 	 l                                                                                                                    Ԁ                     <                                 E   	  @  
 
- 	 l                                                                                                                    Ԁ                      <                P               E   
+ 	 l                                                                                                                    Ԁ                      <                                 E   
   @  
 
- 	 l                                                                                                                    Ԁ                     <                P               E   
+ 	 l                                                                                                                    Ԁ                     <                                 E   
   @  
 
- 	 l                                                                                                                    Ԁ              pd       <                `               E     @  
+ 	 l                                                                                                                    Ԁ              pd       <                                 E     @  
 
- 	 l                                                                                                             `e       Ԁ              ?f       <                `               E     @  
+ 	 l                                                                                                             de       Ԁ              Gf       <                                 E     @  
 
- 	 l                                                                                                             Of       Ԁ              i A   A               p3&         $0H`lx rmesh        A   A               pt'         $0H`lx &rmesh       '	       <                               E     @  
+ 	 l                                                                                                             Wf       Ԁ              i A   A                3&         $0H`lx rmesh        A   A                t'         $0H`lx &rmesh       '	       <                                 E     @  
 
- 	 l                                                                                                             (	       Ԁ              )	       <                               E     @  
+ 	 l                                                                                                             (	       Ԁ              )	       <                                 E     @  
 
- 	 l                                                                                                             )	       Ԁ              	       <                               E     @  
+ 	 l                                                                                                             )	       Ԁ              	       <                                 E     @  
 
- 	 l                                                                                                              	       Ԁ              	       <                               E     @  
+ 	 l                                                                                                             	       Ԁ              	       <                                 E     @  
 
- 	 l                                                                                                             	       Ԁ              `
-       <                               E     @  
+ 	 l                                                                                                             	       Ԁ              `
+       <                                 E     @  
 
- 	 l                                                                                                             P
-       Ԁ              /
-       <                               E     @  
+ 	 l                                                                                                             T
+       Ԁ              7
+       <                                 E     @  
 
- 	 l                                                                                                             ?
-       Ԁ              q       <                               E     @  
+ 	 l                                                                                                             G
+       Ԁ              q       <                                 E     @  
 
- 	 l                                                                                                             r       Ԁ              s       <                               E     @  
+ 	 l                                                                                                             r       Ԁ              s       <                                 E     @  
 
- 	 l                                                                                                             s       Ԁ               5       <                               E     @  
+ 	 l                                                                                                             s       Ԁ               5       <                                E     @  
 
- 	 l                                                                                                             5       Ԁ              6       <                               E     @  
+ 	 l                                                                                                             5       Ԁ              6       <                                E     @  
 
- 	 l                                                                                                             6       Ԁ              P       <                               E     @  
+ 	 l                                                                                                             6       Ԁ              P       <                                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                                    Ԁ                     <                                 E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                                    Ԁ                     <                0                E     @  
 
- 	 l                                                                                                             h       Ԁ                     <                               E     @  
+ 	 l                                                                                                             l       Ԁ              '       <                0                E     @  
 
- 	 l                                                                                                             /       Ԁ              ~       <                               E     @  
+ 	 l                                                                                                             7       Ԁ              ~       <                @                E     @  
 
- 	 l                                                                                                                    Ԁ              o       <                               E     @  
+ 	 l                                                                                                                    Ԁ              w       <                @                E     @  
 
- 	 l                                                                                                                    Ԁ                        <                                E     @  
+ 	 l                                                                                                                    Ԁ                        <                P                E     @  
 
- 	 l                                                                                                                      Ԁ                      <                                E     @  
+ 	 l                                                                                                                      Ԁ                      <                P                E     @  
 
- 	 l                                                                                                                     Ԁ              P        <                               E     @  
+ 	 l                                                                                                                     Ԁ              P        <                `                E     @  
 
- 	 l                                                                                                                     Ԁ                      <                               E     @  
+ 	 l                                                                                                                     Ԁ                      <                `                E     @  
 
- 	 l                                                                                                                     Ԁ                A   A                S.         $0H`lx u'rmesh       O A   A                
-/         $0H`lx .rmesh              <                0               E     @  
+ 	 l                                                                                                                     Ԁ                A   A                S.         $0H`lx u'rmesh       O A   A                
+/         $0H`lx .rmesh              <                p                E     @  
 
- 	 l                                                                                                             h       Ԁ                     <                0               E     @  
+ 	 l                                                                                                             l       Ԁ              '       <                p                E     @  
 
- 	 l                                                                                                             /       Ԁ              I       <                @               E     @  
+ 	 l                                                                                                             7       Ԁ              I       <                                E     @  
 
- 	 l                                                                                                             J       Ԁ              oK       <                @               E     @  
+ 	 l                                                                                                             J       Ԁ              wK       <                                E     @  
 
- 	 l                                                                                                             K       Ԁ              @       <                P               E     @  
+ 	 l                                                                                                             K       Ԁ              @       <                                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                P               E     @  
+ 	 l                                                                                                                    Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                `               E     @  
+ 	 l                                                                                                                    Ԁ                     <                                E     @  
 
- 	 l                                                                                                             X       Ԁ                     <                `               E     @  
+ 	 l                                                                                                             \       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                p               E     @  
+ 	 l                                                                                                             '       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ              7       <                p               E     @  
+ 	 l                                                                                                                    Ԁ              ?       <                                E     @  
 
- 	 l                                                                                                             G       Ԁ              0W       <                               E     @  
+ 	 l                                                                                                             O       Ԁ              0W       <                                E     @  
 
- 	 l                                                                                                             W       Ԁ              _X       <                               E     @  
+ 	 l                                                                                                             W       Ԁ              gX       <                                E     @  
 
- 	 l                                                                                                             oX       Ԁ                     <                               E     @  
+ 	 l                                                                                                             wX       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                     Ԁ                     <                               E     @  
+ 	 l                                                                                                             $       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                               E     @  
+ 	 l                                                                                                                    Ԁ                     <                                E     @  
 
- 	 l                                                                                                             p       Ԁ                     <                               E     @  
+ 	 l                                                                                                             t       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ                      <                               E     @  
+ 	 l                                                                                                                    Ԁ                      <                                E     @  
 
- 	 l                                                                                                                    Ԁ              O       <                               E     @  
+ 	 l                                                                                                             ġ       Ԁ              W       <                                E     @  
 
- 	 l                                                                                                             _       Ԁ              pd       <                               E     @  
+ 	 l                                                                                                             g       Ԁ              pd       <                                 E     @  
 
- 	 l                                                                                                             e       Ԁ              e       <                               E     @  
+ 	 l                                                                                                             e       Ԁ              e       <                                 E     @  
 
- 	 l                                                                                                             e       Ԁ              i A   A               s06         $0H`lx /rmesh        A   A               *6         $0H`lx 06rmesh       '	       <                               E      @  
+ 	 l                                                                                                             e       Ԁ              i A   A                s06         $0H`lx /rmesh        A   A                *6         $0H`lx 06rmesh       '	       <                                E      @  
 
- 	 l                                                                                                             `(	       Ԁ              (	       <                               E      @  
+ 	 l                                                                                                             d(	       Ԁ              (	       <                                E      @  
 
- 	 l                                                                                                             (	       Ԁ              	       <                               E   !  @  
+ 	 l                                                                                                             )	       Ԁ              	       <                                 E   !  @  
 
- 	 l                                                                                                             	       Ԁ              ?	       <                               E   !  @  
+ 	 l                                                                                                             	       Ԁ              G	       <                                 E   !  @  
 
- 	 l                                                                                                             O	       Ԁ              `
-       <                                E   "  @  
+ 	 l                                                                                                             W	       Ԁ              `
+       <                0                E   "  @  
 
- 	 l                                                                                                              
-       Ԁ              
-       <                                E   "  @  
+ 	 l                                                                                                             
+       Ԁ              
+       <                0                E   "  @  
 
- 	 l                                                                                                             
-       Ԁ              q       <                               E   #  @  
+ 	 l                                                                                                             
+       Ԁ              q       <                @                E   #  @  
 
- 	 l                                                                                                             Pr       Ԁ              r       <                               E   #  @  
+ 	 l                                                                                                             Tr       Ԁ              r       <                @                E   #  @  
 
- 	 l                                                                                                             r       Ԁ               5       <                                E   $  @  
+ 	 l                                                                                                             r       Ԁ               5       <                P                E   $  @  
 
- 	 l                                                                                                             5       Ԁ              6       <                                E   $  @  
+ 	 l                                                                                                             5       Ԁ              #6       <                P                E   $  @  
 
- 	 l                                                                                                             +6       Ԁ              P       <                0               E   %  @  
+ 	 l                                                                                                             36       Ԁ              P       <                `                E   %  @  
 
- 	 l                                                                                                                    Ԁ              W       <                0               E   %  @  
+ 	 l                                                                                                                    Ԁ              _       <                `                E   %  @  
 
- 	 l                                                                                                             g       Ԁ                     <                @               E   &  @  
+ 	 l                                                                                                             o       Ԁ                     <                p                E   &  @  
 
- 	 l                                                                                                             ,       Ԁ                     <                @               E   &  @  
+ 	 l                                                                                                             0       Ԁ                     <                p                E   &  @  
 
- 	 l                                                                                                                    Ԁ              ~       <                P               E   '  @  
+ 	 l                                                                                                                    Ԁ              ~       <                                E   '  @  
 
- 	 l                                                                                                             |       Ԁ                     <                P               E   '  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   '  @  
 
- 	 l                                                                                                                    Ԁ                        <                `               E   (  @  
+ 	 l                                                                                                                    Ԁ                        <                                E   (  @  
 
- 	 l                                                                                                                      Ԁ                      <                `               E   (  @  
+ 	 l                                                                                                                      Ԁ                      <                                E   (  @  
 
- 	 l                                                                                                                     Ԁ              P        <                p               E   )  @  
+ 	 l                                                                                                                     Ԁ              P        <                                E   )  @  
 
- 	 l                                                                                                                     Ԁ              W        <                p               E   )  @  
+ 	 l                                                                                                                     Ԁ              _        <                                E   )  @  
 
- 	 l                                                                                                             g        Ԁ                A   A               =         $0H`lx 6rmesh       O A   A               JX>         $0H`lx =rmesh              <                               E   *  @  
+ 	 l                                                                                                             o        Ԁ                A   A                =         $0H`lx 6rmesh       O A   A                JX>         $0H`lx =rmesh              <                                E   *  @  
 
- 	 l                                                                                                             ,       Ԁ                     <                               E   *  @  
+ 	 l                                                                                                             0       Ԁ                     <                                E   *  @  
 
- 	 l                                                                                                                    Ԁ              I       <                               E   +  @  
+ 	 l                                                                                                                    Ԁ              I       <                                E   +  @  
 
- 	 l                                                                                                             |J       Ԁ              J       <                               E   +  @  
+ 	 l                                                                                                             J       Ԁ              J       <                                E   +  @  
 
- 	 l                                                                                                             K       Ԁ              @       <                               E   ,  @  
+ 	 l                                                                                                             K       Ԁ              @       <                                E   ,  @  
 
- 	 l                                                                                                                    Ԁ              G       <                               E   ,  @  
+ 	 l                                                                                                                    Ԁ              O       <                                E   ,  @  
 
- 	 l                                                                                                             W       Ԁ                     <                               E   -  @  
+ 	 l                                                                                                             _       Ԁ                     <                                E   -  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   -  @  
+ 	 l                                                                                                                     Ԁ                     <                                E   -  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   .  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   .  @  
 
- 	 l                                                                                                             X       Ԁ              Ӕ       <                               E   .  @  
+ 	 l                                                                                                             \       Ԁ              ۔       <                                E   .  @  
 
- 	 l                                                                                                                    Ԁ              0W       <                               E   /  @  
+ 	 l                                                                                                                    Ԁ              0W       <                                 E   /  @  
 
- 	 l                                                                                                             W       Ԁ              X       <                               E   /  @  
+ 	 l                                                                                                             W       Ԁ              X       <                                 E   /  @  
 
- 	 l                                                                                                             X       Ԁ                     <                               E   0  @  
+ 	 l                                                                                                             'X       Ԁ                     <                                E   0  @  
 
- 	 l                                                                                                                    Ԁ              _       <                               E   0  @  
+ 	 l                                                                                                                    Ԁ              g       <                                E   0  @  
 
- 	 l                                                                                                             o       Ԁ                     <                                E   1  @  
+ 	 l                                                                                                             w       Ԁ                     <                                 E   1  @  
 
- 	 l                                                                                                             H       Ԁ                     <                                E   1  @  
+ 	 l                                                                                                             L       Ԁ                     <                                 E   1  @  
 
- 	 l                                                                                                                    Ԁ                      <                               E   2  @  
+ 	 l                                                                                                                    Ԁ                      <                0                E   2  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   2  @  
+ 	 l                                                                                                                    Ԁ                     <                0                E   2  @  
 
- 	 l                                                                                                                    Ԁ              pd       <                                E   3  @  
+ 	 l                                                                                                                    Ԁ              pd       <                @                E   3  @  
 
- 	 l                                                                                                             d       Ԁ              Oe       <                                E   3  @  
+ 	 l                                                                                                             d       Ԁ              We       <                @                E   3  @  
 
- 	 l                                                                                                             _e       Ԁ              i A   A               0rE         $0H`lx X>rmesh        A   A               0jE         $0H`lx sErmesh       '	       <                @               E   4  @  
+ 	 l                                                                                                             ge       Ԁ              i A   A                rE         $0H`lx X>rmesh        A   A                jE         $0H`lx sErmesh       '	       <                P                E   4  @  
 
- 	 l                                                                                                             8(	       Ԁ              (	       <                @               E   4  @  
+ 	 l                                                                                                             <(	       Ԁ              (	       <                P                E   4  @  
 
- 	 l                                                                                                             (	       Ԁ              	       <                P               E   5  @  
+ 	 l                                                                                                             (	       Ԁ              	       <                `                E   5  @  
 
- 	 l                                                                                                             	       Ԁ              	       <                P               E   5  @  
+ 	 l                                                                                                             	       Ԁ              	       <                `                E   5  @  
 
- 	 l                                                                                                             	       Ԁ              `
-       <                `               E   6  @  
+ 	 l                                                                                                             	       Ԁ              `
+       <                p                E   6  @  
 
- 	 l                                                                                                             خ
-       Ԁ              ?
-       <                `               E   6  @  
+ 	 l                                                                                                             ܮ
+       Ԁ              G
+       <                p                E   6  @  
 
- 	 l                                                                                                             O
-       Ԁ              q       <                p               E   7  @  
+ 	 l                                                                                                             W
+       Ԁ              q       <                                E   7  @  
 
- 	 l                                                                                                             (r       Ԁ              r       <                p               E   7  @  
+ 	 l                                                                                                             ,r       Ԁ              r       <                                E   7  @  
 
- 	 l                                                                                                             r       Ԁ               5       <                               E   8  @  
+ 	 l                                                                                                             r       Ԁ               5       <                                E   8  @  
 
- 	 l                                                                                                             p5       Ԁ              5       <                               E   8  @  
+ 	 l                                                                                                             p5       Ԁ              5       <                                E   8  @  
 
- 	 l                                                                                                             5       Ԁ              P       <                               E   9  @  
+ 	 l                                                                                                             5       Ԁ              P       <                                E   9  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   9  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   9  @  
 
- 	 l                                                                                                             /       Ԁ                     <                               E   :  @  
+ 	 l                                                                                                             /       Ԁ                     <                                E   :  @  
 
- 	 l                                                                                                                    Ԁ              o       <                               E   :  @  
+ 	 l                                                                                                                    Ԁ              o       <                                E   :  @  
 
- 	 l                                                                                                                    Ԁ              ~       <                               E   ;  @  
+ 	 l                                                                                                                    Ԁ              ~       <                                E   ;  @  
 
- 	 l                                                                                                             `       Ԁ                     <                               E   ;  @  
+ 	 l                                                                                                             `       Ԁ                     <                                E   ;  @  
 
- 	 l                                                                                                                    Ԁ                        <                               E   <  @  
+ 	 l                                                                                                                    Ԁ                        <                                E   <  @  
 
- 	 l                                                                                                             p         Ԁ                       <                               E   <  @  
+ 	 l                                                                                                             p         Ԁ                       <                                E   <  @  
 
- 	 l                                                                                                                      Ԁ              P        <                               E   =  @  
+ 	 l                                                                                                                      Ԁ              P        <                                E   =  @  
 
- 	 l                                                                                                                     Ԁ                      <                               E   =  @  
+ 	 l                                                                                                                     Ԁ                      <                                E   =  @  
 
- 	 l                                                                                                             /        Ԁ                A   A               M         $0H`lx Ermesh       O A   A               M         $0H`lx Mrmesh              <                               E   >  @  
+ 	 l                                                                                                             /        Ԁ                A   A                M         $0H`lx Ermesh       O A   A                M         $0H`lx Mrmesh              <                                E   >  @  
 
- 	 l                                                                                                                    Ԁ              o       <                               E   >  @  
+ 	 l                                                                                                                    Ԁ              o       <                                E   >  @  
 
- 	 l                                                                                                                    Ԁ              I       <                                E   ?  @  
+ 	 l                                                                                                                    Ԁ              I       <                                 E   ?  @  
 
- 	 l                                                                                                             `J       Ԁ              J       <                                E   ?  @  
+ 	 l                                                                                                             `J       Ԁ              J       <                                 E   ?  @  
 
- 	 l                                                                                                             J       Ԁ              @       <                               E   @  @  
+ 	 l                                                                                                             J       Ԁ              @       <                                E   @  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   @  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   @  @  
 
- 	 l                                                                                                                    Ԁ                     <                                E   A  @  
+ 	 l                                                                                                                    Ԁ                     <                                 E   A  @  
 
- 	 l                                                                                                                     Ԁ              _       <                                E   A  @  
+ 	 l                                                                                                                     Ԁ              _       <                                 E   A  @  
 
- 	 l                                                                                                             o       Ԁ                     <                0               E   B  @  
+ 	 l                                                                                                             o       Ԁ                     <                0                E   B  @  
 
- 	 l                                                                                                             L       Ԁ                     <                0               E   B  @  
+ 	 l                                                                                                             L       Ԁ                     <                0                E   B  @  
 
- 	 l                                                                                                                    Ԁ              0W       <                @               E   C  @  
+ 	 l                                                                                                                    Ԁ              0W       <                @                E   C  @  
 
- 	 l                                                                                                             W       Ԁ              W       <                @               E   C  @  
+ 	 l                                                                                                             W       Ԁ              W       <                @                E   C  @  
 
- 	 l                                                                                                             X       Ԁ                     <                P               E   D  @  
+ 	 l                                                                                                             X       Ԁ                     <                P                E   D  @  
 
- 	 l                                                                                                                    Ԁ              G       <                P               E   D  @  
+ 	 l                                                                                                                    Ԁ              G       <                P                E   D  @  
 
- 	 l                                                                                                             W       Ԁ                     <                `               E   E  @  
+ 	 l                                                                                                             W       Ԁ                     <                `                E   E  @  
 
- 	 l                                                                                                             <       Ԁ                     <                `               E   E  @  
+ 	 l                                                                                                             <       Ԁ                     <                `                E   E  @  
 
- 	 l                                                                                                                    Ԁ                      <                p               E   F  @  
+ 	 l                                                                                                                    Ԁ                      <                p                E   F  @  
 
- 	 l                                                                                                                    Ԁ                     <                p               E   F  @  
+ 	 l                                                                                                                    Ԁ                     <                p                E   F  @  
 
- 	 l                                                                                                                    Ԁ              pd       <                               E   G  @  
+ 	 l                                                                                                                    Ԁ              pd       <                                E   G  @  
 
- 	 l                                                                                                             d       Ԁ              7e       <                               E   G  @  
+ 	 l                                                                                                             d       Ԁ              7e       <                                E   G  @  
 
- 	 l                                                                                                             Ge       Ԁ              i A   A               T         $0H`lx Mrmesh        A   A               ;U         $0H`lx Trmesh       '	       <                               E   H  @  
+ 	 l                                                                                                             Ge       Ԁ              i A   A                T         $0H`lx Mrmesh        A   A                ;U         $0H`lx Trmesh       '	       <                                E   H  @  
 
- 	 l                                                                                                             ,(	       Ԁ              (	       <                               E   H  @  
+ 	 l                                                                                                             ,(	       Ԁ              (	       <                                E   H  @  
 
- 	 l                                                                                                             (	       Ԁ              	       <                               E   I  @  
+ 	 l                                                                                                             (	       Ԁ              	       <                                E   I  @  
 
- 	 l                                                                                                             |	       Ԁ              	       <                               E   I  @  
+ 	 l                                                                                                             |	       Ԁ              	       <                                E   I  @  
 
  	 l                                                                                                             	       Ԁ              `
-       <                               E   J  @  
+       <                                E   J  @  
 
  	 l                                                                                                             ̮
        Ԁ              '
-       <                               E   J  @  
+       <                                E   J  @  
 
  	 l                                                                                                             7
-       Ԁ              q       <                               E   K  @  
+       Ԁ              q       <                                E   K  @  
 
- 	 l                                                                                                             r       Ԁ              wr       <                               E   K  @  
+ 	 l                                                                                                             r       Ԁ              wr       <                                E   K  @  
 
- 	 l                                                                                                             r       Ԁ               5       <                               E   L  @  
+ 	 l                                                                                                             r       Ԁ               5       <                                E   L  @  
 
- 	 l                                                                                                             l5       Ԁ              5       <                               E   L  @  
+ 	 l                                                                                                             l5       Ԁ              5       <                                E   L  @  
 
- 	 l                                                                                                             5       Ԁ              P       <                               E   M  @  
+ 	 l                                                                                                             5       Ԁ              P       <                                E   M  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   M  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   M  @  
 
- 	 l                                                                                                             '       Ԁ                     <                                E   N  @  
+ 	 l                                                                                                             '       Ԁ                     <                                E   N  @  
 
- 	 l                                                                                                                    Ԁ              g       <                                E   N  @  
+ 	 l                                                                                                                    Ԁ              g       <                                E   N  @  
 
- 	 l                                                                                                             w       Ԁ              ~       <                               E   O  @  
+ 	 l                                                                                                             w       Ԁ              ~       <                                 E   O  @  
 
- 	 l                                                                                                             \       Ԁ                     <                               E   O  @  
+ 	 l                                                                                                             \       Ԁ                     <                                 E   O  @  
 
- 	 l                                                                                                                    Ԁ                        <                                E   P  @  
+ 	 l                                                                                                                    Ԁ                        <                                E   P  @  
 
- 	 l                                                                                                             l         Ԁ                       <                                E   P  @  
+ 	 l                                                                                                             l         Ԁ                       <                                E   P  @  
 
- 	 l                                                                                                                      Ԁ              P        <                0               E   Q  @  
+ 	 l                                                                                                                      Ԁ              P        <                                 E   Q  @  
 
- 	 l                                                                                                                     Ԁ                      <                0               E   Q  @  
+ 	 l                                                                                                                     Ԁ                      <                                 E   Q  @  
 
- 	 l                                                                                                             '        Ԁ                A   A               @V\         $0H`lx <Urmesh       O A   A               @\         $0H`lx V\rmesh              <                P               E   R  @  
+ 	 l                                                                                                             '        Ԁ                A   A               V\         $0H`lx <Urmesh       O A   A               \         $0H`lx V\rmesh              <                0                E   R  @  
 
- 	 l                                                                                                                    Ԁ              g       <                P               E   R  @  
+ 	 l                                                                                                                    Ԁ              g       <                0                E   R  @  
 
- 	 l                                                                                                             w       Ԁ              I       <                `               E   S  @  
+ 	 l                                                                                                             w       Ԁ              I       <                @                E   S  @  
 
- 	 l                                                                                                             \J       Ԁ              J       <                `               E   S  @  
+ 	 l                                                                                                             \J       Ԁ              J       <                @                E   S  @  
 
- 	 l                                                                                                             J       Ԁ              @       <                p               E   T  @  
+ 	 l                                                                                                             J       Ԁ              @       <                P                E   T  @  
 
- 	 l                                                                                                                    Ԁ                     <                p               E   T  @  
+ 	 l                                                                                                                    Ԁ                     <                P                E   T  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   U  @  
+ 	 l                                                                                                                    Ԁ                     <                `                E   U  @  
 
- 	 l                                                                                                                    Ԁ              W       <                               E   U  @  
+ 	 l                                                                                                                    Ԁ              W       <                `                E   U  @  
 
- 	 l                                                                                                             g       Ԁ                     <                               E   V  @  
+ 	 l                                                                                                             g       Ԁ                     <                p                E   V  @  
 
- 	 l                                                                                                             L       Ԁ                     <                               E   V  @  
+ 	 l                                                                                                             L       Ԁ                     <                p                E   V  @  
 
- 	 l                                                                                                                    Ԁ              0W       <                               E   W  @  
+ 	 l                                                                                                                    Ԁ              0W       <                                E   W  @  
 
- 	 l                                                                                                             W       Ԁ              W       <                               E   W  @  
+ 	 l                                                                                                             W       Ԁ              W       <                                E   W  @  
 
- 	 l                                                                                                             X       Ԁ                     <                               E   X  @  
+ 	 l                                                                                                             X       Ԁ                     <                                E   X  @  
 
- 	 l                                                                                                                    Ԁ              G       <                               E   X  @  
+ 	 l                                                                                                                    Ԁ              G       <                                E   X  @  
 
- 	 l                                                                                                             W       Ԁ                     <                               E   Y  @  
+ 	 l                                                                                                             W       Ԁ                     <                                E   Y  @  
 
- 	 l                                                                                                             <       Ԁ                     <                               E   Y  @  
+ 	 l                                                                                                             <       Ԁ                     <                                E   Y  @  
 
- 	 l                                                                                                                    Ԁ                      <                               E   Z  @  
+ 	 l                                                                                                                    Ԁ                      <                                E   Z  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   Z  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   Z  @  
 
- 	 l                                                                                                                    Ԁ              pd       <                               E   [  @  
+ 	 l                                                                                                                    Ԁ              pd       <                                E   [  @  
 
- 	 l                                                                                                             d       Ԁ              7e       <                               E   [  @  
+ 	 l                                                                                                             d       Ԁ              7e       <                                E   [  @  
 
- 	 l                                                                                                             Ge       Ԁ              i A   A               3c         $0H`lx \rmesh        A   A               }d         $0H`lx crmesh       '	       <                                E   \  @  
+ 	 l                                                                                                             Ge       Ԁ              i A   A                3c         $0H`lx \rmesh        A   A                }d         $0H`lx crmesh       '	       <                                E   \  @  
 
- 	 l                                                                                                             ,(	       Ԁ              (	       <                                E   \  @  
+ 	 l                                                                                                             ,(	       Ԁ              (	       <                                E   \  @  
 
- 	 l                                                                                                             (	       Ԁ              	       <                               E   ]  @  
+ 	 l                                                                                                             (	       Ԁ              	       <                                E   ]  @  
 
- 	 l                                                                                                             |	       Ԁ              	       <                               E   ]  @  
+ 	 l                                                                                                             |	       Ԁ              	       <                                E   ]  @  
 
  	 l                                                                                                             	       Ԁ              `
-       <                                E   ^  @  
+       <                                E   ^  @  
 
  	 l                                                                                                             ̮
        Ԁ              '
-       <                                E   ^  @  
+       <                                E   ^  @  
 
  	 l                                                                                                             7
-       Ԁ              q       <                0               E   _  @  
+       Ԁ              q       <                                 E   _  @  
 
- 	 l                                                                                                             r       Ԁ              wr       <                0               E   _  @  
+ 	 l                                                                                                             r       Ԁ              wr       <                                 E   _  @  
 
- 	 l                                                                                                             r       Ԁ               5       <                @               E   `  @  
+ 	 l                                                                                                             r       Ԁ               5       <                                E   `  @  
 
- 	 l                                                                                                             l5       Ԁ              5       <                @               E   `  @  
+ 	 l                                                                                                             l5       Ԁ              5       <                                E   `  @  
 
- 	 l                                                                                                             5       Ԁ              P       <                P               E   a  @  
+ 	 l                                                                                                             5       Ԁ              P       <                                 E   a  @  
 
- 	 l                                                                                                                    Ԁ                     <                P               E   a  @  
+ 	 l                                                                                                                    Ԁ                     <                                 E   a  @  
 
- 	 l                                                                                                             '       Ԁ                     <                `               E   b  @  
+ 	 l                                                                                                             '       Ԁ                     <                0                E   b  @  
 
- 	 l                                                                                                                    Ԁ              g       <                `               E   b  @  
+ 	 l                                                                                                                    Ԁ              g       <                0                E   b  @  
 
- 	 l                                                                                                             w       Ԁ              ~       <                p               E   c  @  
+ 	 l                                                                                                             w       Ԁ              ~       <                @                E   c  @  
 
- 	 l                                                                                                             \       Ԁ                     <                p               E   c  @  
+ 	 l                                                                                                             \       Ԁ                     <                @                E   c  @  
 
- 	 l                                                                                                                    Ԁ                        <                               E   d  @  
+ 	 l                                                                                                                    Ԁ                        <                P                E   d  @  
 
- 	 l                                                                                                             l         Ԁ                       <                               E   d  @  
+ 	 l                                                                                                             l         Ԁ                       <                P                E   d  @  
 
- 	 l                                                                                                                      Ԁ              P        <                               E   e  @  
+ 	 l                                                                                                                      Ԁ              P        <                `                E   e  @  
 
- 	 l                                                                                                                     Ԁ                      <                               E   e  @  
+ 	 l                                                                                                                     Ԁ                      <                `                E   e  @  
 
- 	 l                                                                                                             '        Ԁ                A   A               Sk         $0H`lx ~drmesh       O A   A               
-l         $0H`lx krmesh              <                               E   f  @  
+ 	 l                                                                                                             '        Ԁ                A   A               0Sk         $0H`lx ~drmesh       O A   A               0
+l         $0H`lx krmesh              <                p                E   f  @  
 
- 	 l                                                                                                                    Ԁ              g       <                               E   f  @  
+ 	 l                                                                                                                    Ԁ              g       <                p                E   f  @  
 
- 	 l                                                                                                             w       Ԁ              I E   E   Ѐ            %                                   J ?   ?   Ѐ<                                                J       Ԁ              K       <                               E   g  @  
+ 	 l                                                                                                             w       Ԁ              I E   E   Ѐ            @%                                   J ?   ?   Ѐ<                @                                J       Ԁ              K       <                                E   g  @  
 
- 	 l                                                                                                             yK       Ԁ              K       <                               E   g  @  
+ 	 l                                                                                                             yK       Ԁ              K       <                                E   g  @  
 
- 	 l                                                                                                             K       Ԁ              @       <                               E   h  @  
+ 	 l                                                                                                             K       Ԁ              @       <                                E   h  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   h  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   h  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   i  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   i  @  
 
- 	 l                                                                                                                    Ԁ              W       <                               E   i  @  
+ 	 l                                                                                                                    Ԁ              W       <                                E   i  @  
 
- 	 l                                                                                                             g       Ԁ                     <                                E   j  @  
+ 	 l                                                                                                             g       Ԁ                     <                                E   j  @  
 
- 	 l                                                                                                             L       Ԁ                     <                                E   j  @  
+ 	 l                                                                                                             L       Ԁ                     <                                E   j  @  
 
- 	 l                                                                                                                    Ԁ              0W       <                               E   k  @  
+ 	 l                                                                                                                    Ԁ              0W       <                                E   k  @  
 
- 	 l                                                                                                             W       Ԁ              W       <                               E   k  @  
+ 	 l                                                                                                             W       Ԁ              W       <                                E   k  @  
 
- 	 l                                                                                                             X       Ԁ                     <                                E   l  @  
+ 	 l                                                                                                             X       Ԁ                     <                                E   l  @  
 
- 	 l                                                                                                                    Ԁ              G       <                                E   l  @  
+ 	 l                                                                                                                    Ԁ              G       <                                E   l  @  
 
- 	 l                                                                                                             W       Ԁ                     <                0               E   m  @  
+ 	 l                                                                                                             W       Ԁ                     <                                E   m  @  
 
- 	 l                                                                                                             <       Ԁ                     <                0               E   m  @  
+ 	 l                                                                                                             <       Ԁ                     <                                E   m  @  
 
- 	 l                                                                                                                    Ԁ                      <                @               E   n  @  
+ 	 l                                                                                                                    Ԁ                      <                                E   n  @  
 
- 	 l                                                                                                                    Ԁ                     <                @               E   n  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   n  @  
 
- 	 l                                                                                                                    Ԁ              pd       <                P               E   o  @  
+ 	 l                                                                                                                    Ԁ              pd       <                                 E   o  @  
 
- 	 l                                                                                                             d       Ԁ              7e       <                P               E   o  @  
+ 	 l                                                                                                             d       Ԁ              7e       <                                 E   o  @  
 
- 	 l                                                                                                             Ge       Ԁ              i A   A               `s9s         $0H`lx lrmesh        A   A               `*s         $0H`lx 9srmesh       '	       <                p               E   p  @  
+ 	 l                                                                                                             Ge       Ԁ              i A   A               Ps9s         $0H`lx lrmesh        A   A               P*s         $0H`lx 9srmesh       '	       <                                E   p  @  
 
- 	 l                                                                                                             ,(	       Ԁ              (	       <                p               E   p  @  
+ 	 l                                                                                                             ,(	       Ԁ              (	       <                                E   p  @  
 
- 	 l                                                                                                             (	       Ԁ              	       <                               E   q  @  
+ 	 l                                                                                                             (	       Ԁ              	       <                                 E   q  @  
 
- 	 l                                                                                                             |	       Ԁ              	       <                               E   q  @  
+ 	 l                                                                                                             |	       Ԁ              	       <                                 E   q  @  
 
  	 l                                                                                                             	       Ԁ              `
-       <                               E   r  @  
+       <                0                E   r  @  
 
  	 l                                                                                                             ̮
        Ԁ              '
-       <                               E   r  @  
+       <                0                E   r  @  
 
  	 l                                                                                                             7
-       Ԁ              q       <                               E   s  @  
+       Ԁ              q       <                @                E   s  @  
 
- 	 l                                                                                                             r       Ԁ              wr       <                               E   s  @  
+ 	 l                                                                                                             r       Ԁ              wr       <                @                E   s  @  
 
- 	 l                                                                                                             r       Ԁ               5       <                               E   t  @  
+ 	 l                                                                                                             r       Ԁ               5       <                P                E   t  @  
 
- 	 l                                                                                                             l5       Ԁ              5       <                               E   t  @  
+ 	 l                                                                                                             l5       Ԁ              5       <                P                E   t  @  
 
- 	 l                                                                                                             5       Ԁ              P       <                               E   u  @  
+ 	 l                                                                                                             5       Ԁ              P       <                `                E   u  @  
 
- 	 l                                                                                                                    Ԁ                     <                               E   u  @  
+ 	 l                                                                                                                    Ԁ                     <                `                E   u  @  
 
- 	 l                                                                                                             '       Ԁ                     <                               E   v  @  
+ 	 l                                                                                                             '       Ԁ                     <                p                E   v  @  
 
- 	 l                                                                                                                    Ԁ              g       <                               E   v  @  
+ 	 l                                                                                                                    Ԁ              g       <                p                E   v  @  
 
- 	 l                                                                                                             w       Ԁ              ~       <                               E   w  @  
+ 	 l                                                                                                             w       Ԁ              ~       <                                E   w  @  
 
- 	 l                                                                                                             \       Ԁ                     <                               E   w  @  
+ 	 l                                                                                                             \       Ԁ                     <                                E   w  @  
 
- 	 l                                                                                                                    Ԁ                        <                               E   x  @  
+ 	 l                                                                                                                    Ԁ                        <                                E   x  @  
 
- 	 l                                                                                                             l         Ԁ                       <                               E   x  @  
+ 	 l                                                                                                             l         Ԁ                       <                                E   x  @  
 
- 	 l                                                                                                                      Ԁ              P        <                 	               E   y  @  
+ 	 l                                                                                                                      Ԁ              P        <                                E   y  @  
 
- 	 l                                                                                                                     Ԁ                      <                 	               E   y  @  
+ 	 l                                                                                                                     Ԁ                      <                                E   y  @  
 
- 	 l                                                                                                             '        Ԁ                A   A               	z         $0H`lx srmesh       O A   A               	Ja{         $0H`lx zrmesh              <                 	               E   z  @  
+ 	 l                                                                                                             '        Ԁ                A   A               `z         $0H`lx srmesh       O A   A               `Ja{         $0H`lx zrmesh              <                                E   z  @  
 
- 	 l                                                                                                                    Ԁ              g       <                 	               E   z  @  
+ 	 l                                                                                                                    Ԁ              g       <                                E   z  @  
 
- 	 l                                                                                                             w       Ԁ              I       <                0	               E   {  @  
+ 	 l                                                                                                             w       Ԁ              I       <                                E   {  @  
 
- 	 l                                                                                                             \J       Ԁ              J       <                0	               E   {  @  
+ 	 l                                                                                                             \J       Ԁ              J       <                                E   {  @  
 
- 	 l                                                                                                             J       Ԁ              @       <                @	               E   |  @  
+ 	 l                                                                                                             J       Ԁ              @       <                                E   |  @  
 
- 	 l                                                                                                                    Ԁ                     <                @	               E   |  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   |  @  
 
- 	 l                                                                                                                    Ԁ                     <                P	               E   }  @  
+ 	 l                                                                                                                    Ԁ                     <                                E   }  @  
 
- 	 l                                                                                                                    Ԁ              W       <                P	               E   }  @  
+ 	 l                                                                                                                    Ԁ              W       <                                E   }  @  
 
- 	 l                                                                                                             g       Ԁ                     <                `	               E   ~  @  
+ 	 l                                                                                                             g       Ԁ                     <                                E   ~  @  
 
- 	 l                                                                                                             L       Ԁ                     <                `	               E   ~  @  
+ 	 l                                                                                                             L       Ԁ                     <                                E   ~  @  
 
- 	 l                                                                                                                    Ԁ              0W       <                p	               E     @  
+ 	 l                                                                                                                    Ԁ              0W       <                                 E     @  
 
- 	 l                                                                                                             W       Ԁ              W       <                p	               E     @  
+ 	 l                                                                                                             W       Ԁ              W       <                                 E     @  
 
- 	 l                                                                                                             X       Ԁ                     <                	               E     @  
+ 	 l                                                                                                             X       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ              G       <                	               E     @  
+ 	 l                                                                                                                    Ԁ              G       <                                E     @  
 
- 	 l                                                                                                             W       Ԁ                     <                	               E     @  
+ 	 l                                                                                                             W       Ԁ                     <                                 E     @  
 
- 	 l                                                                                                             <       Ԁ                     <                	               E     @  
+ 	 l                                                                                                             <       Ԁ                     <                                 E     @  
 
- 	 l                                                                                                                    Ԁ                      <                	               E     @  
+ 	 l                                                                                                                    Ԁ                      <                0                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                	               E     @  
+ 	 l                                                                                                                    Ԁ                     <                0                E     @  
 
- 	 l                                                                                                                    Ԁ              pd       <                	               E     @  
+ 	 l                                                                                                                    Ԁ              pd       <                @                E     @  
 
- 	 l                                                                                                             d       Ԁ              7e       <                	               E     @  
+ 	 l                                                                                                             d       Ԁ              7e       <                @                E     @  
 
- 	 l                                                                                                             Ge       Ԁ              i A   A               	{         $0H`lx a{rmesh        A   A               	j         $0H`lx |rmesh       '	       <                	               E     @  
+ 	 l                                                                                                             Ge       Ԁ              i A   A               p{         $0H`lx a{rmesh        A   A               pj         $0H`lx |rmesh       '	       <                P                E     @  
 
- 	 l                                                                                                             ,(	       Ԁ              (	       <                	               E     @  
+ 	 l                                                                                                             ,(	       Ԁ              (	       <                P                E     @  
 
- 	 l                                                                                                             (	       Ԁ              	       <                	               E     @  
+ 	 l                                                                                                             (	       Ԁ              	       <                `                E     @  
 
- 	 l                                                                                                             |	       Ԁ              	       <                	               E     @  
+ 	 l                                                                                                             |	       Ԁ              	       <                `                E     @  
 
  	 l                                                                                                             	       Ԁ              `
-       <                	               E     @  
+       <                p                E     @  
 
  	 l                                                                                                             ̮
        Ԁ              '
-       <                	               E     @  
+       <                p                E     @  
 
  	 l                                                                                                             7
-       Ԁ              q       <                 
-               E     @  
+       Ԁ              q       <                                E     @  
 
- 	 l                                                                                                             r       Ԁ              wr       <                 
-               E     @  
+ 	 l                                                                                                             r       Ԁ              wr       <                                E     @  
 
- 	 l                                                                                                             r       Ԁ               5       <                
-               E     @  
+ 	 l                                                                                                             r       Ԁ               5       <                                E     @  
 
- 	 l                                                                                                             l5       Ԁ              5       <                
-               E     @  
+ 	 l                                                                                                             l5       Ԁ              5       <                                E     @  
 
- 	 l                                                                                                             5       Ԁ              P       <                 
-               E     @  
+ 	 l                                                                                                             5       Ԁ              P       <                                E     @  
 
- 	 l                                                                                                                    Ԁ                     <                 
-               E     @  
+ 	 l                                                                                                                    Ԁ                     <                                E     @  
 
- 	 l                                                                                                             '       Ԁ                     <                0
-               E     @  
+ 	 l                                                                                                             '       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ              g       <                0
-               E     @  
+ 	 l                                                                                                                    Ԁ              g       <                                E     @  
 
- 	 l                                                                                                             w       Ԁ              ~       <                @
-               E     @  
+ 	 l                                                                                                             w       Ԁ              ~       <                                E     @  
 
- 	 l                                                                                                             \       Ԁ                     <                @
-               E     @  
+ 	 l                                                                                                             \       Ԁ                     <                                E     @  
 
- 	 l                                                                                                                    Ԁ           	             <                P
-               E     @  
+ 	 l                                                                                                                    Ԁ           	             <                                E     @  
 
- 	 l                                                                                                          	   l         Ԁ           	            <                P
-               E     @  
+ 	 l                                                                                                          	   l         Ԁ           	            <                                E     @  
 
- 	 l                                                                                                          	            Ԁ           	   P        <                `
-               E     @  
+ 	 l                                                                                                          	            Ԁ           	   P        <                                E     @  
 
- 	 l                                                                                                          	           Ԁ           	           <                `
-               E     @  
+ 	 l                                                                                                          	           Ԁ           	           <                                E     @  
 
- 	 l                                                                                                          	   '        Ԁ           	     A   A               p
-         $0H`lx rmesh    	   O A   A               p
-         $0H`lx rmesh    	          <                
-               E     @  
+ 	 l                                                                                                          	   '        Ԁ           	     A   A                        $0H`lx rmesh    	   O A   A                        $0H`lx rmesh    	          <                                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   g       <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	   g       <                                E     @  
 
- 	 l                                                                                                          	   w       Ԁ           	   I       <                
-               E     @  
+ 	 l                                                                                                          	   w       Ԁ           	   I       <                 	                E     @  
 
- 	 l                                                                                                          	   \J       Ԁ           	   J       <                
-               E     @  
+ 	 l                                                                                                          	   \J       Ԁ           	   J       <                 	                E     @  
 
- 	 l                                                                                                          	   J       Ԁ           	   @       <                
-               E     @  
+ 	 l                                                                                                          	   J       Ԁ           	   @       <                	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	          <                	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	          <                 	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   W       <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	   W       <                 	                E     @  
 
- 	 l                                                                                                          	   g       Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	   g       Ԁ           	          <                0	                E     @  
 
- 	 l                                                                                                          	   L       Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	   L       Ԁ           	          <                0	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   0W       <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	   0W       <                @	                E     @  
 
- 	 l                                                                                                          	   W       Ԁ           	   W       <                
-               E     @  
+ 	 l                                                                                                          	   W       Ԁ           	   W       <                @	                E     @  
 
- 	 l                                                                                                          	   X       Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	   X       Ԁ           	          <                P	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   G       <                
-               E     @  
+ 	 l                                                                                                          	          Ԁ           	   G       <                P	                E     @  
 
- 	 l                                                                                                          	   W       Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	   W       Ԁ           	          <                `	                E     @  
 
- 	 l                                                                                                          	   <       Ԁ           	          <                
-               E     @  
+ 	 l                                                                                                          	   <       Ԁ           	          <                `	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	           <                                E     @  
+ 	 l                                                                                                          	          Ԁ           	           <                p	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	          <                                E     @  
+ 	 l                                                                                                          	          Ԁ           	          <                p	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   pd       <                               E     @  
+ 	 l                                                                                                          	          Ԁ           	   pd       <                	                E     @  
 
- 	 l                                                                                                          	   d       Ԁ           	   7e       <                               E     @  
+ 	 l                                                                                                          	   d       Ԁ           	   7e       <                	                E     @  
 
- 	 l                                                                                                          	   Ge       Ԁ           	   i A   A                         $0H`lx rmesh    	    A   A                D         $0H`lx rmesh    	   '	       <                0               E     @  
+ 	 l                                                                                                          	   Ge       Ԁ           	   i A   A                        $0H`lx rmesh    	    A   A               D         $0H`lx rmesh    	   '	       <                	                E     @  
 
- 	 l                                                                                                          	   ,(	       Ԁ           	   (	       <                0               E     @  
+ 	 l                                                                                                          	   ,(	       Ԁ           	   (	       <                	                E     @  
 
- 	 l                                                                                                          	   (	       Ԁ           	   	       <                @               E     @  
+ 	 l                                                                                                          	   (	       Ԁ           	   	       <                	                E     @  
 
- 	 l                                                                                                          	   |	       Ԁ           	   	       <                @               E     @  
+ 	 l                                                                                                          	   |	       Ԁ           	   	       <                	                E     @  
 
  	 l                                                                                                          	   	       Ԁ           	   `
-       <                P               E     @  
+       <                	                E     @  
 
  	 l                                                                                                          	   ̮
        Ԁ           	   '
-       <                P               E     @  
+       <                	                E     @  
 
  	 l                                                                                                          	   7
-       Ԁ           	   q       <                `               E     @  
+       Ԁ           	   q       <                	                E     @  
 
- 	 l                                                                                                          	   r       Ԁ           	   wr       <                `               E     @  
+ 	 l                                                                                                          	   r       Ԁ           	   wr       <                	                E     @  
 
- 	 l                                                                                                          	   r       Ԁ           	    5       <                p               E     @  
+ 	 l                                                                                                          	   r       Ԁ           	    5       <                	                E     @  
 
- 	 l                                                                                                          	   l5       Ԁ           	   5       <                p               E     @  
+ 	 l                                                                                                          	   l5       Ԁ           	   5       <                	                E     @  
 
- 	 l                                                                                                          	   5       Ԁ           	   P       <                               E     @  
+ 	 l                                                                                                          	   5       Ԁ           	   P       <                	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	          <                               E     @  
+ 	 l                                                                                                          	          Ԁ           	          <                	                E     @  
 
- 	 l                                                                                                          	   '       Ԁ           	          <                               E     @  
+ 	 l                                                                                                          	   '       Ԁ           	          <                	                E     @  
 
- 	 l                                                                                                          	          Ԁ           	   g       <                               E     @  
+ 	 l                                                                                                          	          Ԁ           	   g       <                	                E     @  
 
- 	 l                                                                                                          	   w       Ԁ           	   ~       <                               E     @  
+ 	 l                                                                                                          	   w       Ԁ           	   ~       <                 
+                E     @  
 
- 	 l                                                                                                          	   \       Ԁ           	          <                               E     @  
+ 	 l                                                                                                          	   \       Ԁ           	          <                 
+                E     @  
 
  	 l                                                                                                          	          Ԁ           
-             <                               E     @  
+             <                
+                E     @  
 
  	 l                                                                                                          
-            <                               E     @  
+            <                
+                E     @  
 
  	 l                                                                                                          
-   U        <                               E     @  
+   U        <                
+                E     @  
 
  	 l                                                                                                          
-           <                               E     @  
+           <                
+                E     @  
 
  	 l                                                                                                          
-           <                               E     @  
+           <                
+                E     @  
 
  	 l                                                                                                          
-   ~        <                               E     @  
+           <                
+                E     @  
 
  	 l                                                                                                          
-   a.        <                               E     @  
+   i.        <                
+                E     @  
 
  	 l                                                                                                          
-   P        <                               E     @  
+   P        <                 
+                E     @  
 
  	 l                                                                                                          
-           <                               E     @  
+           <                 
+                E     @  
 
  	 l                                                                                                          
-   "        <                               E     @  
+   *        <                 
+                E     @  
 
  	 l                                                                                                          
-     A   A               _         $0H`lx Ermesh    
-           <                               E     @  
+     A   A               _         $0H`lx Ermesh    
+           <                 
+                E     @  
 
  	 l                                                                                                          
-   $        <                               E     @  
+   :        <                 
+                E     @  
 
  	 l                                                                                                          
-   [        <                               E     @  
+   u        <                 
+                E     @  
 
  	 l                                                                                                          
-   K        <                               E     @  
+   i        <                 
+                E     @  
 
  	 l                                                                                                          
-   l  -   -   Ѐ<                rmeshu  4     
-   c  -   -   Ј<                rmeshu  4     
-   Z  -   -   Ј<                rmeshu  4     
-   6  -   -   Ј<                rmeshu  4     
-   $  -   -   Ј<                rmeshu  4     
-     -   -   Ј<                rmeshu  4     
-     -   -   Ј<                rmeshu  4     
-    E   E   Ѐ            %                                 
-    E   E   Ѐ             %                                 
-   a <   <               3         $0H`lx rmesh    
-    E   E   Ѐ             %                                      <   <               0Sm         $0H`lx rmesh       a <   <               @s:         $0H`lx rmesh       `D E   E   Ѐ            P%                                      <   <               `         $0H`lx rmesh       u <   <               p         $0H`lx rmesh        5 E   E   Ѐ            %                                      E   E   Ѐ            %           	                           <   <               Y         $0H`lx rmesh        <   <                        $0H`lx rmesh       r	 E   E   Ѐ            %           
-                           <   <                        $0H`lx rmesh        E   E   Ѐ            %   	                                 u <   <               3         $0H`lx rmesh    
\ No newline at end of file
+     -   -   Ѐ<                rmeshu  4     
+     -   -   Ј<                rmeshu  4     
+   |  -   -   Ј<                rmeshu  4     
+   X  -   -   Ј<                rmeshu  4     
+   F  -   -   Ј<                rmeshu  4     
+     -   -   Ј<                rmeshu  4     
+     -   -   Ј<                rmeshu  4     
+    E   E   Ѐ            %                                 
+    E   E   Ѐ            %                                 
+   a <   <               3         $0H`lx rmesh    
+    E   E   Ѐ            %                                      <   <                Sm         $0H`lx rmesh       a <   <               s:         $0H`lx rmesh       `D E   E   Ѐ             %                                      <   <               0         $0H`lx rmesh       u <   <               @         $0H`lx rmesh        5 E   E   Ѐ            P%                                      E   E   Ѐ            `%           	                           <   <               pY         $0H`lx rmesh        <   <                        $0H`lx rmesh       r	 E   E   Ѐ            %           
+                           <   <                        $0H`lx rmesh        E   E   Ѐ            %   	                                 u <   <               3         $0H`lx rmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression.cc ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression.cc
--- ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression.cc	2015-09-15 11:18:44.000000000 -0700
@@ -44,7 +44,10 @@
 
 HwmpDoRfRegressionTest::HwmpDoRfRegressionTest () : TestCase ("HWMP target flags regression test"),
                                                     m_nodes (0),
-                                                    m_time (Seconds (5))
+                                                    m_time (Seconds (5)),
+                                                    m_sentPktsCounterA (0),
+                                                    m_sentPktsCounterB (0),
+                                                    m_sentPktsCounterC (0)
 {
 }
 
@@ -52,6 +55,7 @@
 {
   delete m_nodes;
 }
+
 void
 HwmpDoRfRegressionTest::DoRun ()
 {
@@ -69,6 +73,7 @@
 
   delete m_nodes, m_nodes = 0;
 }
+
 void
 HwmpDoRfRegressionTest::CreateNodes ()
 {
@@ -85,38 +90,45 @@
   mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (*m_nodes);
 }
+
 void
 HwmpDoRfRegressionTest::InstallApplications ()
 {
-  UdpEchoServerHelper echoServer (9);
-  ApplicationContainer serverApps = echoServer.Install (m_nodes->Get (0));
-  serverApps.Start (Seconds (0.0));
-  serverApps.Stop (m_time);
-  UdpEchoClientHelper echoClient (m_interfaces.GetAddress (0), 9);
-  echoClient.SetAttribute ("MaxPackets", UintegerValue (300));
-  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
-  echoClient.SetAttribute ("PacketSize", UintegerValue (100));
-  //Install first client
-  ApplicationContainer clientApps = echoClient.Install (m_nodes->Get (1));
-  clientApps.Start (Seconds (2.2));
-  clientApps.Stop (m_time);
-  //Install second client
-  clientApps = echoClient.Install (m_nodes->Get (2));
-  clientApps.Start (Seconds (2.0));
-  clientApps.Stop (m_time);
-  //Install second server and attach client to it:
-  UdpEchoServerHelper echoServer1 (10);
-  serverApps = echoServer1.Install (m_nodes->Get (3));
-  serverApps.Start (Seconds (0.0));
-  serverApps.Stop (m_time);
-  UdpEchoClientHelper echoClient1 (m_interfaces.GetAddress (3), 10);
-  echoClient1.SetAttribute ("MaxPackets", UintegerValue (300));
-  echoClient1.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
-  echoClient1.SetAttribute ("PacketSize", UintegerValue (100));
-  clientApps = echoClient1.Install (m_nodes->Get (0));
-  clientApps.Start (Seconds (2.4));
-  clientApps.Stop (m_time);
+  // server socket A
+  m_serverSocketA = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_serverSocketA->Bind (InetSocketAddress (Ipv4Address::GetAny (), 9));
+  m_serverSocketA->SetRecvCallback (MakeCallback (&HwmpDoRfRegressionTest::HandleReadServer, this));
+
+  // server socket B
+  m_serverSocketB = Socket::CreateSocket (m_nodes->Get (3), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_serverSocketB->Bind (InetSocketAddress (Ipv4Address::GetAny (), 10));
+  m_serverSocketB->SetRecvCallback (MakeCallback (&HwmpDoRfRegressionTest::HandleReadServer, this));
+
+  // client socket A
+  m_clientSocketA = Socket::CreateSocket (m_nodes->Get (1), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_clientSocketA->Bind ();
+  m_clientSocketA->Connect (InetSocketAddress (m_interfaces.GetAddress (0), 9));
+  m_clientSocketA->SetRecvCallback (MakeCallback (&HwmpDoRfRegressionTest::HandleReadClient, this));
+  Simulator::ScheduleWithContext (m_clientSocketA->GetNode ()->GetId (), Seconds (2.2),
+                                  &HwmpDoRfRegressionTest::SendDataA, this, m_clientSocketA);
+
+  // client socket B
+  m_clientSocketB = Socket::CreateSocket (m_nodes->Get (2), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_clientSocketB->Bind ();
+  m_clientSocketB->Connect (InetSocketAddress (m_interfaces.GetAddress (0), 9));
+  m_clientSocketB->SetRecvCallback (MakeCallback (&HwmpDoRfRegressionTest::HandleReadClient, this));
+  Simulator::ScheduleWithContext (m_clientSocketB->GetNode ()->GetId (), Seconds (2.0),
+                                  &HwmpDoRfRegressionTest::SendDataB, this, m_clientSocketB);
+
+  // client socket C
+  m_clientSocketB = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_clientSocketB->Bind ();
+  m_clientSocketB->Connect (InetSocketAddress (m_interfaces.GetAddress (3), 10));
+  m_clientSocketB->SetRecvCallback (MakeCallback (&HwmpDoRfRegressionTest::HandleReadClient, this));
+  Simulator::ScheduleWithContext (m_clientSocketB->GetNode ()->GetId (), Seconds (2.4),
+                                  &HwmpDoRfRegressionTest::SendDataC, this, m_clientSocketB);
 }
+
 void
 HwmpDoRfRegressionTest::CreateDevices ()
 {
@@ -160,3 +172,62 @@
     }
 }
 
+void
+HwmpDoRfRegressionTest::SendDataA (Ptr<Socket> socket)
+{
+  if ((Simulator::Now () < m_time) && (m_sentPktsCounterA < 300))
+    {
+      socket->Send (Create<Packet> (100));
+      m_sentPktsCounterA ++;
+      Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (1.0),
+                                      &HwmpDoRfRegressionTest::SendDataA, this, socket);
+    }
+}
+
+void
+HwmpDoRfRegressionTest::SendDataB (Ptr<Socket> socket)
+{
+  if ((Simulator::Now () < m_time) && (m_sentPktsCounterA < 300))
+    {
+      socket->Send (Create<Packet> (100));
+      m_sentPktsCounterB ++;
+      Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (1.0),
+                                      &HwmpDoRfRegressionTest::SendDataB, this, socket);
+    }
+}
+
+void
+HwmpDoRfRegressionTest::SendDataC (Ptr<Socket> socket)
+{
+  if ((Simulator::Now () < m_time) && (m_sentPktsCounterA < 300))
+    {
+      socket->Send (Create<Packet> (100));
+      m_sentPktsCounterC ++;
+      Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (1.0),
+                                      &HwmpDoRfRegressionTest::SendDataC, this, socket);
+    }
+}
+
+void
+HwmpDoRfRegressionTest::HandleReadServer (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+      packet->RemoveAllPacketTags ();
+      packet->RemoveAllByteTags ();
+
+      socket->SendTo (packet, 0, from);
+    }
+}
+
+void
+HwmpDoRfRegressionTest::HandleReadClient (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+    }
+}
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression.h ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression.h
--- ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression.h	2015-09-15 11:18:44.000000000 -0700
@@ -84,5 +84,59 @@
   void CreateDevices ();
   void InstallApplications ();
   void ResetPosition ();
+
+  /// Server-side socket
+  Ptr<Socket> m_serverSocketA;
+  /// Server-side socket
+  Ptr<Socket> m_serverSocketB;
+  /// Client-side socket
+  Ptr<Socket> m_clientSocketA;
+  /// Client-side socket
+  Ptr<Socket> m_clientSocketB;
+  /// Client-side socket
+  Ptr<Socket> m_clientSocketC;
+
+  // sent packets counter A
+  uint32_t m_sentPktsCounterA;
+  // sent packets counter B
+  uint32_t m_sentPktsCounterB;
+  // sent packets counter C
+  uint32_t m_sentPktsCounterC;
+
+  /**
+   * Send data A
+   * \param socket the sending socket
+   */
+  void SendDataA (Ptr<Socket> socket);
+
+  /**
+   * Send data B
+   * \param socket the sending socket
+   */
+  void SendDataB (Ptr<Socket> socket);
+
+  /**
+   * Send data C
+   * \param socket the sending socket
+   */
+  void SendDataC (Ptr<Socket> socket);
+
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
+  void HandleReadServer (Ptr<Socket> socket);
+
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
+  void HandleReadClient (Ptr<Socket> socket);
 };
 
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-0-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression-test-0-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression-test-0-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,108 +1,108 @@
 ò            i       &  >   >   Ѐ<                    $0H`lrmeshq   9u         )        Ԁ                       Ԁ                 <   <   Ѐ<                     $0H`lq  9u            A   A                           $0H`lx  rmesh        %  >   >   Ѐ<                    $0H`lrmeshq   9u                 Ԁ               X  <   <   Ѐ<                0    $0H`lq  9u          h        Ԁ               >  >   >   Ѐ<                @   $0H`lrmeshq  9u         N        Ԁ                 <   <   Ѐ<                     $0H`lq  9u          @        Ԁ               JO A   A                 JO         $0H`lx  rmesh        +b F   F               P a         $0H`lx
  7Ormesh        j A   A               0 j         $0H`lx brmesh         F   F               `          $0H`lx
  rmesh       JO A   A               @          $0H`lx rmesh       +b F   F               p          $0H`lx
- zrmesh       j A   A               P 2         $0H`lx rmesh         L   L                               
+ zrmesh       j A   A               P 2         $0H`lx rmesh         N   N                                
 
-         L   L          `                     
+         N   N          `                      
 
-         E   E   Ѐ            p %                                      E   E   Ѐ             %                                         Ԁ              =  ?   ?   Ѐ<                                              M        Ԁ                L   L   <                                       
+         E   E   Ѐ            p %                                      E   E   Ѐ             %                                         Ԁ              =  ?   ?   Ѐ<                                              M        Ԁ                N   N   <                                         
      
-       a        Ԁ                L   L   <                                      
+       a        Ԁ                N   N   <                                        
      
-               Ԁ              4        <                               E      @  
+               Ԁ              <        <                                 E      @  
 
- 	 l                                                                                                             D        Ԁ                L   L                                
+ 	 l                                                                                                             L        Ԁ                N   N                                 
 
-         L   L                               
+         N   N                                
 
-               Ԁ                 L   L   <                                      
+               Ԁ                 N   N   <                                       
      
-                Ԁ              G!        <                                E      @  
+                Ԁ              O!        <                                 E      @  
 
- 	 l                                                                                                             "        Ԁ              #        <                               E      @  
+ 	 l                                                                                                             "        Ԁ              #        <                                E      @  
 
- 	 l                                                                                                               F   F                E         $0H`lx
- 3rmesh       JO A   A                         $0H`lx Ermesh       0 L   L                               
+ 	 l                                                                                                               F   F                E         $0H`lx
+ 3rmesh       JO A   A                         $0H`lx Ermesh       0 N   N                                 
 
-       1 L   L   <                                       
+       1 N   N   <                                         
      
-       1       Ԁ              2 L   L                               
+       1       Ԁ              2 N   N                                
 
-       p4       <                                E      @  
+       t4       <                                  E      @  
 
- 	 l                                                                                                             4       Ԁ              X8 L   L                                
+ 	 l                                                                                                             4       Ԁ              \8 N   N                                 
 
-       9 L   L   <                0                      
+       9 N   N   <                0                        
      
-       9       Ԁ              : L   L          @                    
+       9       Ԁ              : N   N                                
 
-       ;       <                                E      @  
+       ;       <                0                 E      @  
 
- 	 l                                                                                                             <       Ԁ              g L   L                                
+ 	 l                                                                                                             <       Ԁ              g N   N                                 
 
-        L   L          P                    
+        N   N                                
 
-       O$       Ԁ              % E   E   Ѐ            `%              ,                  % ?   ?   Ѐ<                                                &       Ԁ              .' ?   ?   Ѐ<                p                             ( L   L   <                                     
+       O$       Ԁ              % E   E   Ѐ             %              ,                  % ?   ?   Ѐ<                                                 &       Ԁ              .' ?   ?   Ѐ<                                             ( N   N   <                @                       
      
-       (       Ԁ              Q)       <                                E      @  
+       (       Ԁ              Q)       <                @                 E      @  
 
  
- l                                                                                                             *       Ԁ              >,       <                              E      @  
+ l                                                                                                             *       Ԁ              F,       <                                 E      @  
 
  
- l                                                                                                             f0 L   L                              
+ l                                                                                                             r0 N   N                                
 
-       0 L   L   <                0                      
+       0 N   N   <                P                        
      
-       M1       Ԁ              2 L   L   <                                     
+       Y1       Ԁ              2 N   N   <                0                       
      
-       2 L   L          @                    
+       2 N   N                                
 
-       J7       Ԁ              y8       <                              E      @  
+       ^7       Ԁ              8       <                P                E      @  
 
  
- l                                                                                                             8       Ԁ              +b F   F               3&         $0H`lx
- &rmesh       j A   A               Pt'         $0H`lx &rmesh       @        Ԁ              o        <                              E     @  
+ l                                                                                                             8       Ԁ              +b F   F               03&         $0H`lx
+ &rmesh       j A   A                t'         $0H`lx &rmesh       D        Ԁ              w        <                `                E     @  
 
- 	 l                                                                                                                     Ԁ                      <                `               E     @  
+ 	 l                                                                                                                     Ԁ                      <                `                 E     @  
 
- 	 l                                                                                                                     Ԁ                      <                              E     @  
+ 	 l                                                                                                             #        Ԁ                      <                @                E     @  
 
- 	 l                                                                                                               F   F                S.         $0H`lx
- ].u'rmesh       JO A   A               p
-/         $0H`lx .rmesh              <                               E     @  
+ 	 l                                                                                                               F   F               @S.         $0H`lx
+ ].u'rmesh       JO A   A                
+/         $0H`lx .rmesh              <                p                 E     @  
 
- 	 l                                                                                                                    Ԁ              [       <                               E     @  
+ 	 l                                                                                                                    Ԁ              _       <                p                 E     @  
 
- 	 l                                                                                                             K       Ԁ                     <                               E     @  
+ 	 l                                                                                                             S       Ԁ                     <                                 E     @  
 
  
- l                                                                                                             p       Ԁ                     <                               E     @  
+ l                                                                                                             t       Ԁ                     <                P                E     @  
 
  
- l                                                                                                             /!       Ԁ              V"       <                0              E     @  
+ l                                                                                                             C!       Ԁ              n"       <                                E     @  
 
  
- l                                                                                                             f"       Ԁ              +b F   F               @s(6         $0H`lx
- 5/rmesh       j A   A               *6         $0H`lx (6rmesh       @        Ԁ                      <                P              E     @  
+ l                                                                                                             ~"       Ԁ              +b F   F               Ps(6         $0H`lx
+ 5/rmesh       j A   A               *6         $0H`lx (6rmesh       D        Ԁ              '        <                                E     @  
 
- 	 l                                                                                                             /        Ԁ                      <                               E     @  
+ 	 l                                                                                                             7        Ԁ                      <                                 E     @  
 
- 	 l                                                                                                             w        Ԁ                      <                `              E     @  
+ 	 l                                                                                                                     Ԁ                      <                `                E     @  
 
- 	 l                                                                                                               F   F               p=         $0H`lx
- =6rmesh       JO A   A               JX>         $0H`lx =rmesh              <                               E     @  
+ 	 l                                                                                                               F   F               `=         $0H`lx
+ =6rmesh       JO A   A                JX>         $0H`lx =rmesh              <                                 E     @  
 
- 	 l                                                                                                                    Ԁ              [       <                               E     @  
+ 	 l                                                                                                                    Ԁ              _       <                                 E     @  
 
- 	 l                                                                                                             K       Ԁ                     <                               E     @  
+ 	 l                                                                                                             S       Ԁ                     <                                 E     @  
 
  
- l                                                                                                             p       Ԁ              O       <                              E     @  
+ l                                                                                                             t       Ԁ              W       <                p                E     @  
 
  
- l                                                                                                                     Ԁ              !       <                              E     @  
+ l                                                                                                                     Ԁ              !       <                                E     @  
 
  
- l                                                                                                             !       Ԁ              +b F   F               jE         $0H`lx
- @EX>rmesh       j A   A               jE         $0H`lx kErmesh    
\ No newline at end of file
+ l                                                                                                             !       Ԁ              +b F   F               pjE         $0H`lx
+ @EX>rmesh       j A   A               0jE         $0H`lx kErmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-1-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression-test-1-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression-test-1-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -4,155 +4,154 @@
  fbrmesh         F   F               `          $0H`lx
  rmesh       O A   A               @          $0H`lx rmesh       7 F   F               p y         $0H`lx
  rmesh       a F   F               p          $0H`lx
- zrmesh        A   A               P 2         $0H`lx rmesh         L   L                                
+ zrmesh        A   A               P 2         $0H`lx rmesh         N   N                                 
 
-       3  L   L                               
+       3  N   N                                
 
-       ^  L   L          `                     
+       ^  N   N          `                      
 
-       !  E   E   Ѐ            p %                                    p  E   E   Ѐ             %                                 s  ?   ?   Ѐ<                                                         Ԁ                ?   ?   Ѐ<                                              z        Ԁ              %  L   L   <                                       
+       !  E   E   Ѐ            p %                                    p  E   E   Ѐ             %                                 s  ?   ?   Ѐ<                                                         Ԁ                ?   ?   Ѐ<                                              z        Ԁ              %  N   N   <                                         
      
-       5        Ԁ                L   L   <                                      
+       5        Ԁ                N   N   <                                        
      
-       H        Ԁ                      <                                E      @  
+       H        Ԁ                      <                                  E      @  
 
- 	 l                                                                                                                     Ԁ              /        <                               E      @  
+ 	 l                                                                                                                     Ԁ              3        <                                 E      @  
 
- 	 l                                                                                                             p        Ԁ                L   L                                
+ 	 l                                                                                                             x        Ԁ              #  N   N                                 
 
-         L   L                               
+         N   N                                
 
-         L   L   <                                       
+         N   N   <                                        
      
-               Ԁ              E   L   L   <                                      
+               Ԁ              M   N   N   <                                       
      
-       !        Ԁ              K"        <                                E      @  
+       	!        Ԁ              W"        <                                 E      @  
 
- 	 l                                                                                                             ["        Ԁ              "        <                               E      @  
+ 	 l                                                                                                             g"        Ԁ              "        <                                E      @  
 
- 	 l                                                                                                             #        Ԁ              :%  L   L                               
+ 	 l                                                                                                             $        Ԁ              J%  N   N                                
 
-         F   F                         $0H`lx
- rmesh         F   F                E         $0H`lx
- 3rmesh       O A   A                         $0H`lx Ermesh       h0 L   L                               
+         F   F                         $0H`lx
+ rmesh         F   F                E         $0H`lx
+ 3rmesh       O A   A                         $0H`lx Ermesh       h0 N   N                                 
 
-       1 L   L   <                                       
+       1 N   N   <                                         
      
-       1       Ԁ              3 L   L                               
+       1       Ԁ              3 N   N                                
 
-       l3       <                                E      @  
+       l3       <                                  E      @  
 
- 	 l                                                                                                             4       Ԁ              8 L   L                                
+ 	 l                                                                                                             4       Ԁ              8 N   N                                 
 
-       9 L   L   <                0                      
+       9 N   N   <                0                        
      
-       9       Ԁ              *: L   L          @                    
+       9       Ԁ              .: N   N                                
 
-       V; L   L                               
+       Z; N   N                                
 
-       <       <                                E      @  
+       <       <                0                 E      @  
 
- 	 l                                                                                                             <       Ԁ               L   L                                
+ 	 l                                                                                                             <       Ԁ               N   N                                 
 
-        L   L          P                    
+        N   N                                
 
-       >  L   L                               
+       >  N   N                                
 
-       ;" ?   ?   Ѐ<                             ,                 _#       Ԁ              $ L   L   <                                      
+       ;" ?   ?   Ѐ<                              ,                 _#       Ԁ              $ N   N   <                                        
      
-       #$       Ԁ              % E   E   Ѐ            0%                                 a% E   E   Ѐ            `%              ,                  d& ?   ?   Ѐ<                                                t&       Ԁ              & ?   ?   Ѐ<                p                             k'       Ԁ              ' ?   ?   Ѐ<                @           ,                 i( L   L   <                                     
+       #$       Ԁ              % E   E   Ѐ             %                                 a% E   E   Ѐ             %              ,                  d& ?   ?   Ѐ<                                                 t&       Ԁ              & ?   ?   Ѐ<                                             k'       Ԁ              ' ?   ?   Ѐ<                           ,                 i( N   N   <                @                       
      
-       &)       Ԁ              U*       <                                E      @  
+       &)       Ԁ              Y*       <                @                 E      @  
 
  
- l                                                                                                             e*       Ԁ              :+       <                              E      @  
+ l                                                                                                             i*       Ԁ              >+       <                                 E      @  
 
  
- l                                                                                                             {,       Ԁ              -       <                P              E      @  
+ l                                                                                                             ,       Ԁ              -       <                                 E      @  
 
  
- l                                                                                                             / L   L          `                    
+ l                                                                                                             / N   N                                
 
-       / L   L                              
+       / N   N                                
 
-       1 L   L   <                0                      
+       1 N   N   <                P                        
      
-       !1       Ԁ              1 L   L   <                                     
+       -1       Ԁ              1 N   N   <                0                       
      
-       P2       Ԁ              3 L   L          @                    
+       \2       Ԁ              3 N   N                                
 
-       3 L   L   <                p                     
+       3 N   N   <                                       
      
-       5       Ԁ              7       <                              E      @  
+       5       Ԁ              "7       <                0                E      @  
 
  
- l                                                                                                             7       Ԁ              u7       <                              E      @  
+ l                                                                                                             27       Ԁ              7       <                P                E      @  
 
  
- l                                                                                                             8       Ԁ              7 F   F               Ȼ&         $0H`lx
- J&Ermesh       a F   F               3&         $0H`lx
- &rmesh        A   A               Pt'         $0H`lx &rmesh               <                               E     @  
+ l                                                                                                             8       Ԁ              7 F   F               0Ȼ&         $0H`lx
+ J&Ermesh       a F   F               03&         $0H`lx
+ &rmesh        A   A                t'         $0H`lx &rmesh               <                @                 E     @  
 
- 	 l                                                                                                                     Ԁ              k        <                              E     @  
+ 	 l                                                                                                                     Ԁ              o        <                `                E     @  
 
- 	 l                                                                                                                     Ԁ                      <                `               E     @  
+ 	 l                                                                                                                     Ԁ                      <                `                 E     @  
 
- 	 l                                                                                                                     Ԁ                      <                              E     @  
+ 	 l                                                                                                                     Ԁ                      <                @                E     @  
 
- 	 l                                                                                                             	        Ԁ                F   F               \.         $0H`lx
- -&rmesh         F   F                S.         $0H`lx
- ].u'rmesh       O A   A               p
-/         $0H`lx .rmesh       @       <                               E     @  
+ 	 l                                                                                                                     Ԁ                F   F               @\.         $0H`lx
+ -&rmesh         F   F               @S.         $0H`lx
+ ].u'rmesh       O A   A                
+/         $0H`lx .rmesh       @       <                p                 E     @  
 
- 	 l                                                                                                             0       Ԁ                     <                               E     @  
+ 	 l                                                                                                             4       Ԁ                     <                p                 E     @  
 
- 	 l                                                                                                                    Ԁ              4       <                               E     @  
+ 	 l                                                                                                             '       Ԁ              8       <                                 E     @  
 
  
- l                                                                                                             D       Ԁ                     <                               E     @  
+ l                                                                                                             H       Ԁ                     <                P                E     @  
 
  
- l                                                                                                                    Ԁ              
-       <                              E     @  
+ l                                                                                                                    Ԁ                     <                                 E     @  
 
  
- l                                                                                                                    Ԁ                      <                              E     @  
+ l                                                                                                                    Ԁ              !       <                P                E     @  
 
  
- l                                                                                                             !       Ԁ              !       <                0              E     @  
+ l                                                                                                             !       Ԁ              !       <                                E     @  
 
  
- l                                                                                                             "       Ԁ              7 F   F               5         $0H`lx
- 5.rmesh       a F   F               @s(6         $0H`lx
- 5/rmesh        A   A               *6         $0H`lx (6rmesh               <                               E     @  
+ l                                                                                                             "       Ԁ              7 F   F               P5         $0H`lx
+ 5.rmesh       a F   F               Ps(6         $0H`lx
+ 5/rmesh        A   A               *6         $0H`lx (6rmesh               <                `                 E     @  
 
- 	 l                                                                                                                     Ԁ              k        <                P              E     @  
+ 	 l                                                                                                                     Ԁ              o        <                                E     @  
 
- 	 l                                                                                                             [        Ԁ              :        <                               E     @  
+ 	 l                                                                                                             c        Ԁ              F        <                                 E     @  
 
- 	 l                                                                                                             J        Ԁ                      <                `              E     @  
+ 	 l                                                                                                             V        Ԁ                      <                `                E     @  
 
- 	 l                                                                                                                     Ԁ                F   F                (=         $0H`lx
- -=(6rmesh         F   F               p=         $0H`lx
- =6rmesh       O A   A               JX>         $0H`lx =rmesh       @       <                               E     @  
+ 	 l                                                                                                                     Ԁ                F   F               `(=         $0H`lx
+ -=(6rmesh         F   F               `=         $0H`lx
+ =6rmesh       O A   A                JX>         $0H`lx =rmesh       @       <                                 E     @  
 
- 	 l                                                                                                             0       Ԁ                     <                               E     @  
+ 	 l                                                                                                             4       Ԁ                     <                                 E     @  
 
- 	 l                                                                                                                    Ԁ              4       <                               E     @  
+ 	 l                                                                                                             '       Ԁ              8       <                                 E     @  
 
  
- l                                                                                                             D       Ԁ                     <                              E     @  
+ l                                                                                                             H       Ԁ                     <                p                E     @  
 
  
- l                                                                                                                    Ԁ                     <                              E     @  
+ l                                                                                                                    Ԁ                     <                0                E     @  
 
  
- l                                                                                                             b       Ԁ              S        <                               E     @  
+ l                                                                                                             r       Ԁ              g        <                p                E     @  
 
  
- l                                                                                                             c        Ԁ              !       <                              E     @  
+ l                                                                                                             w        Ԁ              !       <                                E     @  
 
  
- l                                                                                                             !       Ԁ              7 F   F               0H@E         $0H`lx
- D=rmesh       a F   F               jE         $0H`lx
- @EX>rmesh        A   A               jE         $0H`lx kErmesh    
\ No newline at end of file
+ l                                                                                                             "       Ԁ              7 F   F               pH@E         $0H`lx
+ D=rmesh       a F   F               pjE         $0H`lx
+ @EX>rmesh        A   A               0jE         $0H`lx kErmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-2-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression-test-2-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-2-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression-test-2-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -4,137 +4,137 @@
  fbrmesh         F   F               `          $0H`lx
  rmesh        A   A               P m         $0H`lx rmesh       H7 F   F               p y         $0H`lx
  rmesh       +b F   F               p          $0H`lx
- zrmesh         L   L                                
+ zrmesh         N   N                                 
 
-         L   L                               
+         N   N                                
 
-         E   E   Ѐ             %                                   ?   ?   Ѐ<                                                         Ԁ              =  ?   ?   Ѐ<                                              a        Ԁ                L   L   <                                      
+         E   E   Ѐ             %                                   ?   ?   Ѐ<                                                         Ԁ              =  ?   ?   Ѐ<                                              a        Ԁ                N   N   <                                        
      
-               Ԁ                      <                                E      @  
+               Ԁ                      <                                  E      @  
 
- 	 l                                                                                                                     Ԁ              4        <                               E      @  
+ 	 l                                                                                                                     Ԁ              <        <                                 E      @  
 
- 	 l                                                                                                               L   L                               
+ 	 l                                                                                                               N   N                                
 
-       0  L   L   <                                       
+       8  N   N   <                                        
      
-               Ԁ                 L   L   <                                      
+               Ԁ                 N   N   <                                       
      
-       "        Ԁ              #        <                               E      @  
+       "        Ԁ              #        <                                E      @  
 
- 	 l                                                                                                             #        Ԁ              }$  A   A               p          $0H`lx zrmesh       $  L   L                               
+ 	 l                                                                                                             #        Ԁ              $  A   A               p          $0H`lx zrmesh       $  N   N                                
 
-       %  L   L                               
+       %  N   N                                
 
-       (  F   F                         $0H`lx
- rmesh         F   F                E         $0H`lx
- 3rmesh       0 L   L                               
+       (  F   F                         $0H`lx
+ rmesh         F   F                E         $0H`lx
+ 3rmesh       0 N   N                                 
 
-       1 L   L                               
+       1 N   N                                
 
-       1       Ԁ              {2 L   L                               
+       1       Ԁ              {2 N   N                                
 
-       p4       <                                E      @  
+       t4       <                                  E      @  
 
- 	 l                                                                                                             9 L   L   <                0                      
+ 	 l                                                                                                             9 N   N   <                0                        
      
-       : L   L          @                    
+       : N   N                                
 
-       : L   L                               
+       : N   N                                
 
-       < L   L                               
+       < N   N                                
 
-       <       Ԁ               L   L          P                    
+       <       Ԁ               N   N                                
 
-        L   L                               
+        N   N                                
 
-         L   L                               
+         N   N                                
 
-       ! E   E   Ѐ             %                                    ! ?   ?   Ѐ<                             ,                 w"       Ԁ              "# L   L   <                                       
+       ! E   E   Ѐ             %                                    ! ?   ?   Ѐ<                              ,                 w"       Ԁ              "# N   N   <                                         
      
-       2#       Ԁ              # L   L   <                                      
+       2#       Ԁ              # N   N   <                                        
      
-       O$       Ԁ              $ E   E   Ѐ            0%                                 % E   E   Ѐ            `%              ,                  &       Ԁ              .' ?   ?   Ѐ<                p                             >'       Ԁ              ' ?   ?   Ѐ<                @           ,                 5(       Ԁ              ( L   L   <                                     
+       O$       Ԁ              $ E   E   Ѐ             %                                 % E   E   Ѐ             %              ,                  &       Ԁ              .' ?   ?   Ѐ<                                             >'       Ԁ              ' ?   ?   Ѐ<                           ,                 5(       Ԁ              ( N   N   <                @                       
      
-       *       Ԁ              >,       <                              E      @  
+       *       Ԁ              F,       <                                 E      @  
 
  
- l                                                                                                             N,       Ԁ              ,       <                P              E      @  
+ l                                                                                                             V,       Ԁ              ,       <                                 E      @  
 
  
- l                                                                                                             -       Ԁ              . L   L                                
+ l                                                                                                             -       Ԁ              . N   N                                 
 
-       :/ L   L          `                    
+       F/ N   N                                
 
-       f0 L   L                              
+       r0 N   N                                
 
-       M1       Ԁ              2 L   L   <                                     
+       Y1       Ԁ              2 N   N   <                0                       
      
-       #2       Ԁ              o3 L   L   <                p                     
+       /2       Ԁ              {3 N   N   <                                       
      
-       +4       Ԁ              Z5       <                                E      @  
+       74       Ԁ              j5       <                                 E      @  
 
  
- l                                                                                                             j5       Ԁ              	6       <                              E      @  
+ l                                                                                                             z5       Ԁ              6       <                0                E      @  
 
  
- l                                                                                                             J7       Ԁ              y8       <                              E      @  
+ l                                                                                                             ^7       Ԁ              8       <                P                E      @  
 
  
- l                                                                                                              A   A                I&         $0H`lx rmesh       H7 F   F               Ȼ&         $0H`lx
- J&Ermesh       +b F   F               3&         $0H`lx
- &rmesh                 <                               E     @  
+ l                                                                                                              A   A                I&         $0H`lx rmesh       H7 F   F               0Ȼ&         $0H`lx
+ J&Ermesh       +b F   F               03&         $0H`lx
+ &rmesh                 <                @                 E     @  
 
- 	 l                                                                                                             @        Ԁ              o        <                              E     @  
+ 	 l                                                                                                             D        Ԁ              w        <                `                E     @  
 
- 	 l                                                                                                                     Ԁ                      <                              E     @  
+ 	 l                                                                                                             #        Ԁ                      <                @                E     @  
 
- 	 l                                                                                                                     Ԁ              }$  A   A               -         $0H`lx &rmesh       (  F   F               \.         $0H`lx
- -&rmesh         F   F                S.         $0H`lx
- ].u'rmesh              <                               E     @  
+ 	 l                                                                                                                     Ԁ              }$  A   A                -         $0H`lx &rmesh       (  F   F               @\.         $0H`lx
+ -&rmesh         F   F               @S.         $0H`lx
+ ].u'rmesh              <                p                 E     @  
 
- 	 l                                                                                                             K       Ԁ              p       Ԁ                     <                               E     @  
+ 	 l                                                                                                             S       Ԁ              t       Ԁ                     <                P                E     @  
 
  
- l                                                                                                                    Ԁ                     <                              E     @  
+ l                                                                                                                    Ԁ                     <                                 E     @  
 
  
- l                                                                                                             G       Ԁ              v       <                                E     @  
+ l                                                                                                             S       Ԁ                     <                                  E     @  
 
  
- l                                                                                                                    Ԁ                     <                              E     @  
+ l                                                                                                                    Ԁ                     <                P                E     @  
 
  
- l                                                                                                             /!       Ԁ              V"       <                0              E     @  
+ l                                                                                                             C!       Ԁ              n"       <                                E     @  
 
  
- l                                                                                                              A   A               05         $0H`lx ].rmesh       H7 F   F               5         $0H`lx
- 5.rmesh       +b F   F               @s(6         $0H`lx
- 5/rmesh                 <                               E     @  
+ l                                                                                                              A   A                5         $0H`lx ].rmesh       H7 F   F               P5         $0H`lx
+ 5.rmesh       +b F   F               Ps(6         $0H`lx
+ 5/rmesh                 <                `                 E     @  
 
- 	 l                                                                                                             @        Ԁ                      <                P              E     @  
+ 	 l                                                                                                             D        Ԁ              '        <                                E     @  
 
- 	 l                                                                                                             w        Ԁ                      <                `              E     @  
+ 	 l                                                                                                                     Ԁ                      <                `                E     @  
 
- 	 l                                                                                                                     Ԁ              }$  A   A               @-=         $0H`lx 5rmesh       (  F   F                (=         $0H`lx
- -=(6rmesh         F   F               p=         $0H`lx
- =6rmesh              <                               E     @  
+ 	 l                                                                                                                     Ԁ              }$  A   A               -=         $0H`lx 5rmesh       (  F   F               `(=         $0H`lx
+ -=(6rmesh         F   F               `=         $0H`lx
+ =6rmesh              <                                 E     @  
 
- 	 l                                                                                                             K       Ԁ              p       Ԁ              O       <                              E     @  
+ 	 l                                                                                                             S       Ԁ              t       Ԁ              W       <                p                E     @  
 
  
- l                                                                                                             _       Ԁ                     <                              E     @  
+ l                                                                                                             g       Ԁ                     <                0                E     @  
 
  
- l                                                                                                                    Ԁ              &       <                P               E     @  
+ l                                                                                                                    Ԁ              6       <                0                 E     @  
 
  
- l                                                                                                             6       Ԁ                     <                               E     @  
+ l                                                                                                             F       Ԁ                     <                p                E     @  
 
  
- l                                                                                                                     Ԁ              !       <                              E     @  
+ l                                                                                                                     Ԁ              !       <                                E     @  
 
  
- l                                                                                                              A   A               `-D         $0H`lx =rmesh       H7 F   F               0H@E         $0H`lx
- D=rmesh       +b F   F               jE         $0H`lx
+ l                                                                                                              A   A                -D         $0H`lx =rmesh       H7 F   F               pH@E         $0H`lx
+ D=rmesh       +b F   F               pjE         $0H`lx
  @EX>rmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-3-1.pcap ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression-test-3-1.pcap
--- ns-3.23/src/mesh/test/dot11s/hwmp-target-flags-regression-test-3-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/dot11s/hwmp-target-flags-regression-test-3-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,76 +1,75 @@
 ò            i       $  <   <                 $          $0H`lx rmesh        %  >   >   Ѐ<                    $0H`lrmeshq   9u         %        Ԁ               a%  <   <   Ѐ<                     $0H`lq   9u          &        Ԁ               :&  >   >   Ѐ<                    $0H`lrmeshq   9u         &        Ԁ               v'  <   <   Ѐ<                     $0H`lq  9u          '        Ԁ                 A   A                 (          $0H`lx $ rmesh        c        Ԁ                 <   <   Ѐ<                0    $0H`lq  9u            >   >   Ѐ<                @   $0H`lrmeshq  9u         ̙        Ԁ               - A   A               0 -         $0H`lx  rmesh        7 F   F               P H7         $0H`lx
   rmesh       $  A   A               @ Mf         $0H`lx 7rmesh         F   F               ` h         $0H`lx
  fbrmesh       - A   A               P m         $0H`lx rmesh       7 F   F               p y         $0H`lx
- rmesh         L   L                                
+ rmesh         N   N                                 
 
-       3  L   L          `                     
+       3  N   N          `                      
 
-       s  ?   ?   Ѐ<                                                 H        Ԁ                      <                                E      @  
+       s  ?   ?   Ѐ<                                                 H        Ԁ                      <                                  E      @  
 
- 	 l                                                                                                               L   L   <                                       
+ 	 l                                                                                                               N   N   <                                        
      
-       #        Ԁ              $  A   A               p          $0H`lx zrmesh       :%  L   L                               
+       $        Ԁ              $  A   A               p          $0H`lx zrmesh       J%  N   N                                
 
-       e%  L   L                               
+       u%  N   N                                
 
-         F   F                         $0H`lx
- rmesh       1 L   L                               
+         F   F                         $0H`lx
+ rmesh       1 N   N                                
 
-       1 L   L                               
+       1 N   N                                
 
-       V; L   L                               
+       Z; N   N                                
 
-       ; L   L                               
+       ; N   N                                
 
-       >  L   L                               
+       >  N   N                                
 
-       i  L   L                               
+       i  N   N                                
 
-       8! E   E   Ѐ             %                                    ;" ?   ?   Ѐ<                             ,                 K"       Ԁ              " L   L   <                                       
+       8! E   E   Ѐ             %                                    ;" ?   ?   Ѐ<                              ,                 K"       Ԁ              " N   N   <                                         
      
-       _#       Ԁ              $ L   L   <                                      
+       _#       Ԁ              $ N   N   <                                        
      
-       % E   E   Ѐ            0%                                 k'       Ԁ              ' ?   ?   Ѐ<                @           ,                 	(       Ԁ              {,       Ԁ              -       <                P              E      @  
+       % E   E   Ѐ             %                                 k'       Ԁ              ' ?   ?   Ѐ<                           ,                 	(       Ԁ              ,       Ԁ              -       <                                 E      @  
 
  
- l                                                                                                             -       Ԁ              . L   L                                
+ l                                                                                                             -       Ԁ              . N   N                                 
 
-       / L   L          `                    
+       / N   N                                
 
-       P2       Ԁ              3 L   L   <                p                     
+       \2       Ԁ              3 N   N   <                                       
      
-       3       Ԁ              V4       <                                E      @  
+       4       Ԁ              b4       <                                 E      @  
 
  
- l                                                                                                             5       Ԁ              7       <                              E      @  
+ l                                                                                                             5       Ԁ              "7       <                0                E      @  
 
  
- l                                                                                                             - A   A                I&         $0H`lx rmesh       7 F   F               Ȼ&         $0H`lx
- J&Ermesh               <                               E     @  
+ l                                                                                                             - A   A                I&         $0H`lx rmesh       7 F   F               0Ȼ&         $0H`lx
+ J&Ermesh               <                @                 E     @  
 
- 	 l                                                                                                             	        Ԁ              $  A   A               -         $0H`lx &rmesh         F   F               \.         $0H`lx
- -&rmesh              Ԁ              
-       <                              E     @  
+ 	 l                                                                                                                     Ԁ              $  A   A                -         $0H`lx &rmesh         F   F               @\.         $0H`lx
+ -&rmesh              Ԁ                     <                                 E     @  
 
  
- l                                                                                                                    Ԁ              q       <                                E     @  
+ l                                                                                                             &       Ԁ              }       <                                  E     @  
 
  
- l                                                                                                                    Ԁ                      <                              E     @  
+ l                                                                                                                    Ԁ              !       <                P                E     @  
 
  
- l                                                                                                             - A   A               05         $0H`lx ].rmesh       7 F   F               5         $0H`lx
- 5.rmesh               <                               E     @  
+ l                                                                                                             - A   A                5         $0H`lx ].rmesh       7 F   F               P5         $0H`lx
+ 5.rmesh               <                `                 E     @  
 
- 	 l                                                                                                                     Ԁ              $  A   A               @-=         $0H`lx 5rmesh         F   F                (=         $0H`lx
- -=(6rmesh              Ԁ                     <                              E     @  
+ 	 l                                                                                                                     Ԁ              $  A   A               -=         $0H`lx 5rmesh         F   F               `(=         $0H`lx
+ -=(6rmesh              Ԁ                     <                0                E     @  
 
  
- l                                                                                                                    Ԁ              !       <                P               E     @  
+ l                                                                                                                    Ԁ              -       <                0                 E     @  
 
  
- l                                                                                                             b       Ԁ              S        <                               E     @  
+ l                                                                                                             r       Ԁ              g        <                p                E     @  
 
  
- l                                                                                                             - A   A               `-D         $0H`lx =rmesh       7 F   F               0H@E         $0H`lx
+ l                                                                                                             - A   A                -D         $0H`lx =rmesh       7 F   F               pH@E         $0H`lx
  D=rmesh    
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/flame/flame-regression.cc ns-3.24/src/mesh/test/flame/flame-regression.cc
--- ns-3.23/src/mesh/test/flame/flame-regression.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/flame/flame-regression.cc	2015-09-15 11:18:44.000000000 -0700
@@ -30,7 +30,6 @@
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/abort.h"
 #include "ns3/pcap-test.h"
-#include "ns3/udp-echo-helper.h"
 #include "ns3/mobility-model.h"
 #include <sstream>
 
@@ -44,7 +43,8 @@
 
 FlameRegressionTest::FlameRegressionTest () : TestCase ("FLAME regression test"),
                                               m_nodes (0),
-                                              m_time (Seconds (10))
+                                              m_time (Seconds (10)),
+                                              m_sentPktsCounter (0)
 {
 }
 
@@ -125,17 +125,18 @@
 void
 FlameRegressionTest::InstallApplications ()
 {
-  UdpEchoServerHelper echoServer (9);
-  ApplicationContainer serverApps = echoServer.Install (m_nodes->Get (0));
-  serverApps.Start (Seconds (0.0));
-  serverApps.Stop (m_time);
-  UdpEchoClientHelper echoClient (m_interfaces.GetAddress (0), 9);
-  echoClient.SetAttribute ("MaxPackets", UintegerValue (300));
-  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.1)));
-  echoClient.SetAttribute ("PacketSize", UintegerValue (20));
-  ApplicationContainer clientApps = echoClient.Install (m_nodes->Get (2));
-  clientApps.Start (Seconds (1.0));
-  clientApps.Stop (m_time);
+  // client socket
+  m_clientSocket = Socket::CreateSocket (m_nodes->Get (2), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_clientSocket->Bind ();
+  m_clientSocket->Connect (InetSocketAddress (m_interfaces.GetAddress (0), 9));
+  m_clientSocket->SetRecvCallback (MakeCallback (&FlameRegressionTest::HandleReadClient, this));
+  Simulator::ScheduleWithContext (m_clientSocket->GetNode ()->GetId (), Seconds (1.0),
+                                  &FlameRegressionTest::SendData, this, m_clientSocket);
+
+  // server socket
+  m_serverSocket = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  m_serverSocket->Bind (InetSocketAddress (Ipv4Address::GetAny (), 9));
+  m_serverSocket->SetRecvCallback (MakeCallback (&FlameRegressionTest::HandleReadServer, this));
 }
 
 void
@@ -147,3 +148,38 @@
     }
 }
 
+void
+FlameRegressionTest::SendData (Ptr<Socket> socket)
+{
+  if ((Simulator::Now () < m_time) && (m_sentPktsCounter < 300))
+    {
+      socket->Send (Create<Packet> (20));
+      m_sentPktsCounter ++;
+      Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (1.1),
+                                      &FlameRegressionTest::SendData, this, socket);
+    }
+}
+
+void
+FlameRegressionTest::HandleReadServer (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+      packet->RemoveAllPacketTags ();
+      packet->RemoveAllByteTags ();
+
+      socket->SendTo (packet, 0, from);
+    }
+}
+
+void
+FlameRegressionTest::HandleReadClient (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+    }
+}
diff -Naur ns-3.23/src/mesh/test/flame/flame-regression.h ns-3.24/src/mesh/test/flame/flame-regression.h
--- ns-3.23/src/mesh/test/flame/flame-regression.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/flame/flame-regression.h	2015-09-15 11:18:44.000000000 -0700
@@ -73,5 +73,37 @@
   void CreateNodes ();
   void CreateDevices ();
   void InstallApplications ();
+
+  /// Server-side socket
+  Ptr<Socket> m_serverSocket;
+  /// Client-side socket
+  Ptr<Socket> m_clientSocket;
+
+  // sent packets counter
+  uint32_t m_sentPktsCounter;
+
+  /**
+   * Send data
+   * \param socket the sending socket
+   */
+  void SendData (Ptr<Socket> socket);
+
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
+  void HandleReadServer (Ptr<Socket> socket);
+
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
+  void HandleReadClient (Ptr<Socket> socket);
 };
 
diff -Naur ns-3.23/src/mesh/test/flame/flame-regression-test-0-1.pcap ns-3.24/src/mesh/test/flame/flame-regression-test-0-1.pcap
--- ns-3.23/src/mesh/test/flame/flame-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/flame/flame-regression-test-0-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,83 +1,79 @@
-ò            i      t$  X   X                    @@               
+ò            i      t$  Z   Z                      @@               
 
-       $  X   X   <                          @@                     
+       $  Z   Z   <                            @@                     
      
-       l%        Ԁ              B&  X   X   <                         @@                    
+       l%        Ԁ              B&  Z   Z   <                            @@                    
      
-       &  X   X                   @@               
+       &  Z   Z                      @@               
 
-       )        Ԁ              *  l   l   <                          @@             E  0    @  
+       )        Ԁ              *  n   n   <                            @@             E  0    @  
 
- 	                              *        Ԁ              *  <   <                    @@                 A,  <   <          0         @@                M  X   X          0         @@                
+ 	                              *        Ԁ               +  >   >                     @@                 U,  >   >                     @@                M  Z   Z                      @@                
 
-       O  X   X          @         @@               
+       O  Z   Z                      @@               
 
-       O        Ԁ              Q  X   X   <                P         @@                    
+       P        Ԁ              Q  Z   Z   <                           @@                    
      
-       Q        Ԁ              LR  l   l   <                @         @@              E  0    @  
+       R        Ԁ              XR  n   n   <                           @@              E  0    @  
 
- 	                              1S        Ԁ              (T  l   l   <                `         @@             E  0    @  
+ 	                              AS        Ԁ              <T  n   n   <                           @@             E  0    @  
 
- 	                                     Ԁ              X l   l   <                p         @@             E  0   @  
+ 	                                     Ԁ              ` n   n   <                            @@             E  0   @  
 
- 	                              h       Ԁ               l   l   <                P         @@              E  0   @  
+ 	                              p       Ԁ              ǈ n   n   <                            @@              E  0   @  
 
- 	                                     Ԁ               l   l   <                         @@             E  0   @  
+ 	                                     Ԁ               n   n   <                            @@             E  0   @  
 
- 	                              %       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              )       Ԁ                n   n   <                0           @@             E  0   @  
 
- 	                                     Ԁ              _ l   l   <                `         @@              E  0   @  
+ 	                                     Ԁ              g n   n   <                0           @@              E  0   @  
 
- 	                              D       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              P       Ԁ              ' n   n   <                0           @@             E  0   @  
 
- 	                              Ŕ       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              ɔ       Ԁ               n   n   <                @           @@             E  0   @  
 
- 	                                     Ԁ               l   l   <                p         @@              E  0   @  
+ 	                                     Ԁ               n   n   <                @           @@              E  0   @  
 
- 	                                     Ԁ               l   l   <                         @@             E  0   @  
+ 	                                     Ԁ              ! n   n   <                @           @@             E  0   @  
 
- 	                              e       Ԁ              8 l   l   <                         @@             E  0   @  
+ 	                              i       Ԁ              @ n   n   <                P           @@             E  0   @  
 
- 	                              H       Ԁ               l   l   <                         @@              E  0   @  
+ 	                              P       Ԁ               n   n   <                P           @@              E  0   @  
 
- 	                              M l   l   <                         @@              E  0   @  
+ 	                              Y n   n   <                P           @@              E  0   @  
 
- 	                              2       Ԁ                l   l   <                         @@             E  0   @  
+ 	                              B       Ԁ                n   n   <                P           @@             E  0   @  
 
- 	                               l   l                        @@             E  0   @  
+ 	                               n   n               0           @@             E  0   @  
 
- 	                              Ǣ <   <                   @@   	              Z l   l   <                         @@   
+ 	                              Ϣ >   >          0           @@   	              f n   n   <                `           @@   
            E  0   @  
 
- 	                              ?       Ԁ              5 <   <                   @@  	               l   l   <                        @@  
+ 	                              O       Ԁ              I >   >          @           @@  	               n   n   <                `           @@  
            E  0   @  
 
- 	                              w l   l   <                        @@  
+ 	                               n   n   <                `           @@  
            E  0   @  
 
- 	                              (	       Ԁ              x)	 l   l   <                         @@  	           E  0   @  
+ 	                              (	       Ԁ              )	 n   n   <                `           @@  	           E  0   @  
 
- 	                              )	       Ԁ              )	 l   l   <                         @@              E  0   @  
+ 	                              )	       Ԁ              )	 n   n   <                p           @@              E  0   @  
 
- 	                              *	       Ԁ              +	 l   l   <                0        @@             E  0   @  
+ 	                              *	       Ԁ              +	 n   n   <                p           @@             E  0   @  
 
- 	                              E
-       Ԁ              
- l   l   <                @        @@  
+ 	                              I
+       Ԁ               
+ n   n   <                p           @@  
            E  0   @  
 
- 	                              (
-       Ԁ              
- l   l   <                         @@              E  0   @  
+ 	                              0
+       Ԁ              
+ n   n   <                           @@              E  0   @  
 
- 	                              d
-       Ԁ              @
- l   l   <                P        @@             E  0   @  
+ 	                              p
+       Ԁ              P
+ n   n   <                           @@             E  0   @  
 
- 	                           	   9 l   l   <                `        @@             E  0   @  
+ 	                           	   9 n   n   <                           @@             E  0   @  
 
- 	                           	   9       Ԁ           	   9 l   l   <                         @@              E  0   @  
-
- 	                           	   :       Ԁ           	   ; l   l   <                p        @@             E  0   @  
-
- 	                           
\ No newline at end of file
+ 	                           	   9       Ԁ           
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/flame/flame-regression-test-1-1.pcap ns-3.24/src/mesh/test/flame/flame-regression-test-1-1.pcap
--- ns-3.23/src/mesh/test/flame/flame-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/flame/flame-regression-test-1-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,108 +1,104 @@
-ò            i      #  X   X                    @@                
+ò            i      #  Z   Z                      @@                
 
-       #  X   X                    @@               
+       #  Z   Z                      @@               
 
-       /%  X   X   <                          @@                     
+       /%  Z   Z   <                            @@                     
      
-       ?%        Ԁ              %  X   X   <                         @@                    
+       ?%        Ԁ              %  Z   Z   <                            @@                    
      
-       ~&        Ԁ              })  l   l   <                         @@              E  0    @  
+       ~&        Ԁ              )  n   n   <                            @@              E  0    @  
 
- 	                              )        Ԁ              )  l   l   <                          @@             E  0    @  
+ 	                              )        Ԁ              )  n   n   <                            @@             E  0    @  
 
- 	                              *        Ԁ              \+  <   <                    @@                 +  <   <          0         @@                ,  <   <                    @@                EN  X   X          0         @@                
+ 	                              *        Ԁ              l+  >   >                     @@                 +  >   >                     @@                ,  >   >                     @@                QN  Z   Z                      @@                
 
-       pN  X   X          @         @@               
+       |N  Z   Z                      @@               
 
-       O  X   X   <                0         @@                     
+       O  Z   Z   <                           @@                     
      
-       O        Ԁ              P  X   X          @         @@               
+       O        Ԁ              P  Z   Z                      @@               
 
-       TQ  X   X   <                P         @@                    
+       `Q  Z   Z   <                           @@                    
      
-       !R        Ԁ              R  l   l   <                @         @@              E  0    @  
+       -R        Ԁ              S  n   n   <                           @@              E  0    @  
 
- 	                              S        Ԁ              S  l   l   <                `         @@             E  0    @  
+ 	                              S        Ԁ              S  n   n   <                           @@             E  0    @  
 
- 	                              dT        Ԁ              H l   l   <                P         @@              E  0   @  
+ 	                              xT        Ԁ              L n   n   <                            @@              E  0   @  
 
- 	                              X       Ԁ               l   l   <                p         @@             E  0   @  
+ 	                              \       Ԁ               n   n   <                            @@             E  0   @  
 
- 	                                     Ԁ              g l   l   <                P         @@              E  0   @  
+ 	                                     Ԁ              s n   n   <                            @@              E  0   @  
 
- 	                              w       Ԁ               l   l   <                         @@             E  0   @  
+ 	                                     Ԁ               n   n   <                            @@             E  0   @  
 
- 	                              ׊       Ԁ               l   l   <                `         @@              E  0   @  
+ 	                                     Ԁ               n   n   <                0           @@              E  0   @  
 
- 	                                     Ԁ              O l   l   <                         @@             E  0   @  
+ 	                                     Ԁ              S n   n   <                0           @@             E  0   @  
 
- 	                              4       Ԁ               l   l   <                `         @@              E  0   @  
+ 	                              <       Ԁ               n   n   <                0           @@              E  0   @  
 
- 	                                     Ԁ              n l   l   <                         @@             E  0   @  
+ 	                              #       Ԁ              z n   n   <                0           @@             E  0   @  
 
- 	                              S       Ԁ               l   l   <                p         @@              E  0   @  
+ 	                              c       Ԁ               n   n   <                @           @@              E  0   @  
 
- 	                                     Ԁ               l   l   <                         @@             E  0   @  
+ 	                                     Ԁ               n   n   <                @           @@             E  0   @  
 
- 	                              ԕ       Ԁ               l   l   <                p         @@              E  0   @  
+ 	                              ܕ       Ԁ               n   n   <                @           @@              E  0   @  
 
- 	                                     Ԁ              h l   l   <                         @@             E  0   @  
+ 	                              Ö       Ԁ              t n   n   <                @           @@             E  0   @  
 
- 	                              M       Ԁ              ( l   l   <                         @@              E  0   @  
+ 	                              ]       Ԁ              , n   n   <                P           @@              E  0   @  
 
- 	                              8       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              <       Ԁ               n   n   <                P           @@             E  0   @  
 
- 	                              t       Ԁ               l   l   <                         @@              E  0   @  
+ 	                              |       Ԁ               n   n   <                P           @@              E  0   @  
 
- 	                                     Ԁ              \ l   l   <                         @@             E  0   @  
+ 	                                     Ԁ              l n   n   <                P           @@             E  0   @  
 
- 	                              A        Ԁ              ȡ l   l                        @@              E  0   @  
+ 	                              U        Ԁ              ̡ n   n               0           @@              E  0   @  
 
- 	                               l   l                        @@             E  0   @  
+ 	                               n   n               0           @@             E  0   @  
 
- 	                              / <   <                   @@   	               l   l   <                         @@   
+ 	                              ; >   >          0           @@   	               n   n   <                `           @@   
            E  0   @  
 
- 	                                     Ԁ              ̤ <   <                   @@  	              ȥ <   <                   @@  	              M l   l   <                        @@  
+ 	                              "       Ԁ              ܤ >   >          @           @@  	               >   >          @           @@  	              e n   n   <                `           @@  
            E  0   @  
 
- 	                              Χ l   l   <                        @@  
+ 	                               n   n   <                `           @@  
            E  0   @  
 
- 	                                     Ԁ              h(	 l   l   <                         @@   	           E  0   @  
+ 	                              Ө       Ԁ              l(	 n   n   <                `           @@   	           E  0   @  
 
- 	                              x(	       Ԁ              (	 l   l   <                         @@  	           E  0   @  
+ 	                              |(	       Ԁ              (	 n   n   <                `           @@  	           E  0   @  
 
- 	                              )	       Ԁ              *	 l   l   <                         @@              E  0   @  
+ 	                              )	       Ԁ              *	 n   n   <                p           @@              E  0   @  
 
- 	                              *	       Ԁ              	+	 l   l   <                0        @@             E  0   @  
+ 	                              *	       Ԁ              +	 n   n   <                p           @@             E  0   @  
 
- 	                              +	       Ԁ              
- l   l   <                         @@   
+ 	                              +	       Ԁ              
+ n   n   <                p           @@   
            E  0   @  
 
- 	                              
-       Ԁ              o
- l   l   <                @        @@  
+ 	                              
+       Ԁ              s
+ n   n   <                p           @@  
            E  0   @  
 
- 	                              T
-       Ԁ              '
- l   l   <                         @@              E  0   @  
+ 	                              \
+       Ԁ              3
+ n   n   <                           @@              E  0   @  
 
- 	                              7
-       Ԁ              
- l   l   <                P        @@             E  0   @  
+ 	                              C
+       Ԁ              
+ n   n   <                           @@             E  0   @  
 
- 	                              |
-       Ԁ           	   6 l   l   <                         @@              E  0   @  
+ 	                              
+       Ԁ           	   6 n   n   <                           @@              E  0   @  
 
- 	                           	   6       Ԁ           	   H7 l   l   <                `        @@             E  0   @  
+ 	                           	   6       Ԁ           	   P7 n   n   <                           @@             E  0   @  
 
- 	                           	   8 l   l   <                `        @@             E  0   @  
+ 	                           	   8 n   n   <                           @@             E  0   @  
 
- 	                           	   9       Ԁ           	   : l   l   <                         @@              E  0   @  
-
- 	                           	   :       Ԁ           	   ; l   l   <                p        @@             E  0   @  
-
- 	                           	   ;       Ԁ           
\ No newline at end of file
+ 	                           	   9       Ԁ           
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/test/flame/flame-regression-test-2-1.pcap ns-3.24/src/mesh/test/flame/flame-regression-test-2-1.pcap
--- ns-3.23/src/mesh/test/flame/flame-regression-test-2-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/test/flame/flame-regression-test-2-1.pcap	2015-09-15 11:18:44.000000000 -0700
@@ -1,84 +1,82 @@
-ò            i      (#  X   X                    @@                
+ò            i      (#  Z   Z                      @@                
 
-       t$  X   X                    @@               
+       t$  Z   Z                      @@               
 
-       l%        Ԁ              B&  X   X   <                         @@                    
+       l%        Ԁ              B&  Z   Z   <                            @@                    
      
-       R&        Ԁ              &  l   l   <                         @@              E  0    @  
+       R&        Ԁ              &  n   n   <                            @@              E  0    @  
 
- 	                              (  l   l   <                         @@              E  0    @  
+ 	                              (  n   n   <                            @@              E  0    @  
 
- 	                              )        Ԁ              *  l   l   <                          @@             E  0    @  
+ 	                              )        Ԁ              *  n   n   <                            @@             E  0    @  
 
- 	                              A,  <   <          0         @@                l,  <   <                    @@                O  X   X          @         @@               
+ 	                              U,  >   >                     @@                ,  >   >                     @@                O  Z   Z                      @@               
 
-       ,O  X   X   <                0         @@                     
+       8O  Z   Z   <                           @@                     
      
-       O        Ԁ              QP  X   X          @         @@               
+       P        Ԁ              ]P  Z   Z                      @@               
 
-       Q  X   X   <                P         @@                    
+       Q  Z   Z   <                           @@                    
      
-       1S        Ԁ              (T  l   l   <                `         @@             E  0    @  
+       AS        Ԁ              <T  n   n   <                           @@             E  0    @  
 
- 	                              8T        Ԁ               l   l   <                P         @@              E  0   @  
+ 	                              LT        Ԁ               n   n   <                            @@              E  0   @  
 
- 	                                     Ԁ              X l   l   <                p         @@             E  0   @  
+ 	                                     Ԁ              ` n   n   <                            @@             E  0   @  
 
- 	                                     Ԁ               l   l   <                         @@             E  0   @  
+ 	                                     Ԁ               n   n   <                            @@             E  0   @  
 
- 	                                     Ԁ              @ l   l   <                `         @@              E  0   @  
+ 	                                     Ԁ              @ n   n   <                0           @@              E  0   @  
 
- 	                              %       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              )       Ԁ                n   n   <                0           @@             E  0   @  
 
- 	                              D       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              P       Ԁ              ' n   n   <                0           @@             E  0   @  
 
- 	                              '       Ԁ               l   l   <                p         @@              E  0   @  
+ 	                              7       Ԁ               n   n   <                @           @@              E  0   @  
 
- 	                              Ŕ       Ԁ               l   l   <                         @@             E  0   @  
+ 	                              ɔ       Ԁ               n   n   <                @           @@             E  0   @  
 
- 	                                     Ԁ               l   l   <                         @@             E  0   @  
+ 	                                     Ԁ              ! n   n   <                @           @@             E  0   @  
 
- 	                              !       Ԁ               l   l   <                         @@              E  0   @  
+ 	                              1       Ԁ               n   n   <                P           @@              E  0   @  
 
- 	                              e       Ԁ              8 l   l   <                         @@             E  0   @  
+ 	                              i       Ԁ              @ n   n   <                P           @@             E  0   @  
 
- 	                              2       Ԁ                l   l   <                         @@             E  0   @  
+ 	                              B       Ԁ                n   n   <                P           @@             E  0   @  
 
- 	                                      Ԁ                l   l                        @@              E  0   @  
+ 	                              )        Ԁ                n   n               0           @@              E  0   @  
 
- 	                               l   l                        @@             E  0   @  
+ 	                               n   n               0           @@             E  0   @  
 
- 	                              ?       Ԁ              5 <   <                   @@  	              ` <   <                   @@  	              w l   l   <                        @@  
+ 	                              O       Ԁ              I >   >          @           @@  	              t >   >          @           @@  	               n   n   <                `           @@  
            E  0   @  
 
- 	                                     Ԁ              '	 l   l   <                         @@   	           E  0   @  
+ 	                                     Ԁ              '	 n   n   <                `           @@   	           E  0   @  
 
- 	                              (	       Ԁ              x)	 l   l   <                         @@  	           E  0   @  
+ 	                              (	       Ԁ              )	 n   n   <                `           @@  	           E  0   @  
 
- 	                              *	       Ԁ              +	 l   l   <                0        @@             E  0   @  
+ 	                              *	       Ԁ              +	 n   n   <                p           @@             E  0   @  
 
- 	                              +	       Ԁ              `
- l   l   <                         @@   
+ 	                              +	       Ԁ              `
+ n   n   <                p           @@   
            E  0   @  
 
- 	                              E
-       Ԁ              
- l   l   <                @        @@  
+ 	                              I
+       Ԁ               
+ n   n   <                p           @@  
            E  0   @  
 
- 	                              d
-       Ԁ              @
- l   l   <                P        @@             E  0   @  
+ 	                              p
+       Ԁ              P
+ n   n   <                           @@             E  0   @  
 
- 	                              P
-       Ԁ           	    5 l   l   <                         @@              E  0   @  
+ 	                              `
+       Ԁ           	    5 n   n   <                           @@              E  0   @  
 
- 	                           	   96 l   l   <                         @@              E  0   @  
+ 	                           	   =6 n   n   <                           @@              E  0   @  
 
- 	                           	   7       Ԁ           	   7 l   l   <                `        @@             E  0   @  
+ 	                           	   &7       Ԁ           	   7 n   n   <                           @@             E  0   @  
 
- 	                           	   9 l   l   <                `        @@             E  0   @  
+ 	                           	   9 n   n   <                           @@             E  0   @  
 
- 	                           	   :       Ԁ           	   ; l   l   <                p        @@             E  0   @  
-
- 	                           	   ;       Ԁ           
\ No newline at end of file
+ 	                           
\ No newline at end of file
diff -Naur ns-3.23/src/mesh/wscript ns-3.24/src/mesh/wscript
--- ns-3.23/src/mesh/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mesh/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -1,7 +1,7 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 def build(bld):
-    obj = bld.create_ns3_module('mesh', ['internet', 'wifi', 'applications'])
+    obj = bld.create_ns3_module('mesh', ['internet', 'wifi'])
 
     obj.source = [
         'model/mesh-information-element-vector.cc',
@@ -34,6 +34,7 @@
         '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',
         ]
@@ -56,7 +57,6 @@
     headers = bld(features='ns3header')
     headers.module = 'mesh'
     headers.source = [
-        'model/mesh-information-element.h',
         'model/mesh-information-element-vector.h',
         'model/mesh-point-device.h',
         'model/mesh-l2-routing-protocol.h',
diff -Naur ns-3.23/src/mobility/bindings/modulegen__gcc_ILP32.py ns-3.24/src/mobility/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/mobility/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mobility/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -297,6 +297,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -332,6 +338,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -612,11 +625,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3ConstantVelocityHelper_methods(root_module, cls):
@@ -2859,11 +2867,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2973,10 +2991,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -4639,6 +4657,7 @@
                         [])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -4651,6 +4670,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/mobility/bindings/modulegen__gcc_LP64.py ns-3.24/src/mobility/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/mobility/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mobility/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -297,6 +297,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -332,6 +338,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -612,11 +625,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3ConstantVelocityHelper_methods(root_module, cls):
@@ -2859,11 +2867,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2973,10 +2991,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -4639,6 +4657,7 @@
                         [])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -4651,6 +4670,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/mobility/model/geographic-positions.cc ns-3.24/src/mobility/model/geographic-positions.cc
--- ns-3.23/src/mobility/model/geographic-positions.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mobility/model/geographic-positions.cc	2015-09-15 11:18:44.000000000 -0700
@@ -26,7 +26,7 @@
 
 namespace ns3 {
 
-// earth's radius in meters if modeled as a perfect sphere
+/// Earth's radius in meters if modeled as a perfect sphere
 static const double EARTH_RADIUS = 6371e3; 
 
 /**
@@ -40,13 +40,13 @@
  * <http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf>.
  */
 
-// earth's semi-major axis in meters as defined by both GRS80 and WGS84
+/// Earth's semi-major axis in meters as defined by both GRS80 and WGS84
 static const double EARTH_SEMIMAJOR_AXIS = 6378137;
 
-// earth's first eccentricity as defined by GRS80
+/// Earth's first eccentricity as defined by GRS80
 static const double EARTH_GRS80_ECCENTRICITY = 0.0818191910428158;
 
-// earth's first eccentricity as defined by WGS84
+/// Earth's first eccentricity as defined by WGS84
 static const double EARTH_WGS84_ECCENTRICITY = 0.0818191908426215;
 
 Vector
diff -Naur ns-3.23/src/mobility/model/mobility.h ns-3.24/src/mobility/model/mobility.h
--- ns-3.23/src/mobility/model/mobility.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mobility/model/mobility.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2006,2007 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>
+ */
+
 /**
  * @defgroup mobility Mobility
  */
diff -Naur ns-3.23/src/mobility/model/mobility-model.cc ns-3.24/src/mobility/model/mobility-model.cc
--- ns-3.23/src/mobility/model/mobility-model.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mobility/model/mobility-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -47,7 +47,7 @@
     .AddTraceSource ("CourseChange", 
                      "The value of the position and/or velocity vector changed",
                      MakeTraceSourceAccessor (&MobilityModel::m_courseChangeTrace),
-                     "ns3::MobilityModel::CourseChangeTracedCallback")
+                     "ns3::MobilityModel::TracedCallback")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/mobility/model/mobility-model.h ns-3.24/src/mobility/model/mobility-model.h
--- ns-3.23/src/mobility/model/mobility-model.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mobility/model/mobility-model.h	2015-09-15 11:18:44.000000000 -0700
@@ -83,22 +83,8 @@
    *  TracedCallback signature.
    *
    * \param [in] model Value of the MobilityModel.
-   * @{
    */
-  typedef void (* TracedCallback)(const Ptr<const MobilityModel> model);
-  
-  /**
-   * TracedCallback signature for course change notifications.
-   *
-   * If the callback is connected using Config::ConnectWithoutContext()
-   * omit the \c context argument from the signature.
-   *
-   * \param [in] context The context string, supplied by the Trace source.
-   * \param [in] model The MobilityModel which is changing course.
-   */
-  typedef void (* CourseChangeTracedCallback)
-    (const std::string context, const Ptr<const MobilityModel> model);
-  
+  typedef void (* TracedCallback)(Ptr<const MobilityModel> model);
   
 protected:
   /**
diff -Naur ns-3.23/src/mobility/model/steady-state-random-waypoint-mobility-model.cc ns-3.24/src/mobility/model/steady-state-random-waypoint-mobility-model.cc
--- ns-3.23/src/mobility/model/steady-state-random-waypoint-mobility-model.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mobility/model/steady-state-random-waypoint-mobility-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -115,13 +115,17 @@
   m_speed->SetAttribute ("Max", DoubleValue (m_maxSpeed));
   NS_ASSERT (m_minX < m_maxX);
   NS_ASSERT (m_minY < m_maxY);
-  m_position = CreateObject<RandomRectanglePositionAllocator> ();
+  m_position = CreateObject<RandomBoxPositionAllocator> ();
   m_x->SetAttribute ("Min", DoubleValue (m_minX));
   m_x->SetAttribute ("Max", DoubleValue (m_maxX));
   m_y->SetAttribute ("Min", DoubleValue (m_minY));
   m_y->SetAttribute ("Max", DoubleValue (m_maxY));
   m_position->SetX (m_x);
   m_position->SetY (m_y);
+  Ptr<ConstantRandomVariable> z = CreateObject<ConstantRandomVariable> ();
+  z->SetAttribute ("Constant", DoubleValue (m_z));
+  m_position->SetZ (z);
+
   NS_ASSERT (m_minPause <= m_maxPause);
   m_pause->SetAttribute ("Min", DoubleValue (m_minPause));
   m_pause->SetAttribute ("Max", DoubleValue (m_maxPause));
diff -Naur ns-3.23/src/mobility/model/steady-state-random-waypoint-mobility-model.h ns-3.24/src/mobility/model/steady-state-random-waypoint-mobility-model.h
--- ns-3.23/src/mobility/model/steady-state-random-waypoint-mobility-model.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mobility/model/steady-state-random-waypoint-mobility-model.h	2015-09-15 11:18:44.000000000 -0700
@@ -98,7 +98,7 @@
   double m_minY; //!< minimum y value of traveling region (m)
   double m_maxY; //!< maximum y value of traveling region (m)
   double m_z; //!< z value of traveling region
-  Ptr<RandomRectanglePositionAllocator> m_position; //!< position allocator
+  Ptr<RandomBoxPositionAllocator> m_position; //!< position allocator
   double m_minPause; //!< minimum pause value (s)
   double m_maxPause; //!< maximum pause value (s)
   Ptr<UniformRandomVariable> m_pause; //!< random variable for pause values
diff -Naur ns-3.23/src/mpi/bindings/modulegen__gcc_ILP32.py ns-3.24/src/mpi/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/mpi/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mpi/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -20,6 +20,10 @@
 def register_types(module):
     root_module = module.get_root()
     
+    ## address.h (module 'network'): ns3::Address [class]
+    module.add_class('Address', import_from_module='ns.network')
+    ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
+    module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
     ## 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]
@@ -42,6 +46,22 @@
     module.add_class('CallbackBase', 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]
+    module.add_class('Ipv4Address', import_from_module='ns.network')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
+    module.add_class('Ipv4Mask', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    module.add_class('Ipv6Address', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
+    module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## mpi-interface.h (module 'mpi'): ns3::MpiInterface [class]
     module.add_class('MpiInterface')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
@@ -138,6 +158,26 @@
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
     module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
+    module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
+    module.add_class('Ipv4AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker [class]
+    module.add_class('Ipv4MaskChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue [class]
+    module.add_class('Ipv4MaskValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker [class]
+    module.add_class('Ipv6AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue [class]
+    module.add_class('Ipv6AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker [class]
+    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'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver [class]
     module.add_class('MpiReceiver', parent=root_module['ns3::Object'])
     ## nix-vector.h (module 'network'): ns3::NixVector [class]
@@ -150,6 +190,10 @@
     module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdValue [class]
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## address.h (module 'network'): ns3::AddressChecker [class]
+    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'])
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -162,6 +206,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -197,7 +247,15 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
+    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_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
@@ -209,6 +267,11 @@
     register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
+    register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
+    register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3MpiInterface_methods(root_module, root_module['ns3::MpiInterface'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
@@ -251,12 +314,24 @@
     register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
+    register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
+    register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
+    register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
+    register_Ns3Ipv4MaskValue_methods(root_module, root_module['ns3::Ipv4MaskValue'])
+    register_Ns3Ipv6AddressChecker_methods(root_module, root_module['ns3::Ipv6AddressChecker'])
+    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_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     register_Ns3MpiReceiver_methods(root_module, root_module['ns3::MpiReceiver'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
     register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+    register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
+    register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     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'])
@@ -264,6 +339,76 @@
     register_Ns3HashFunctionMurmur3_methods(root_module, root_module['ns3::Hash::Function::Murmur3'])
     return
 
+def register_Ns3Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## address.h (module 'network'): ns3::Address::Address() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::Address::Address(uint8_t type, uint8_t const * buffer, uint8_t len) [constructor]
+    cls.add_constructor([param('uint8_t', 'type'), param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): ns3::Address::Address(ns3::Address const & address) [copy constructor]
+    cls.add_constructor([param('ns3::Address const &', 'address')])
+    ## address.h (module 'network'): bool ns3::Address::CheckCompatible(uint8_t type, uint8_t len) const [member function]
+    cls.add_method('CheckCompatible', 
+                   'bool', 
+                   [param('uint8_t', 'type'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyAllFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllTo(uint8_t * buffer, uint8_t len) const [member function]
+    cls.add_method('CopyAllTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## address.h (module 'network'): void ns3::Address::Deserialize(ns3::TagBuffer buffer) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')])
+    ## address.h (module 'network'): uint8_t ns3::Address::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsInvalid() const [member function]
+    cls.add_method('IsInvalid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsMatchingType(uint8_t type) const [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('uint8_t', 'type')], 
+                   is_const=True)
+    ## address.h (module 'network'): static uint8_t ns3::Address::Register() [member function]
+    cls.add_method('Register', 
+                   'uint8_t', 
+                   [], 
+                   is_static=True)
+    ## address.h (module 'network'): void ns3::Address::Serialize(ns3::TagBuffer buffer) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')], 
+                   is_const=True)
+    return
+
 def register_Ns3AttributeConstructionList_methods(root_module, cls):
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList(ns3::AttributeConstructionList const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::AttributeConstructionList const &', 'arg0')])
@@ -312,17 +457,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -344,11 +489,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -358,16 +498,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -605,14 +735,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -673,11 +807,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -709,6 +838,506 @@
                    [])
     return
 
+def register_Ns3Ipv4Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(ns3::Ipv4Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(uint32_t address) [constructor]
+    cls.add_constructor([param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::CombineMask(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('CombineMask', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv4Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Address::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::GetSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('GetSubnetDirectedBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const &', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsLocalMulticast() const [member function]
+    cls.add_method('IsLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static bool ns3::Ipv4Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('IsSubnetDirectedBroadcast', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(uint32_t address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    return
+
+def register_Ns3Ipv4Mask_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(ns3::Ipv4Mask const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(uint32_t mask) [constructor]
+    cls.add_constructor([param('uint32_t', 'mask')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(char const * mask) [constructor]
+    cls.add_constructor([param('char const *', 'mask')])
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::GetInverse() const [member function]
+    cls.add_method('GetInverse', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint16_t ns3::Ipv4Mask::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsMatch(ns3::Ipv4Address a, ns3::Ipv4Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'a'), param('ns3::Ipv4Address', 'b')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Set(uint32_t mask) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'mask')])
+    return
+
+def register_Ns3Ipv6Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(uint8_t * address) [constructor]
+    cls.add_constructor([param('uint8_t *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const & addr) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const * addr) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const *', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Address::CombinePrefix(ns3::Ipv6Prefix const & prefix) [member function]
+    cls.add_method('CombinePrefix', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv6Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllHostsMulticast() [member function]
+    cls.add_method('GetAllHostsMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllNodesMulticast() [member function]
+    cls.add_method('GetAllNodesMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllRoutersMulticast() [member function]
+    cls.add_method('GetAllRoutersMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv6Address::GetIpv4MappedAddress() const [member function]
+    cls.add_method('GetIpv4MappedAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllHostsMulticast() const [member function]
+    cls.add_method('IsAllHostsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllNodesMulticast() const [member function]
+    cls.add_method('IsAllNodesMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllRoutersMulticast() const [member function]
+    cls.add_method('IsAllRoutersMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAny() const [member function]
+    cls.add_method('IsAny', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsDocumentation() const [member function]
+    cls.add_method('IsDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Address const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
+    cls.add_method('IsIpv4MappedAddress', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
+    cls.add_method('IsLinkLocal', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocalMulticast() const [member function]
+    cls.add_method('IsLinkLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLocalhost() const [member function]
+    cls.add_method('IsLocalhost', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static bool ns3::Ipv6Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsSolicitedMulticast() const [member function]
+    cls.add_method('IsSolicitedMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac48Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac64Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac16Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac48Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac64Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeIpv4MappedAddress(ns3::Ipv4Address addr) [member function]
+    cls.add_method('MakeIpv4MappedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv4Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeSolicitedAddress(ns3::Ipv6Address addr) [member function]
+    cls.add_method('MakeSolicitedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(uint8_t * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t *', 'address')])
+    return
+
+def register_Ns3Ipv6Prefix_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t * prefix) [constructor]
+    cls.add_constructor([param('uint8_t *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(char const * prefix) [constructor]
+    cls.add_constructor([param('char const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t prefix) [constructor]
+    cls.add_constructor([param('uint8_t', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const & prefix) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): uint8_t ns3::Ipv6Prefix::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Prefix const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsMatch(ns3::Ipv6Address a, ns3::Ipv6Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'a'), param('ns3::Ipv6Address', 'b')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3MpiInterface_methods(root_module, cls):
     ## mpi-interface.h (module 'mpi'): ns3::MpiInterface::MpiInterface() [constructor]
     cls.add_constructor([])
@@ -1008,7 +1637,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2029,11 +2658,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2086,6 +2725,206 @@
                    is_const=True, visibility='private', is_virtual=True)
     return
 
+def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4AddressValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Address const &', 'value')])
+    return
+
+def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4MaskValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Mask const &', 'value')])
+    return
+
+def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6AddressValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Address const &', 'value')])
+    return
+
+def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Prefix const &', 'value')])
+    return
+
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3MpiReceiver_methods(root_module, cls):
     ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver::MpiReceiver() [constructor]
     cls.add_constructor([])
@@ -2413,6 +3252,46 @@
                    [param('ns3::TypeId const &', 'value')])
     return
 
+def register_Ns3AddressChecker_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3AddressValue_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Address const &', 'value')])
+    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Address const &', 'value')])
+    return
+
 def register_Ns3HashImplementation_methods(root_module, cls):
     ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation(ns3::Hash::Implementation const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Hash::Implementation const &', 'arg0')])
@@ -2522,6 +3401,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -2534,6 +3414,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/mpi/bindings/modulegen__gcc_LP64.py ns-3.24/src/mpi/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/mpi/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mpi/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -20,6 +20,10 @@
 def register_types(module):
     root_module = module.get_root()
     
+    ## address.h (module 'network'): ns3::Address [class]
+    module.add_class('Address', import_from_module='ns.network')
+    ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
+    module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
     ## 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]
@@ -42,6 +46,22 @@
     module.add_class('CallbackBase', 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]
+    module.add_class('Ipv4Address', import_from_module='ns.network')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
+    module.add_class('Ipv4Mask', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    module.add_class('Ipv6Address', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
+    module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## mpi-interface.h (module 'mpi'): ns3::MpiInterface [class]
     module.add_class('MpiInterface')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
@@ -138,6 +158,26 @@
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
     module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
+    module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
+    module.add_class('Ipv4AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker [class]
+    module.add_class('Ipv4MaskChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue [class]
+    module.add_class('Ipv4MaskValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker [class]
+    module.add_class('Ipv6AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue [class]
+    module.add_class('Ipv6AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker [class]
+    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'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver [class]
     module.add_class('MpiReceiver', parent=root_module['ns3::Object'])
     ## nix-vector.h (module 'network'): ns3::NixVector [class]
@@ -150,6 +190,10 @@
     module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdValue [class]
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## address.h (module 'network'): ns3::AddressChecker [class]
+    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'])
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -162,6 +206,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -197,7 +247,15 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
+    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_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
@@ -209,6 +267,11 @@
     register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
+    register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
+    register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3MpiInterface_methods(root_module, root_module['ns3::MpiInterface'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
@@ -251,12 +314,24 @@
     register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
+    register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
+    register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
+    register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
+    register_Ns3Ipv4MaskValue_methods(root_module, root_module['ns3::Ipv4MaskValue'])
+    register_Ns3Ipv6AddressChecker_methods(root_module, root_module['ns3::Ipv6AddressChecker'])
+    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_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     register_Ns3MpiReceiver_methods(root_module, root_module['ns3::MpiReceiver'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
     register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+    register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
+    register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     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'])
@@ -264,6 +339,76 @@
     register_Ns3HashFunctionMurmur3_methods(root_module, root_module['ns3::Hash::Function::Murmur3'])
     return
 
+def register_Ns3Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## address.h (module 'network'): ns3::Address::Address() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::Address::Address(uint8_t type, uint8_t const * buffer, uint8_t len) [constructor]
+    cls.add_constructor([param('uint8_t', 'type'), param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): ns3::Address::Address(ns3::Address const & address) [copy constructor]
+    cls.add_constructor([param('ns3::Address const &', 'address')])
+    ## address.h (module 'network'): bool ns3::Address::CheckCompatible(uint8_t type, uint8_t len) const [member function]
+    cls.add_method('CheckCompatible', 
+                   'bool', 
+                   [param('uint8_t', 'type'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyAllFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllTo(uint8_t * buffer, uint8_t len) const [member function]
+    cls.add_method('CopyAllTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## address.h (module 'network'): void ns3::Address::Deserialize(ns3::TagBuffer buffer) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')])
+    ## address.h (module 'network'): uint8_t ns3::Address::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsInvalid() const [member function]
+    cls.add_method('IsInvalid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsMatchingType(uint8_t type) const [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('uint8_t', 'type')], 
+                   is_const=True)
+    ## address.h (module 'network'): static uint8_t ns3::Address::Register() [member function]
+    cls.add_method('Register', 
+                   'uint8_t', 
+                   [], 
+                   is_static=True)
+    ## address.h (module 'network'): void ns3::Address::Serialize(ns3::TagBuffer buffer) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')], 
+                   is_const=True)
+    return
+
 def register_Ns3AttributeConstructionList_methods(root_module, cls):
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList(ns3::AttributeConstructionList const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::AttributeConstructionList const &', 'arg0')])
@@ -312,17 +457,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -344,11 +489,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -358,16 +498,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -605,14 +735,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -673,11 +807,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -709,6 +838,506 @@
                    [])
     return
 
+def register_Ns3Ipv4Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(ns3::Ipv4Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(uint32_t address) [constructor]
+    cls.add_constructor([param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::CombineMask(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('CombineMask', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv4Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Address::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::GetSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('GetSubnetDirectedBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const &', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsLocalMulticast() const [member function]
+    cls.add_method('IsLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static bool ns3::Ipv4Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('IsSubnetDirectedBroadcast', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(uint32_t address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    return
+
+def register_Ns3Ipv4Mask_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(ns3::Ipv4Mask const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(uint32_t mask) [constructor]
+    cls.add_constructor([param('uint32_t', 'mask')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(char const * mask) [constructor]
+    cls.add_constructor([param('char const *', 'mask')])
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::GetInverse() const [member function]
+    cls.add_method('GetInverse', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint16_t ns3::Ipv4Mask::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsMatch(ns3::Ipv4Address a, ns3::Ipv4Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'a'), param('ns3::Ipv4Address', 'b')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Set(uint32_t mask) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'mask')])
+    return
+
+def register_Ns3Ipv6Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(uint8_t * address) [constructor]
+    cls.add_constructor([param('uint8_t *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const & addr) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const * addr) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const *', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Address::CombinePrefix(ns3::Ipv6Prefix const & prefix) [member function]
+    cls.add_method('CombinePrefix', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv6Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllHostsMulticast() [member function]
+    cls.add_method('GetAllHostsMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllNodesMulticast() [member function]
+    cls.add_method('GetAllNodesMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllRoutersMulticast() [member function]
+    cls.add_method('GetAllRoutersMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv6Address::GetIpv4MappedAddress() const [member function]
+    cls.add_method('GetIpv4MappedAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllHostsMulticast() const [member function]
+    cls.add_method('IsAllHostsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllNodesMulticast() const [member function]
+    cls.add_method('IsAllNodesMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllRoutersMulticast() const [member function]
+    cls.add_method('IsAllRoutersMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAny() const [member function]
+    cls.add_method('IsAny', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsDocumentation() const [member function]
+    cls.add_method('IsDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Address const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
+    cls.add_method('IsIpv4MappedAddress', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
+    cls.add_method('IsLinkLocal', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocalMulticast() const [member function]
+    cls.add_method('IsLinkLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLocalhost() const [member function]
+    cls.add_method('IsLocalhost', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static bool ns3::Ipv6Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsSolicitedMulticast() const [member function]
+    cls.add_method('IsSolicitedMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac48Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac64Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac16Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac48Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac64Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeIpv4MappedAddress(ns3::Ipv4Address addr) [member function]
+    cls.add_method('MakeIpv4MappedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv4Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeSolicitedAddress(ns3::Ipv6Address addr) [member function]
+    cls.add_method('MakeSolicitedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(uint8_t * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t *', 'address')])
+    return
+
+def register_Ns3Ipv6Prefix_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t * prefix) [constructor]
+    cls.add_constructor([param('uint8_t *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(char const * prefix) [constructor]
+    cls.add_constructor([param('char const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t prefix) [constructor]
+    cls.add_constructor([param('uint8_t', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const & prefix) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): uint8_t ns3::Ipv6Prefix::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Prefix const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsMatch(ns3::Ipv6Address a, ns3::Ipv6Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'a'), param('ns3::Ipv6Address', 'b')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3MpiInterface_methods(root_module, cls):
     ## mpi-interface.h (module 'mpi'): ns3::MpiInterface::MpiInterface() [constructor]
     cls.add_constructor([])
@@ -1008,7 +1637,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2029,11 +2658,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2086,6 +2725,206 @@
                    is_const=True, visibility='private', is_virtual=True)
     return
 
+def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4AddressValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Address const &', 'value')])
+    return
+
+def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4MaskValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Mask const &', 'value')])
+    return
+
+def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6AddressValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Address const &', 'value')])
+    return
+
+def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Prefix const &', 'value')])
+    return
+
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3MpiReceiver_methods(root_module, cls):
     ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver::MpiReceiver() [constructor]
     cls.add_constructor([])
@@ -2413,6 +3252,46 @@
                    [param('ns3::TypeId const &', 'value')])
     return
 
+def register_Ns3AddressChecker_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3AddressValue_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Address const &', 'value')])
+    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Address const &', 'value')])
+    return
+
 def register_Ns3HashImplementation_methods(root_module, cls):
     ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation(ns3::Hash::Implementation const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Hash::Implementation const &', 'arg0')])
@@ -2522,6 +3401,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -2534,6 +3414,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/mpi/examples/third-distributed.cc ns-3.24/src/mpi/examples/third-distributed.cc
--- ns-3.23/src/mpi/examples/third-distributed.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mpi/examples/third-distributed.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,26 +15,24 @@
  */
 
 #include "ns3/core-module.h"
+#include "ns3/point-to-point-module.h"
 #include "ns3/network-module.h"
+#include "ns3/applications-module.h"
 #include "ns3/wifi-module.h"
 #include "ns3/mobility-module.h"
-#include "ns3/mpi-interface.h"
-#include "ns3/ipv4-global-routing-helper.h"
-#include "ns3/udp-echo-helper.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/csma-helper.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/ipv4-interface-container.h"
+#include "ns3/csma-module.h"
+#include "ns3/internet-module.h"
 
-#ifdef NS3_MPI
-#include <mpi.h>
-#endif
+#include "ns3/mpi-module.h"
 
-// Default Network Topology (same as third.cc from tutorial)
+// Default Network Topology
+//
+// (same as third.cc from tutorial)
 // Distributed simulation, split along the p2p link
 // Number of wifi or csma nodes can be increased up to 250
-//
+//                          |
+//                 Rank 0   |   Rank 1
+// -------------------------|----------------------------
 //   Wifi 10.1.3.0
 //                 AP
 //  *    *    *    *
@@ -42,10 +40,7 @@
 // n5   n6   n7   n0 -------------- n1   n2   n3   n4
 //                   point-to-point  |    |    |    |
 //                                   ================
-//                          |          LAN 10.1.2.0
-//                          |
-//                 Rank 0   |   Rank 1
-// -------------------------|----------------------------
+//                                     LAN 10.1.2.0
 
 using namespace ns3;
 
@@ -54,20 +49,19 @@
 int 
 main (int argc, char *argv[])
 {
-#ifdef NS3_MPI
-
   bool verbose = true;
   uint32_t nCsma = 3;
   uint32_t nWifi = 3;
-  bool nullmsg = false;
   bool tracing = false;
+  bool nullmsg = false;
 
   CommandLine cmd;
   cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
   cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi);
   cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);
-  cmd.AddValue ("nullmsg", "Enable the use of null-message synchronization", nullmsg);
   cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
+  cmd.AddValue ("nullmsg", "Enable the use of null-message synchronization", nullmsg);
+
   cmd.Parse (argc,argv);
 
   // Check for valid number of csma or wifi nodes
@@ -75,7 +69,7 @@
   // soon become an issue
   if (nWifi > 250 || nCsma > 250)
     {
-      std::cout << "Too many wifi or csma nodes, max 200 each." << std::endl;
+      std::cout << "Too many wifi or csma nodes, no more than 250 each." << std::endl;
       return 1;
     }
 
@@ -85,6 +79,12 @@
       LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
     }
 
+  // Sequential fallback values
+  uint32_t systemId = 0;
+  uint32_t systemCount = 1;
+
+#ifdef NS3_MPI
+
   // Distributed simulation setup; by default use granted time window algorithm.
   if(nullmsg) 
     {
@@ -99,8 +99,8 @@
 
   MpiInterface::Enable (&argc, &argv);
 
-  uint32_t systemId = MpiInterface::GetSystemId ();
-  uint32_t systemCount = MpiInterface::GetSize ();
+  systemId = MpiInterface::GetSystemId ();
+  systemCount = MpiInterface::GetSize ();
 
   // Check for valid distributed parameters.
   // Must have 2 and only 2 Logical Processors (LPs)
@@ -110,10 +110,17 @@
       return 1;
     }
 
+#endif // NS3_MPI
 
+  // System id of Wifi side
+  uint32_t systemWifi = 0;
+  
+  // System id of CSMA side
+  uint32_t systemCsma = systemCount - 1;
+  
   NodeContainer p2pNodes;
-  Ptr<Node> p2pNode1 = CreateObject<Node> (0); // Create node with rank 0
-  Ptr<Node> p2pNode2 = CreateObject<Node> (1); // Create node with rank 1
+  Ptr<Node> p2pNode1 = CreateObject<Node> (systemWifi); // Create node with rank 0
+  Ptr<Node> p2pNode2 = CreateObject<Node> (systemCsma); // Create node with rank 1
   p2pNodes.Add (p2pNode1);
   p2pNodes.Add (p2pNode2);
 
@@ -126,7 +133,7 @@
 
   NodeContainer csmaNodes;
   csmaNodes.Add (p2pNodes.Get (1));
-  csmaNodes.Create (nCsma, 1);  // Create csma nodes with rank 1
+  csmaNodes.Create (nCsma, systemCsma);  // Create csma nodes with rank 1
 
   CsmaHelper csma;
   csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
@@ -136,7 +143,7 @@
   csmaDevices = csma.Install (csmaNodes);
 
   NodeContainer wifiStaNodes;
-  wifiStaNodes.Create (nWifi, 0); // Create wifi nodes with rank 0
+  wifiStaNodes.Create (nWifi, systemWifi); // Create wifi nodes with rank 0
   NodeContainer wifiApNode = p2pNodes.Get (0);
 
   YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
@@ -168,12 +175,12 @@
                                  "MinX", DoubleValue (0.0),
                                  "MinY", DoubleValue (0.0),
                                  "DeltaX", DoubleValue (5.0),
-                                 "DeltaY", DoubleValue (5.0),
-                                 "GridWidth", UintegerValue (10),
+                                 "DeltaY", DoubleValue (10.0),
+                                 "GridWidth", UintegerValue (3),
                                  "LayoutType", StringValue ("RowFirst"));
 
   mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
-                             "Bounds", RectangleValue (Rectangle (-250, 250, -250, 250)));
+                             "Bounds", RectangleValue (Rectangle (-50, 50, -50, 50)));
   mobility.Install (wifiStaNodes);
 
   mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
@@ -198,25 +205,26 @@
   address.Assign (staDevices);
   address.Assign (apDevices);
 
-  // If this simulator has system id 1, then 
+  // If this rank is systemCsma, 
   // it should contain the server application, 
   // since it is on one of the csma nodes
-  if (systemId == 1)
+  if (systemId == systemCsma)
     {
       UdpEchoServerHelper echoServer (9);
+
       ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));
       serverApps.Start (Seconds (1.0));
       serverApps.Stop (Seconds (10.0));
     }
 
-  // If the simulator has system id 0, then 
+  // If this rank is systemWifi
   // it should contain the client application, 
   // since it is on one of the wifi nodes
-  if (systemId == 0)
+  if (systemId == systemWifi)
     {
       UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
       echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
-      echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
+      echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
       echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
 
       ApplicationContainer clientApps = 
@@ -235,28 +243,28 @@
       // traced will be different.  For example, the ethernet pcap
       // will be empty for rank0, since these nodes are placed on 
       // on rank 1.  All ethernet traffic will take place on rank 1.
-      // Similar differences are seen in the p2p and wirless pcaps.
-      if (systemId == 0)
+      // Similar differences are seen in the p2p and wireless pcaps.
+      if (systemId == systemWifi)
         {
-          pointToPoint.EnablePcapAll ("third-distributed-rank0");
-          phy.EnablePcap ("third-distributed-rank0", apDevices.Get (0));
-          csma.EnablePcap ("third-distributed-rank0", csmaDevices.Get (0), true);
+          pointToPoint.EnablePcapAll ("third-distributed-wifi");
+          phy.EnablePcap ("third-distributed-wifi", apDevices.Get (0));
+          csma.EnablePcap ("third-distributed-wifi", csmaDevices.Get (0), true);
         }
-      else
+      else // systemCsma
         {
-          pointToPoint.EnablePcapAll ("third-distributed-rank1");
-          phy.EnablePcap ("third-distributed-rank1", apDevices.Get (0));
-          csma.EnablePcap ("third-distributed-rank1", csmaDevices.Get (0), true);
+          pointToPoint.EnablePcapAll ("third-distributed-csma");
+          phy.EnablePcap ("third-distributed-csma", apDevices.Get (0));
+          csma.EnablePcap ("third-distributed-csma", csmaDevices.Get (0), true);
         }
     }
 
   Simulator::Run ();
   Simulator::Destroy ();
+
+#ifdef NS3_MPI
   // Exit the MPI execution environment
   MpiInterface::Disable ();
-  return 0;
-
-#else
-  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
 #endif
+  
+  return 0;
 }
diff -Naur ns-3.23/src/mpi/model/distributed-simulator-impl.cc ns-3.24/src/mpi/model/distributed-simulator-impl.cc
--- ns-3.23/src/mpi/model/distributed-simulator-impl.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mpi/model/distributed-simulator-impl.cc	2015-09-15 11:18:44.000000000 -0700
@@ -82,7 +82,7 @@
 DistributedSimulatorImpl::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::DistributedSimulatorImpl")
-    .SetParent<Object> ()
+    .SetParent<SimulatorImpl> ()
     .SetGroupName ("Mpi")
     .AddConstructor<DistributedSimulatorImpl> ()
   ;
@@ -462,22 +462,22 @@
 }
 
 void
-DistributedSimulatorImpl::Stop (Time const &time)
+DistributedSimulatorImpl::Stop (Time const &delay)
 {
-  NS_LOG_FUNCTION (this << time.GetTimeStep ());
+  NS_LOG_FUNCTION (this << delay.GetTimeStep ());
 
-  Simulator::Schedule (time, &Simulator::Stop);
+  Simulator::Schedule (delay, &Simulator::Stop);
 }
 
 //
 // Schedule an event for a _relative_ time in the future.
 //
 EventId
-DistributedSimulatorImpl::Schedule (Time const &time, EventImpl *event)
+DistributedSimulatorImpl::Schedule (Time const &delay, EventImpl *event)
 {
-  NS_LOG_FUNCTION (this << time.GetTimeStep () << event);
+  NS_LOG_FUNCTION (this << delay.GetTimeStep () << event);
 
-  Time tAbsolute = time + TimeStep (m_currentTs);
+  Time tAbsolute = delay + TimeStep (m_currentTs);
 
   NS_ASSERT (tAbsolute.IsPositive ());
   NS_ASSERT (tAbsolute >= TimeStep (m_currentTs));
@@ -493,13 +493,13 @@
 }
 
 void
-DistributedSimulatorImpl::ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event)
+DistributedSimulatorImpl::ScheduleWithContext (uint32_t context, Time const &delay, EventImpl *event)
 {
-  NS_LOG_FUNCTION (this << context << time.GetTimeStep () << m_currentTs << event);
+  NS_LOG_FUNCTION (this << context << delay.GetTimeStep () << m_currentTs << event);
 
   Scheduler::Event ev;
   ev.impl = event;
-  ev.key.m_ts = m_currentTs + time.GetTimeStep ();
+  ev.key.m_ts = m_currentTs + delay.GetTimeStep ();
   ev.key.m_context = context;
   ev.key.m_uid = m_uid;
   m_uid++;
diff -Naur ns-3.23/src/mpi/model/distributed-simulator-impl.h ns-3.24/src/mpi/model/distributed-simulator-impl.h
--- ns-3.23/src/mpi/model/distributed-simulator-impl.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mpi/model/distributed-simulator-impl.h	2015-09-15 11:18:44.000000000 -0700
@@ -110,9 +110,9 @@
   virtual void Destroy ();
   virtual bool IsFinished (void) const;
   virtual void Stop (void);
-  virtual void Stop (Time const &time);
-  virtual EventId Schedule (Time const &time, EventImpl *event);
-  virtual void ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event);
+  virtual void Stop (Time const &delay);
+  virtual EventId Schedule (Time const &delay, EventImpl *event);
+  virtual void ScheduleWithContext (uint32_t context, Time const &delay, EventImpl *event);
   virtual EventId ScheduleNow (EventImpl *event);
   virtual EventId ScheduleDestroy (EventImpl *event);
   virtual void Remove (const EventId &id);
diff -Naur ns-3.23/src/mpi/model/null-message-simulator-impl.cc ns-3.24/src/mpi/model/null-message-simulator-impl.cc
--- ns-3.23/src/mpi/model/null-message-simulator-impl.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mpi/model/null-message-simulator-impl.cc	2015-09-15 11:18:44.000000000 -0700
@@ -54,7 +54,7 @@
 NullMessageSimulatorImpl::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::NullMessageSimulatorImpl")
-    .SetParent<Object> ()
+    .SetParent<SimulatorImpl> ()
     .SetGroupName ("Mpi")
     .AddConstructor<NullMessageSimulatorImpl> ()
     .AddAttribute ("SchedulerTune", "Null Message scheduler tuning parameter",
@@ -266,9 +266,9 @@
 {
   NS_LOG_FUNCTION (this << bundle);
 
-  Time time (m_schedulerTune * bundle->GetDelay ().GetTimeStep ());
+  Time delay (m_schedulerTune * bundle->GetDelay ().GetTimeStep ());
 
-  bundle->SetEventId (Simulator::Schedule (time, &NullMessageSimulatorImpl::NullMessageEventHandler, 
+  bundle->SetEventId (Simulator::Schedule (delay, &NullMessageSimulatorImpl::NullMessageEventHandler, 
                                            this, PeekPointer(bundle)));
 }
 
@@ -279,9 +279,9 @@
 
   Simulator::Cancel (bundle->GetEventId ());
 
-  Time time (m_schedulerTune * bundle->GetDelay ().GetTimeStep ());
+  Time delay (m_schedulerTune * bundle->GetDelay ().GetTimeStep ());
 
-  bundle->SetEventId (Simulator::Schedule (time, &NullMessageSimulatorImpl::NullMessageEventHandler, 
+  bundle->SetEventId (Simulator::Schedule (delay, &NullMessageSimulatorImpl::NullMessageEventHandler, 
                                            this, PeekPointer(bundle)));
 }
 
@@ -389,22 +389,22 @@
 }
 
 void
-NullMessageSimulatorImpl::Stop (Time const &time)
+NullMessageSimulatorImpl::Stop (Time const &delay)
 {
-  NS_LOG_FUNCTION (this << time.GetTimeStep ());
+  NS_LOG_FUNCTION (this << delay.GetTimeStep ());
 
-  Simulator::Schedule (time, &Simulator::Stop);
+  Simulator::Schedule (delay, &Simulator::Stop);
 }
 
 //
 // Schedule an event for a _relative_ time in the future.
 //
 EventId
-NullMessageSimulatorImpl::Schedule (Time const &time, EventImpl *event)
+NullMessageSimulatorImpl::Schedule (Time const &delay, EventImpl *event)
 {
-  NS_LOG_FUNCTION (this << time.GetTimeStep () << event);
+  NS_LOG_FUNCTION (this << delay.GetTimeStep () << event);
 
-  Time tAbsolute = time + TimeStep (m_currentTs);
+  Time tAbsolute = delay + TimeStep (m_currentTs);
 
   NS_ASSERT (tAbsolute.IsPositive ());
   NS_ASSERT (tAbsolute >= TimeStep (m_currentTs));
@@ -420,11 +420,11 @@
 }
 
 void
-NullMessageSimulatorImpl::ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event)
+NullMessageSimulatorImpl::ScheduleWithContext (uint32_t context, Time const &delay, EventImpl *event)
 {
-  NS_LOG_FUNCTION (this << context << time.GetTimeStep () << m_currentTs << event);
+  NS_LOG_FUNCTION (this << context << delay.GetTimeStep () << m_currentTs << event);
 
-  Time tAbsolute(m_currentTs + time.GetTimeStep ());
+  Time tAbsolute(m_currentTs + delay.GetTimeStep ());
 
   NS_ASSERT (tAbsolute.IsPositive ());
   NS_ASSERT (tAbsolute >= TimeStep (m_currentTs));
diff -Naur ns-3.23/src/mpi/model/null-message-simulator-impl.h ns-3.24/src/mpi/model/null-message-simulator-impl.h
--- ns-3.23/src/mpi/model/null-message-simulator-impl.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/mpi/model/null-message-simulator-impl.h	2015-09-15 11:18:44.000000000 -0700
@@ -55,9 +55,9 @@
   virtual void Destroy ();
   virtual bool IsFinished (void) const;
   virtual void Stop (void);
-  virtual void Stop (Time const &time);
-  virtual EventId Schedule (Time const &time, EventImpl *event);
-  virtual void ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event);
+  virtual void Stop (Time const &delay);
+  virtual EventId Schedule (Time const &delay, EventImpl *event);
+  virtual void ScheduleWithContext (uint32_t context, Time const &delay, EventImpl *event);
   virtual EventId ScheduleNow (EventImpl *event);
   virtual EventId ScheduleDestroy (EventImpl *event);
   virtual void Remove (const EventId &id);
diff -Naur ns-3.23/src/netanim/model/animation-interface.cc ns-3.24/src/netanim/model/animation-interface.cc
--- ns-3.23/src/netanim/model/animation-interface.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/netanim/model/animation-interface.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,4 +1,6 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indeni * This program is free software; you can redistribute it and/or modify
+/* -*- 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;
  *
@@ -1986,8 +1988,9 @@
 
 // XML 
 
-AnimationInterface::AnimXmlElement::AnimXmlElement (std::string tagName):
-                                m_tagName (tagName)
+AnimationInterface::AnimXmlElement::AnimXmlElement (std::string tagName, bool emptyElement):
+                                m_tagName (tagName),
+                                m_emptyElement (emptyElement)
 {
   m_elementString = "<" + tagName + " ";
 }
@@ -2010,6 +2013,19 @@
 }
 
 void
+AnimationInterface::AnimXmlElement::CloseElement ()
+{
+  if (m_emptyElement)
+    {
+      m_elementString += "/>\n";
+    }
+  else
+   {
+     m_elementString += "</" + m_tagName + ">\n";
+   }
+}
+
+void
 AnimationInterface::AnimXmlElement::CloseTag ()
 {
   m_elementString += ">";
@@ -2075,7 +2091,7 @@
   element.AddAttribute ("sysId", sysId);
   element.AddAttribute ("locX", locX);
   element.AddAttribute ("locY", locY);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
@@ -2087,7 +2103,7 @@
   element.AddAttribute ("fromId", fromId);
   element.AddAttribute ("toId", toId);
   element.AddAttribute ("ld", linkDescription);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
@@ -2117,7 +2133,7 @@
   element.AddAttribute ("fd", lprop.fromNodeDescription); 
   element.AddAttribute ("td", lprop.toNodeDescription); 
   element.AddAttribute ("ld", lprop.linkDescription); 
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
@@ -2128,14 +2144,15 @@
   element.AddAttribute ("t", Simulator::Now ().GetSeconds ());
   element.AddAttribute ("id", nodeId);
   element.AddAttribute ("info", routingInfo.c_str ());
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_routingF);
 }
 
 void 
 AnimationInterface::WriteXmlRp (uint32_t nodeId, std::string destination, Ipv4RoutePathElements rpElements)
 {
-  AnimXmlElement element ("rp");
+  std::string tagName = "rp";
+  AnimXmlElement element (tagName, false);
   element.AddAttribute ("t", Simulator::Now ().GetSeconds ());
   element.AddAttribute ("id", nodeId);
   element.AddAttribute ("d", destination.c_str ());
@@ -2150,9 +2167,10 @@
       AnimXmlElement rpeElement ("rpe");
       rpeElement.AddAttribute ("n", rpElement.nodeId);
       rpeElement.AddAttribute ("nH", rpElement.nextHop.c_str ());
-      rpeElement.Close ();
+      rpeElement.CloseElement ();
       element.Add (rpeElement);
     }
+  element.CloseElement ();
   WriteN (element.GetElementString (),  m_routingF);
 }
 
@@ -2168,7 +2186,7 @@
     {
       element.AddAttribute ("meta-info", metaInfo.c_str ());
     }
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (),  m_f);
 }
 
@@ -2180,7 +2198,7 @@
   element.AddAttribute ("tId", tId);
   element.AddAttribute ("fbRx", fbRx);
   element.AddAttribute ("lbRx", lbRx);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (),  m_f);
 }
 
@@ -2199,7 +2217,7 @@
   element.AddAttribute ("tId", tId);
   element.AddAttribute ("fbRx", fbRx);
   element.AddAttribute ("lbRx", lbRx);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (),  m_f);
 }
 
@@ -2210,7 +2228,7 @@
   element.AddAttribute ("ncId", nodeCounterId);
   element.AddAttribute ("n", counterName);
   element.AddAttribute ("t", CounterTypeToString (counterType));
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
@@ -2220,7 +2238,7 @@
   AnimXmlElement element ("res");
   element.AddAttribute ("rid", resourceId);
   element.AddAttribute ("p", resourcePath);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
@@ -2232,7 +2250,7 @@
   element.AddAttribute ("t", Simulator::Now ().GetSeconds ());
   element.AddAttribute ("id", nodeId);
   element.AddAttribute ("rid", resourceId);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
@@ -2245,7 +2263,7 @@
   element.AddAttribute ("id", nodeId);
   element.AddAttribute ("w", width);
   element.AddAttribute ("h", height);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (),  m_f);
 }
 
@@ -2258,7 +2276,7 @@
   element.AddAttribute ("id", nodeId);
   element.AddAttribute ("x", x);
   element.AddAttribute ("y", y);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
@@ -2272,7 +2290,7 @@
   element.AddAttribute ("r", (uint32_t) r);
   element.AddAttribute ("g", (uint32_t) g);
   element.AddAttribute ("b", (uint32_t) b);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
@@ -2287,7 +2305,7 @@
     {
       element.AddAttribute ("descr", m_nodeDescriptions[nodeId]); 
     }
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
@@ -2300,7 +2318,7 @@
   element.AddAttribute ("i", nodeId);
   element.AddAttribute ("t", Simulator::Now ().GetSeconds ());
   element.AddAttribute ("v", counterValue);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
@@ -2314,7 +2332,7 @@
   element.AddAttribute ("sx", scaleX);
   element.AddAttribute ("sy", scaleY);
   element.AddAttribute ("o", opacity);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
@@ -2325,7 +2343,7 @@
   element.AddAttribute ("id", id);
   element.AddAttribute ("ipv4Address", ipv4Address);
   element.AddAttribute ("channelType", channelType);
-  element.Close ();
+  element.CloseElement ();
   WriteN (element.GetElementString (), m_f);
 }
 
diff -Naur ns-3.23/src/netanim/model/animation-interface.h ns-3.24/src/netanim/model/animation-interface.h
--- ns-3.23/src/netanim/model/animation-interface.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/netanim/model/animation-interface.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,4 @@
+/* -*- 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
@@ -517,10 +518,11 @@
   class AnimXmlElement
   {
     public:
-    AnimXmlElement (std::string tagName);
+    AnimXmlElement (std::string tagName, bool emptyElement=true);
     template <typename T>
     void AddAttribute (std::string attribute, T value);
     void Close ();
+    void CloseElement ();
     void CloseTag ();
     void AddLineBreak ();
     void Add (AnimXmlElement e);
@@ -528,6 +530,7 @@
   private:
     std::string m_tagName;
     std::string m_elementString;
+    bool m_emptyElement;
 
   };
 
diff -Naur ns-3.23/src/netanim/wscript ns-3.24/src/netanim/wscript
--- ns-3.23/src/netanim/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/netanim/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -5,24 +5,15 @@
 # Required NetAnim version
 NETANIM_RELEASE_NAME = "netanim-3.106"
 
-
 def build (bld) :
-	module = bld.create_ns3_module ('netanim', ['internet', 'mobility', 'wimax', 'wifi', 'csma', 'lte', 'uan', 'energy'])
-	module.includes = '.'
-	module.source = [
-			  'model/animation-interface.cc',
-		        ]
-    	netanim_test = bld.create_ns3_module_test_library('netanim')
-    	netanim_test.source = [
-        	'test/netanim-test.cc',
-        ]
-
-	headers = bld(features='ns3header')
-	headers.module = 'netanim'
-	headers.source = [
-			  'model/animation-interface.h',
-  			 ]
-
-	if (bld.env['ENABLE_EXAMPLES']) :
-		bld.recurse('examples')
+    module = bld.create_ns3_module ('netanim', ['internet', 'mobility', 'wimax', 'wifi', 'csma', 'lte', 'uan', 'energy'])
+    module.includes = '.'
+    module.source = [ 'model/animation-interface.cc', ]
+    netanim_test = bld.create_ns3_module_test_library('netanim')
+    netanim_test.source = ['test/netanim-test.cc', ]
+    headers = bld(features='ns3header')
+    headers.module = 'netanim'
+    headers.source = ['model/animation-interface.h', ]
+    if (bld.env['ENABLE_EXAMPLES']) :
+       bld.recurse('examples')
 
diff -Naur ns-3.23/src/network/bindings/modulegen__gcc_ILP32.py ns-3.24/src/network/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/network/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -106,6 +106,8 @@
     module.add_class('NodeContainer')
     ## node-list.h (module 'network'): ns3::NodeList [class]
     module.add_class('NodeList')
+    ## 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]
@@ -145,7 +147,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'])
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'])
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True)
     ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned int, int> [class]
@@ -212,6 +214,16 @@
     module.add_enum('', ['FRAME_FLAG_NONE', 'FRAME_FLAG_CFP', 'FRAME_FLAG_SHORT_PREAMBLE', 'FRAME_FLAG_WEP', 'FRAME_FLAG_FRAGMENTED', 'FRAME_FLAG_FCS_INCLUDED', 'FRAME_FLAG_DATA_PADDING', 'FRAME_FLAG_BAD_FCS', 'FRAME_FLAG_SHORT_GUARD'], outer_class=root_module['ns3::RadiotapHeader'])
     ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
     module.add_enum('', ['CHANNEL_FLAG_NONE', 'CHANNEL_FLAG_TURBO', 'CHANNEL_FLAG_CCK', 'CHANNEL_FLAG_OFDM', 'CHANNEL_FLAG_SPECTRUM_2GHZ', 'CHANNEL_FLAG_SPECTRUM_5GHZ', 'CHANNEL_FLAG_PASSIVE', 'CHANNEL_FLAG_DYNAMIC', 'CHANNEL_FLAG_GFSK'], outer_class=root_module['ns3::RadiotapHeader'])
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['MCS_KNOWN_NONE', 'MCS_KNOWN_BANDWIDTH', 'MCS_KNOWN_INDEX', 'MCS_KNOWN_GUARD_INTERVAL', 'MCS_KNOWN_HT_FORMAT', 'MCS_KNOWN_FEC_TYPE', 'MCS_KNOWN_STBC', 'MCS_KNOWN_NESS', 'MCS_KNOWN_NESS_BIT_1'], outer_class=root_module['ns3::RadiotapHeader'])
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['MCS_FLAGS_NONE', 'MCS_FLAGS_BANDWIDTH_40', 'MCS_FLAGS_BANDWIDTH_20L', 'MCS_FLAGS_BANDWIDTH_20U', 'MCS_FLAGS_GUARD_INTERVAL', 'MCS_FLAGS_HT_GREENFIELD', 'MCS_FLAGS_FEC_TYPE', 'MCS_FLAGS_STBC_STREAMS', 'MCS_FLAGS_NESS_BIT_0'], outer_class=root_module['ns3::RadiotapHeader'])
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['A_MPDU_STATUS_NONE', 'A_MPDU_STATUS_REPORT_ZERO_LENGTH', 'A_MPDU_STATUS_IS_ZERO_LENGTH', 'A_MPDU_STATUS_LAST_KNOWN', 'A_MPDU_STATUS_LAST', 'A_MPDU_STATUS_DELIMITER_CRC_ERROR', 'A_MPDU_STATUS_DELIMITER_CRC_KNOWN'], outer_class=root_module['ns3::RadiotapHeader'])
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['VHT_KNOWN_NONE', 'VHT_KNOWN_STBC', 'VHT_KNOWN_TXOP_PS_NOT_ALLOWED', 'VHT_KNOWN_GUARD_INTERVAL', 'VHT_KNOWN_SHORT_GI_NSYM_DISAMBIGUATION', 'VHT_KNOWN_LDPC_EXTRA_OFDM_SYMBOL', 'VHT_KNOWN_BEAMFORMED', 'VHT_KNOWN_BANDWIDTH', 'VHT_KNOWN_GROUP_ID', 'VHT_KNOWN_PARTIAL_AID'], outer_class=root_module['ns3::RadiotapHeader'])
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['VHT_FLAGS_NONE', 'VHT_FLAGS_STBC', 'VHT_FLAGS_TXOP_PS_NOT_ALLOWED', 'VHT_FLAGS_GUARD_INTERVAL', 'VHT_FLAGS_SHORT_GI_NSYM_DISAMBIGUATION', 'VHT_FLAGS__LDPC_EXTRA_OFDM_SYMBOL', 'VHT_FLAGS_BEAMFORMED'], outer_class=root_module['ns3::RadiotapHeader'])
     ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream [class]
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## red-queue.h (module 'network'): ns3::RedQueue [class]
@@ -483,9 +495,6 @@
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >', u'ns3::SequenceNumber8')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >*', u'ns3::SequenceNumber8*')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >&', u'ns3::SequenceNumber8&')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::SequenceNumber32TracedValueCallback')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::SequenceNumber32TracedValueCallback*')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::SequenceNumber32TracedValueCallback&')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', u'ns3::GenericPhyRxEndErrorCallback')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', u'ns3::GenericPhyRxEndErrorCallback*')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', u'ns3::GenericPhyRxEndErrorCallback&')
@@ -508,6 +517,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace addressUtils
     
     nested_module = module.add_cpp_namespace('addressUtils')
@@ -554,6 +569,40 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_addressUtils(module):
     root_module = module.get_root()
     
@@ -596,6 +645,7 @@
     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'])
@@ -1087,17 +1137,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1119,11 +1169,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1133,16 +1178,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1380,14 +1415,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1448,11 +1487,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3ChannelList_methods(root_module, cls):
@@ -2463,6 +2497,12 @@
                    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([])
@@ -2831,7 +2871,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -3055,10 +3095,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -3122,10 +3162,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3369,10 +3409,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3715,6 +3755,11 @@
     cls.add_method('SetParent', 
                    'ns3::TypeId', 
                    [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent() [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   template_parameters=['ns3::Object'])
     ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetSize(std::size_t size) [member function]
     cls.add_method('SetSize', 
                    'ns3::TypeId', 
@@ -4244,10 +4289,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -4380,6 +4425,16 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
+    ## radiotap-header.h (module 'network'): uint16_t ns3::RadiotapHeader::GetAmpduStatusFlags() const [member function]
+    cls.add_method('GetAmpduStatusFlags', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint32_t ns3::RadiotapHeader::GetAmpduStatusRef() const [member function]
+    cls.add_method('GetAmpduStatusRef', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetAntennaNoisePower() const [member function]
     cls.add_method('GetAntennaNoisePower', 
                    'uint8_t', 
@@ -4410,6 +4465,21 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsFlags() const [member function]
+    cls.add_method('GetMcsFlags', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsKnown() const [member function]
+    cls.add_method('GetMcsKnown', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsRate() const [member function]
+    cls.add_method('GetMcsRate', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetRate() const [member function]
     cls.add_method('GetRate', 
                    'uint8_t', 
@@ -4430,6 +4500,56 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtBandwidth() const [member function]
+    cls.add_method('GetVhtBandwidth', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtCoding() const [member function]
+    cls.add_method('GetVhtCoding', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtFlags() const [member function]
+    cls.add_method('GetVhtFlags', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtGroupId() const [member function]
+    cls.add_method('GetVhtGroupId', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint16_t ns3::RadiotapHeader::GetVhtKnown() const [member function]
+    cls.add_method('GetVhtKnown', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser1() const [member function]
+    cls.add_method('GetVhtMcsNssUser1', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser2() const [member function]
+    cls.add_method('GetVhtMcsNssUser2', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser3() const [member function]
+    cls.add_method('GetVhtMcsNssUser3', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser4() const [member function]
+    cls.add_method('GetVhtMcsNssUser4', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtPartialAid() const [member function]
+    cls.add_method('GetVhtPartialAid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4440,6 +4560,10 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetAmpduStatus(uint32_t referenceNumber, uint16_t flags, uint8_t crc) [member function]
+    cls.add_method('SetAmpduStatus', 
+                   'void', 
+                   [param('uint32_t', 'referenceNumber'), param('uint16_t', 'flags'), param('uint8_t', 'crc')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetAntennaNoisePower(double noise) [member function]
     cls.add_method('SetAntennaNoisePower', 
                    'void', 
@@ -4456,6 +4580,10 @@
     cls.add_method('SetFrameFlags', 
                    'void', 
                    [param('uint8_t', 'flags')])
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs) [member function]
+    cls.add_method('SetMcsFields', 
+                   'void', 
+                   [param('uint8_t', 'known'), param('uint8_t', 'flags'), param('uint8_t', 'mcs')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetRate(uint8_t rate) [member function]
     cls.add_method('SetRate', 
                    'void', 
@@ -4464,6 +4592,10 @@
     cls.add_method('SetTsft', 
                    'void', 
                    [param('uint64_t', 'tsft')])
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetVhtFields(uint16_t known, uint8_t flags, uint8_t bandwidth, uint8_t * mcs_nss, uint8_t coding, uint8_t group_id, uint16_t partial_aid) [member function]
+    cls.add_method('SetVhtFields', 
+                   'void', 
+                   [param('uint16_t', 'known'), param('uint8_t', 'flags'), param('uint8_t', 'bandwidth'), param('uint8_t *', 'mcs_nss'), param('uint8_t', 'coding'), param('uint8_t', 'group_id'), param('uint16_t', 'partial_aid')])
     return
 
 def register_Ns3RandomVariableStream_methods(root_module, cls):
@@ -6059,11 +6191,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -6182,6 +6324,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-calculator.h (module 'stats'): static ns3::TypeId ns3::DataCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-calculator.h (module 'stats'): void ns3::DataCalculator::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -6256,6 +6403,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-output-interface.h (module 'stats'): static ns3::TypeId ns3::DataOutputInterface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-output-interface.h (module 'stats'): void ns3::DataOutputInterface::Output(ns3::DataCollector & dc) [member function]
     cls.add_method('Output', 
                    'void', 
@@ -6374,10 +6526,11 @@
     cls.add_constructor([param('ns3::DropTailQueue const &', 'arg0')])
     ## drop-tail-queue.h (module 'network'): ns3::DropTailQueue::DropTailQueue() [constructor]
     cls.add_constructor([])
-    ## drop-tail-queue.h (module 'network'): ns3::Queue::QueueMode ns3::DropTailQueue::GetMode() [member function]
+    ## drop-tail-queue.h (module 'network'): ns3::Queue::QueueMode ns3::DropTailQueue::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::Queue::QueueMode', 
-                   [])
+                   [], 
+                   is_const=True)
     ## drop-tail-queue.h (module 'network'): static ns3::TypeId ns3::DropTailQueue::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -6426,10 +6579,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -7254,6 +7407,11 @@
     cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< unsigned int > const &', 'arg0')])
     ## basic-data-calculators.h (module 'stats'): ns3::MinMaxAvgTotalCalculator<unsigned int>::MinMaxAvgTotalCalculator() [constructor]
     cls.add_constructor([])
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::MinMaxAvgTotalCalculator<unsigned int>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::MinMaxAvgTotalCalculator<unsigned int>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -7865,6 +8023,11 @@
     cls.add_method('FrameUpdate', 
                    'void', 
                    [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'realto')])
+    ## packet-data-calculators.h (module 'network'): static ns3::TypeId ns3::PacketSizeMinMaxAvgTotalCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## packet-data-calculators.h (module 'network'): void ns3::PacketSizeMinMaxAvgTotalCalculator::PacketUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('PacketUpdate', 
                    'void', 
@@ -9235,6 +9398,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')], 
                    is_virtual=True)
+    ## simple-channel.h (module 'network'): void ns3::SimpleChannel::BlackList(ns3::Ptr<ns3::SimpleNetDevice> from, ns3::Ptr<ns3::SimpleNetDevice> to) [member function]
+    cls.add_method('BlackList', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'to')], 
+                   is_virtual=True)
     ## simple-channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::SimpleChannel::GetDevice(uint32_t i) const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -9255,6 +9423,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')], 
                    is_virtual=True)
+    ## simple-channel.h (module 'network'): void ns3::SimpleChannel::UnBlackList(ns3::Ptr<ns3::SimpleNetDevice> from, ns3::Ptr<ns3::SimpleNetDevice> to) [member function]
+    cls.add_method('UnBlackList', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'to')], 
+                   is_virtual=True)
     return
 
 def register_Ns3SimpleNetDevice_methods(root_module, cls):
@@ -9614,6 +9787,11 @@
                    'unsigned int', 
                    [], 
                    is_const=True)
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::CounterCalculator<unsigned int>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::CounterCalculator<unsigned int>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -9643,6 +9821,11 @@
     cls.add_method('FrameUpdate', 
                    'void', 
                    [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'realto')])
+    ## packet-data-calculators.h (module 'network'): static ns3::TypeId ns3::PacketCounterCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## packet-data-calculators.h (module 'network'): void ns3::PacketCounterCalculator::PacketUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('PacketUpdate', 
                    'void', 
@@ -9926,6 +10109,7 @@
                         [param('ns3::Buffer::Iterator &', 'i'), param('ns3::Mac64Address', 'ad')])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_addressUtils(module.get_submodule('addressUtils'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
@@ -9940,6 +10124,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_addressUtils(module, root_module):
     ## address-utils.h (module 'network'): extern bool ns3::addressUtils::IsMulticast(ns3::Address const & ad) [free function]
     module.add_function('IsMulticast', 
diff -Naur ns-3.23/src/network/bindings/modulegen__gcc_LP64.py ns-3.24/src/network/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/network/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -106,6 +106,8 @@
     module.add_class('NodeContainer')
     ## node-list.h (module 'network'): ns3::NodeList [class]
     module.add_class('NodeList')
+    ## 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]
@@ -145,7 +147,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'])
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'])
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True)
     ## sequence-number.h (module 'network'): ns3::SequenceNumber<unsigned int, int> [class]
@@ -212,6 +214,16 @@
     module.add_enum('', ['FRAME_FLAG_NONE', 'FRAME_FLAG_CFP', 'FRAME_FLAG_SHORT_PREAMBLE', 'FRAME_FLAG_WEP', 'FRAME_FLAG_FRAGMENTED', 'FRAME_FLAG_FCS_INCLUDED', 'FRAME_FLAG_DATA_PADDING', 'FRAME_FLAG_BAD_FCS', 'FRAME_FLAG_SHORT_GUARD'], outer_class=root_module['ns3::RadiotapHeader'])
     ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
     module.add_enum('', ['CHANNEL_FLAG_NONE', 'CHANNEL_FLAG_TURBO', 'CHANNEL_FLAG_CCK', 'CHANNEL_FLAG_OFDM', 'CHANNEL_FLAG_SPECTRUM_2GHZ', 'CHANNEL_FLAG_SPECTRUM_5GHZ', 'CHANNEL_FLAG_PASSIVE', 'CHANNEL_FLAG_DYNAMIC', 'CHANNEL_FLAG_GFSK'], outer_class=root_module['ns3::RadiotapHeader'])
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['MCS_KNOWN_NONE', 'MCS_KNOWN_BANDWIDTH', 'MCS_KNOWN_INDEX', 'MCS_KNOWN_GUARD_INTERVAL', 'MCS_KNOWN_HT_FORMAT', 'MCS_KNOWN_FEC_TYPE', 'MCS_KNOWN_STBC', 'MCS_KNOWN_NESS', 'MCS_KNOWN_NESS_BIT_1'], outer_class=root_module['ns3::RadiotapHeader'])
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['MCS_FLAGS_NONE', 'MCS_FLAGS_BANDWIDTH_40', 'MCS_FLAGS_BANDWIDTH_20L', 'MCS_FLAGS_BANDWIDTH_20U', 'MCS_FLAGS_GUARD_INTERVAL', 'MCS_FLAGS_HT_GREENFIELD', 'MCS_FLAGS_FEC_TYPE', 'MCS_FLAGS_STBC_STREAMS', 'MCS_FLAGS_NESS_BIT_0'], outer_class=root_module['ns3::RadiotapHeader'])
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['A_MPDU_STATUS_NONE', 'A_MPDU_STATUS_REPORT_ZERO_LENGTH', 'A_MPDU_STATUS_IS_ZERO_LENGTH', 'A_MPDU_STATUS_LAST_KNOWN', 'A_MPDU_STATUS_LAST', 'A_MPDU_STATUS_DELIMITER_CRC_ERROR', 'A_MPDU_STATUS_DELIMITER_CRC_KNOWN'], outer_class=root_module['ns3::RadiotapHeader'])
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['VHT_KNOWN_NONE', 'VHT_KNOWN_STBC', 'VHT_KNOWN_TXOP_PS_NOT_ALLOWED', 'VHT_KNOWN_GUARD_INTERVAL', 'VHT_KNOWN_SHORT_GI_NSYM_DISAMBIGUATION', 'VHT_KNOWN_LDPC_EXTRA_OFDM_SYMBOL', 'VHT_KNOWN_BEAMFORMED', 'VHT_KNOWN_BANDWIDTH', 'VHT_KNOWN_GROUP_ID', 'VHT_KNOWN_PARTIAL_AID'], outer_class=root_module['ns3::RadiotapHeader'])
+    ## radiotap-header.h (module 'network'): ns3::RadiotapHeader [enumeration]
+    module.add_enum('', ['VHT_FLAGS_NONE', 'VHT_FLAGS_STBC', 'VHT_FLAGS_TXOP_PS_NOT_ALLOWED', 'VHT_FLAGS_GUARD_INTERVAL', 'VHT_FLAGS_SHORT_GI_NSYM_DISAMBIGUATION', 'VHT_FLAGS__LDPC_EXTRA_OFDM_SYMBOL', 'VHT_FLAGS_BEAMFORMED'], outer_class=root_module['ns3::RadiotapHeader'])
     ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream [class]
     module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## red-queue.h (module 'network'): ns3::RedQueue [class]
@@ -483,9 +495,6 @@
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >', u'ns3::SequenceNumber8')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >*', u'ns3::SequenceNumber8*')
     typehandlers.add_type_alias(u'ns3::SequenceNumber< unsigned char, signed char >&', u'ns3::SequenceNumber8&')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::SequenceNumber32TracedValueCallback')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::SequenceNumber32TracedValueCallback*')
-    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::SequenceNumber32TracedValueCallback&')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', u'ns3::GenericPhyRxEndErrorCallback')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', u'ns3::GenericPhyRxEndErrorCallback*')
     typehandlers.add_type_alias(u'ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', u'ns3::GenericPhyRxEndErrorCallback&')
@@ -508,6 +517,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace addressUtils
     
     nested_module = module.add_cpp_namespace('addressUtils')
@@ -554,6 +569,40 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *', u'ns3::TracedValueCallback::SequenceNumber32')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) **', u'ns3::TracedValueCallback::SequenceNumber32*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::SequenceNumber32, ns3::SequenceNumber32 ) *&', u'ns3::TracedValueCallback::SequenceNumber32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_addressUtils(module):
     root_module = module.get_root()
     
@@ -596,6 +645,7 @@
     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'])
@@ -769,8 +819,8 @@
 
 def register_Ns3Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
-    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
     ## address.h (module 'network'): ns3::Address::Address() [constructor]
     cls.add_constructor([])
@@ -1087,17 +1137,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1119,11 +1169,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1133,16 +1178,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1380,14 +1415,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1448,11 +1487,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3ChannelList_methods(root_module, cls):
@@ -1750,8 +1784,8 @@
 
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
-    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(ns3::Ipv4Address const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Ipv4Address const &', 'arg0')])
@@ -1921,8 +1955,8 @@
 
 def register_Ns3Ipv6Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
-    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address() [constructor]
     cls.add_constructor([])
@@ -2178,8 +2212,8 @@
 
 def register_Ns3Mac16Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
-    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
     ## mac16-address.h (module 'network'): ns3::Mac16Address::Mac16Address(ns3::Mac16Address const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Mac16Address const &', 'arg0')])
@@ -2215,8 +2249,8 @@
 
 def register_Ns3Mac48Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
-    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
     ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
@@ -2287,8 +2321,8 @@
 
 def register_Ns3Mac64Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
-    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
     ## mac64-address.h (module 'network'): ns3::Mac64Address::Mac64Address(ns3::Mac64Address const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Mac64Address const &', 'arg0')])
@@ -2463,6 +2497,12 @@
                    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([])
@@ -2831,7 +2871,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -3055,10 +3095,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -3122,10 +3162,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3369,10 +3409,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3558,8 +3598,8 @@
 
 def register_Ns3TypeId_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
-    cls.add_output_stream_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')])
@@ -3715,6 +3755,11 @@
     cls.add_method('SetParent', 
                    'ns3::TypeId', 
                    [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent() [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   template_parameters=['ns3::Object'])
     ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetSize(std::size_t size) [member function]
     cls.add_method('SetSize', 
                    'ns3::TypeId', 
@@ -3772,7 +3817,6 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('!=')
     cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', u'right'))
-    cls.add_output_stream_operator()
     cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', u'right'))
     cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', u'right'))
     cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', u'right'))
@@ -3783,6 +3827,7 @@
     cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', u'right'))
     cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', u'right'))
     cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', u'right'))
+    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('>=')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
@@ -4244,10 +4289,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -4380,6 +4425,16 @@
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
+    ## radiotap-header.h (module 'network'): uint16_t ns3::RadiotapHeader::GetAmpduStatusFlags() const [member function]
+    cls.add_method('GetAmpduStatusFlags', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint32_t ns3::RadiotapHeader::GetAmpduStatusRef() const [member function]
+    cls.add_method('GetAmpduStatusRef', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetAntennaNoisePower() const [member function]
     cls.add_method('GetAntennaNoisePower', 
                    'uint8_t', 
@@ -4410,6 +4465,21 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsFlags() const [member function]
+    cls.add_method('GetMcsFlags', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsKnown() const [member function]
+    cls.add_method('GetMcsKnown', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetMcsRate() const [member function]
+    cls.add_method('GetMcsRate', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetRate() const [member function]
     cls.add_method('GetRate', 
                    'uint8_t', 
@@ -4430,6 +4500,56 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtBandwidth() const [member function]
+    cls.add_method('GetVhtBandwidth', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtCoding() const [member function]
+    cls.add_method('GetVhtCoding', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtFlags() const [member function]
+    cls.add_method('GetVhtFlags', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtGroupId() const [member function]
+    cls.add_method('GetVhtGroupId', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint16_t ns3::RadiotapHeader::GetVhtKnown() const [member function]
+    cls.add_method('GetVhtKnown', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser1() const [member function]
+    cls.add_method('GetVhtMcsNssUser1', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser2() const [member function]
+    cls.add_method('GetVhtMcsNssUser2', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser3() const [member function]
+    cls.add_method('GetVhtMcsNssUser3', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtMcsNssUser4() const [member function]
+    cls.add_method('GetVhtMcsNssUser4', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## radiotap-header.h (module 'network'): uint8_t ns3::RadiotapHeader::GetVhtPartialAid() const [member function]
+    cls.add_method('GetVhtPartialAid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4440,6 +4560,10 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetAmpduStatus(uint32_t referenceNumber, uint16_t flags, uint8_t crc) [member function]
+    cls.add_method('SetAmpduStatus', 
+                   'void', 
+                   [param('uint32_t', 'referenceNumber'), param('uint16_t', 'flags'), param('uint8_t', 'crc')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetAntennaNoisePower(double noise) [member function]
     cls.add_method('SetAntennaNoisePower', 
                    'void', 
@@ -4456,6 +4580,10 @@
     cls.add_method('SetFrameFlags', 
                    'void', 
                    [param('uint8_t', 'flags')])
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs) [member function]
+    cls.add_method('SetMcsFields', 
+                   'void', 
+                   [param('uint8_t', 'known'), param('uint8_t', 'flags'), param('uint8_t', 'mcs')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetRate(uint8_t rate) [member function]
     cls.add_method('SetRate', 
                    'void', 
@@ -4464,6 +4592,10 @@
     cls.add_method('SetTsft', 
                    'void', 
                    [param('uint64_t', 'tsft')])
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetVhtFields(uint16_t known, uint8_t flags, uint8_t bandwidth, uint8_t * mcs_nss, uint8_t coding, uint8_t group_id, uint16_t partial_aid) [member function]
+    cls.add_method('SetVhtFields', 
+                   'void', 
+                   [param('uint16_t', 'known'), param('uint8_t', 'flags'), param('uint8_t', 'bandwidth'), param('uint8_t *', 'mcs_nss'), param('uint8_t', 'coding'), param('uint8_t', 'group_id'), param('uint16_t', 'partial_aid')])
     return
 
 def register_Ns3RandomVariableStream_methods(root_module, cls):
@@ -5417,7 +5549,6 @@
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('!=')
     cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', u'right'))
-    cls.add_output_stream_operator()
     cls.add_binary_numeric_operator('*', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', u'right'))
     cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', u'right'))
     cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', u'right'))
@@ -5425,6 +5556,7 @@
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('>')
     cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', u'right'))
+    cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('>=')
     ## nstime.h (module 'core'): ns3::Time::Time() [constructor]
@@ -6059,11 +6191,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -6182,6 +6324,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-calculator.h (module 'stats'): static ns3::TypeId ns3::DataCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-calculator.h (module 'stats'): void ns3::DataCalculator::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -6256,6 +6403,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-output-interface.h (module 'stats'): static ns3::TypeId ns3::DataOutputInterface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-output-interface.h (module 'stats'): void ns3::DataOutputInterface::Output(ns3::DataCollector & dc) [member function]
     cls.add_method('Output', 
                    'void', 
@@ -6374,10 +6526,11 @@
     cls.add_constructor([param('ns3::DropTailQueue const &', 'arg0')])
     ## drop-tail-queue.h (module 'network'): ns3::DropTailQueue::DropTailQueue() [constructor]
     cls.add_constructor([])
-    ## drop-tail-queue.h (module 'network'): ns3::Queue::QueueMode ns3::DropTailQueue::GetMode() [member function]
+    ## drop-tail-queue.h (module 'network'): ns3::Queue::QueueMode ns3::DropTailQueue::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::Queue::QueueMode', 
-                   [])
+                   [], 
+                   is_const=True)
     ## drop-tail-queue.h (module 'network'): static ns3::TypeId ns3::DropTailQueue::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -6426,10 +6579,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -7254,6 +7407,11 @@
     cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< unsigned int > const &', 'arg0')])
     ## basic-data-calculators.h (module 'stats'): ns3::MinMaxAvgTotalCalculator<unsigned int>::MinMaxAvgTotalCalculator() [constructor]
     cls.add_constructor([])
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::MinMaxAvgTotalCalculator<unsigned int>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::MinMaxAvgTotalCalculator<unsigned int>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -7865,6 +8023,11 @@
     cls.add_method('FrameUpdate', 
                    'void', 
                    [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'realto')])
+    ## packet-data-calculators.h (module 'network'): static ns3::TypeId ns3::PacketSizeMinMaxAvgTotalCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## packet-data-calculators.h (module 'network'): void ns3::PacketSizeMinMaxAvgTotalCalculator::PacketUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('PacketUpdate', 
                    'void', 
@@ -9235,6 +9398,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')], 
                    is_virtual=True)
+    ## simple-channel.h (module 'network'): void ns3::SimpleChannel::BlackList(ns3::Ptr<ns3::SimpleNetDevice> from, ns3::Ptr<ns3::SimpleNetDevice> to) [member function]
+    cls.add_method('BlackList', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'to')], 
+                   is_virtual=True)
     ## simple-channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::SimpleChannel::GetDevice(uint32_t i) const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -9255,6 +9423,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')], 
                    is_virtual=True)
+    ## simple-channel.h (module 'network'): void ns3::SimpleChannel::UnBlackList(ns3::Ptr<ns3::SimpleNetDevice> from, ns3::Ptr<ns3::SimpleNetDevice> to) [member function]
+    cls.add_method('UnBlackList', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'to')], 
+                   is_virtual=True)
     return
 
 def register_Ns3SimpleNetDevice_methods(root_module, cls):
@@ -9614,6 +9787,11 @@
                    'unsigned int', 
                    [], 
                    is_const=True)
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::CounterCalculator<unsigned int>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::CounterCalculator<unsigned int>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -9643,6 +9821,11 @@
     cls.add_method('FrameUpdate', 
                    'void', 
                    [param('std::string', 'path'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'realto')])
+    ## packet-data-calculators.h (module 'network'): static ns3::TypeId ns3::PacketCounterCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## packet-data-calculators.h (module 'network'): void ns3::PacketCounterCalculator::PacketUpdate(std::string path, ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('PacketUpdate', 
                    'void', 
@@ -9926,6 +10109,7 @@
                         [param('ns3::Buffer::Iterator &', 'i'), param('ns3::Mac64Address', 'ad')])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_addressUtils(module.get_submodule('addressUtils'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
@@ -9940,6 +10124,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_addressUtils(module, root_module):
     ## address-utils.h (module 'network'): extern bool ns3::addressUtils::IsMulticast(ns3::Address const & ad) [free function]
     module.add_function('IsMulticast', 
diff -Naur ns-3.23/src/network/helper/trace-helper.cc ns-3.24/src/network/helper/trace-helper.cc
--- ns-3.23/src/network/helper/trace-helper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/helper/trace-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -170,6 +170,13 @@
   file->Write (Simulator::Now (), p);
 }
 
+void
+PcapHelper::SinkWithHeader (Ptr<PcapFileWrapper> file, const Header &header, Ptr<const Packet> p)
+{
+  NS_LOG_FUNCTION (file << p);
+  file->Write (Simulator::Now (), header, p);
+}
+
 AsciiTraceHelper::AsciiTraceHelper ()
 {
   NS_LOG_FUNCTION_NOARGS ();
diff -Naur ns-3.23/src/network/helper/trace-helper.h ns-3.24/src/network/helper/trace-helper.h
--- ns-3.23/src/network/helper/trace-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/helper/trace-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -50,9 +50,11 @@
     DLT_PPP = 9,
     DLT_RAW = 101,
     DLT_IEEE802_11 = 105,
+    DLT_LINUX_SSL = 113,
     DLT_PRISM_HEADER = 119,
     DLT_IEEE802_11_RADIO = 127,
-    DLT_IEEE802_15_4 = 195
+    DLT_IEEE802_15_4 = 195,
+    DLT_NETLINK = 253
   };
 
   /**
@@ -121,6 +123,18 @@
    * @param p the packet to write
    */
   static void DefaultSink (Ptr<PcapFileWrapper> file, Ptr<const Packet> p);
+
+  /**
+   * This trace sink passes a header separately from the packet to prevent creating a new packet
+   * (for performance reasons)
+   *
+   * @param file the file to write to
+   * @param header header of the packet
+   * @param p the packet to write
+   *
+   * @see DefaultSink
+   */
+  static void SinkWithHeader (Ptr<PcapFileWrapper> file, const Header& header, Ptr<const Packet> p);
 };
 
 template <typename T> void
diff -Naur ns-3.23/src/network/model/buffer.cc ns-3.24/src/network/model/buffer.cc
--- ns-3.23/src/network/model/buffer.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/buffer.cc	2015-09-15 11:18:44.000000000 -0700
@@ -305,11 +305,10 @@
   return m_end - (m_zeroAreaEnd - m_zeroAreaStart);
 }
 
-bool
+void
 Buffer::AddAtStart (uint32_t start)
 {
   NS_LOG_FUNCTION (this << start);
-  bool dirty;
   NS_ASSERT (CheckInternalState ());
   bool isDirty = m_data->m_count > 1 && m_start > m_data->m_dirtyStart;
   if (m_start >= start && !isDirty)
@@ -321,7 +320,6 @@
        */
       NS_ASSERT (m_data->m_count == 1 || m_start == m_data->m_dirtyStart);
       m_start -= start;
-      dirty = m_start > m_data->m_dirtyStart;
       // update dirty area
       m_data->m_dirtyStart = m_start;
     } 
@@ -347,20 +345,15 @@
       // update dirty area
       m_data->m_dirtyStart = m_start;
       m_data->m_dirtyEnd = m_end;
-
-      dirty = true;
-
     }
   m_maxZeroAreaStart = std::max (m_maxZeroAreaStart, m_zeroAreaStart);
   LOG_INTERNAL_STATE ("add start=" << start << ", ");
   NS_ASSERT (CheckInternalState ());
-  return dirty;
 }
-bool
+void
 Buffer::AddAtEnd (uint32_t end)
 {
   NS_LOG_FUNCTION (this << end);
-  bool dirty;
   NS_ASSERT (CheckInternalState ());
   bool isDirty = m_data->m_count > 1 && m_end < m_data->m_dirtyEnd;
   if (GetInternalEnd () + end <= m_data->m_size && !isDirty)
@@ -374,9 +367,6 @@
       m_end += end;
       // update dirty area.
       m_data->m_dirtyEnd = m_end;
-
-      dirty = m_end < m_data->m_dirtyEnd;
-
     } 
   else
     {
@@ -400,15 +390,10 @@
       // update dirty area
       m_data->m_dirtyStart = m_start;
       m_data->m_dirtyEnd = m_end;
-
-      dirty = true;
-
     } 
   m_maxZeroAreaStart = std::max (m_maxZeroAreaStart, m_zeroAreaStart);
   LOG_INTERNAL_STATE ("add end=" << end << ", ");
   NS_ASSERT (CheckInternalState ());
-
-  return dirty;
 }
 
 void
@@ -704,19 +689,6 @@
   return (sizeCheck != 0) ? 0 : 1;
 }
 
-int32_t 
-Buffer::GetCurrentStartOffset (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_start;
-}
-int32_t 
-Buffer::GetCurrentEndOffset (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_end;
-}
-
 
 void
 Buffer::TransformIntoRealBuffer (void) const
@@ -840,15 +812,14 @@
 Buffer::Iterator::CheckNoZero (uint32_t start, uint32_t end) const
 {
   NS_LOG_FUNCTION (this << &start << &end);
-  bool ok = true;
   for (uint32_t i = start; i < end; i++)
     {
       if (!Check (i))
         {
-          ok = false;
+          return false;
         }
     }
-  return ok;
+  return true;
 }
 bool 
 Buffer::Iterator::Check (uint32_t i) const
diff -Naur ns-3.23/src/network/model/buffer.h ns-3.24/src/network/model/buffer.h
--- ns-3.23/src/network/model/buffer.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/buffer.h	2015-09-15 11:18:44.000000000 -0700
@@ -496,7 +496,6 @@
 
   /**
    * \param start size to reserve
-   * \returns true if the buffer needed resizing, false otherwise.
    *
    * Add bytes at the start of the Buffer. The
    * content of these bytes is undefined but debugging
@@ -504,10 +503,9 @@
    * Any call to this method invalidates any Iterator
    * pointing to this Buffer.
    */
-  bool AddAtStart (uint32_t start);
+  void AddAtStart (uint32_t start);
   /**
    * \param end size to reserve
-   * \returns true if the buffer needed resizing, false otherwise.
    *
    * Add bytes at the end of the Buffer. The
    * content of these bytes is undefined but debugging
@@ -515,7 +513,7 @@
    * Any call to this method invalidates any Iterator
    * pointing to this Buffer.
    */
-  bool AddAtEnd (uint32_t end);
+  void AddAtEnd (uint32_t end);
 
   /**
    * \param o the buffer to append to the end of this buffer.
@@ -563,14 +561,6 @@
   inline Buffer::Iterator End (void) const;
 
   /**
-   * \brief Create a full copy of the buffer, including
-   * all the internal structures.
-   *
-   * \returns a copy of the buffer
-   */
-  Buffer CreateFullCopy (void) const;
-
-  /**
    * \brief Return the number of bytes required for serialization.
    * \return the number of bytes.
    */
@@ -598,17 +588,6 @@
    */
   uint32_t Deserialize (const uint8_t* buffer, uint32_t size);
 
-  /**
-   * \brief Returns the current buffer start offset
-   * \return the offset
-   */
-  int32_t GetCurrentStartOffset (void) const;
-  /**
-   * \brief Returns the current buffer end offset
-   * \return the offset
-   */
-  int32_t GetCurrentEndOffset (void) const;
-
   /** 
    * Copy the specified amount of data from the buffer to the given output stream.
    * 
@@ -701,6 +680,14 @@
   };
 
   /**
+   * \brief Create a full copy of the buffer, including
+   * all the internal structures.
+   *
+   * \returns a copy of the buffer
+   */
+  Buffer CreateFullCopy (void) const;
+
+  /**
    * \brief Transform a "Virtual byte buffer" into a "Real byte buffer"
    */
   void TransformIntoRealBuffer (void) const;
@@ -1005,7 +992,7 @@
 Buffer::Iterator::PeekU8 (void)
 {
   NS_ASSERT_MSG (m_current >= m_dataStart &&
-                 m_current <= m_dataEnd,
+                 m_current < m_dataEnd,
                  GetReadErrorMessage ());
 
   if (m_current < m_zeroStart)
diff -Naur ns-3.23/src/network/model/byte-tag-list.cc ns-3.24/src/network/model/byte-tag-list.cc
--- ns-3.23/src/network/model/byte-tag-list.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/byte-tag-list.cc	2015-09-15 11:18:44.000000000 -0700
@@ -106,8 +106,8 @@
       TagBuffer buf = TagBuffer (m_current, m_end);
       m_nextTid = buf.ReadU32 ();
       m_nextSize = buf.ReadU32 ();
-      m_nextStart = buf.ReadU32 ();
-      m_nextEnd = buf.ReadU32 ();
+      m_nextStart = buf.ReadU32 () + m_adjustment;
+      m_nextEnd = buf.ReadU32 () + m_adjustment;
       if (m_nextStart >= m_offsetEnd || m_nextEnd <= m_offsetStart)
         {
           m_current += 4 + 4 + 4 + 4 + m_nextSize;
@@ -118,13 +118,14 @@
         }
     }
 }
-ByteTagList::Iterator::Iterator (uint8_t *start, uint8_t *end, int32_t offsetStart, int32_t offsetEnd)
+ByteTagList::Iterator::Iterator (uint8_t *start, uint8_t *end, int32_t offsetStart, int32_t offsetEnd, int32_t adjustment)
   : m_current (start),
     m_end (end),
     m_offsetStart (offsetStart),
-    m_offsetEnd (offsetEnd)
+    m_offsetEnd (offsetEnd),
+    m_adjustment (adjustment)
 {
-  NS_LOG_FUNCTION (this << &start << &end << offsetStart << offsetEnd);
+  NS_LOG_FUNCTION (this << &start << &end << offsetStart << offsetEnd << adjustment);
   PrepareForNext ();
 }
 
@@ -137,13 +138,19 @@
 
 
 ByteTagList::ByteTagList ()
-  : m_used (0),
+  : m_minStart (INT32_MAX),
+    m_maxEnd (INT32_MIN),
+    m_adjustment (0),
+    m_used (0),
     m_data (0)
 {
   NS_LOG_FUNCTION (this);
 }
 ByteTagList::ByteTagList (const ByteTagList &o)
-  : m_used (o.m_used),
+  : m_minStart (o.m_minStart),
+    m_maxEnd (o.m_maxEnd),
+    m_adjustment (o.m_adjustment),
+    m_used (o.m_used),
     m_data (o.m_data)
 {
   NS_LOG_FUNCTION (this << &o);
@@ -161,6 +168,9 @@
     }
 
   Deallocate (m_data);
+  m_minStart = o.m_minStart;
+  m_maxEnd = o.m_maxEnd;
+  m_adjustment = o.m_adjustment;
   m_data = o.m_data;
   m_used = o.m_used;
   if (m_data != 0)
@@ -200,8 +210,16 @@
                              &m_data->data[spaceNeeded]);
   tag.WriteU32 (tid.GetUid ());
   tag.WriteU32 (bufferSize);
-  tag.WriteU32 (start);
-  tag.WriteU32 (end);
+  tag.WriteU32 (start - m_adjustment);
+  tag.WriteU32 (end - m_adjustment);
+  if (start - m_adjustment < m_minStart)
+    {
+      m_minStart = start - m_adjustment;
+    }
+  if (end - m_adjustment > m_maxEnd)
+    {
+      m_maxEnd = end - m_adjustment;
+    }
   m_used = spaceNeeded;
   m_data->dirty = m_used;
   return tag;
@@ -225,6 +243,9 @@
 {
   NS_LOG_FUNCTION (this);
   Deallocate (m_data);
+  m_minStart = INT32_MAX;
+  m_maxEnd = INT32_MIN;
+  m_adjustment = 0;
   m_data = 0;
   m_used = 0;
 }
@@ -244,51 +265,19 @@
   NS_LOG_FUNCTION (this << offsetStart << offsetEnd);
   if (m_data == 0)
     {
-      return Iterator (0, 0, offsetStart, offsetEnd);
+      return Iterator (0, 0, offsetStart, offsetEnd, 0);
     }
   else
     {
-      return Iterator (m_data->data, &m_data->data[m_used], offsetStart, offsetEnd);
-    }
-}
-
-bool 
-ByteTagList::IsDirtyAtEnd (int32_t appendOffset)
-{
-  NS_LOG_FUNCTION (this << appendOffset);
-  ByteTagList::Iterator i = BeginAll ();
-  while (i.HasNext ())
-    {
-      ByteTagList::Iterator::Item item = i.Next ();
-      if (item.end > appendOffset)
-        {
-          return true;
-        }
-    }
-  return false;
-}
-
-bool 
-ByteTagList::IsDirtyAtStart (int32_t prependOffset)
-{
-  NS_LOG_FUNCTION (this << prependOffset);
-  ByteTagList::Iterator i = BeginAll ();
-  while (i.HasNext ())
-    {
-      ByteTagList::Iterator::Item item = i.Next ();
-      if (item.start < prependOffset)
-        {
-          return true;
-        }
+      return Iterator (m_data->data, &m_data->data[m_used], offsetStart, offsetEnd, m_adjustment);
     }
-  return false;
 }
 
 void 
-ByteTagList::AddAtEnd (int32_t adjustment, int32_t appendOffset)
+ByteTagList::AddAtEnd (int32_t appendOffset)
 {
-  NS_LOG_FUNCTION (this << adjustment << appendOffset);
-  if (adjustment == 0 && !IsDirtyAtEnd (appendOffset))
+  NS_LOG_FUNCTION (this << appendOffset);
+  if (m_maxEnd <= appendOffset - m_adjustment)
     {
       return;
     }
@@ -297,57 +286,54 @@
   while (i.HasNext ())
     {
       ByteTagList::Iterator::Item item = i.Next ();
-      item.start += adjustment;
-      item.end += adjustment;
 
       if (item.start >= appendOffset)
         {
           continue;
         }
-      else if (item.start < appendOffset && item.end > appendOffset)
+      if (item.end > appendOffset)
         {
           item.end = appendOffset;
         }
-      else
-        {
-          // nothing to do.
-        }
       TagBuffer buf = list.Add (item.tid, item.size, item.start, item.end);
       buf.CopyFrom (item.buf);
+      if (item.end > m_maxEnd)
+        {
+          m_maxEnd = item.end;
+        }
     }
   *this = list;
 }
 
 void 
-ByteTagList::AddAtStart (int32_t adjustment, int32_t prependOffset)
+ByteTagList::AddAtStart (int32_t prependOffset)
 {
-  NS_LOG_FUNCTION (this << adjustment << prependOffset);
-  if (adjustment == 0 && !IsDirtyAtStart (prependOffset))
+  NS_LOG_FUNCTION (this << prependOffset);
+  if (m_minStart >= prependOffset - m_adjustment)
     {
       return;
     }
+  m_minStart = INT32_MAX;
   ByteTagList list;
   ByteTagList::Iterator i = BeginAll ();
   while (i.HasNext ())
     {
       ByteTagList::Iterator::Item item = i.Next ();
-      item.start += adjustment;
-      item.end += adjustment;
 
       if (item.end <= prependOffset)
         {
           continue;
         }
-      else if (item.end > prependOffset && item.start < prependOffset)
+      if (item.start < prependOffset)
         {
           item.start = prependOffset;
         }
-      else
-        {
-          // nothing to do.
-        }
       TagBuffer buf = list.Add (item.tid, item.size, item.start, item.end);
       buf.CopyFrom (item.buf);
+      if (item.start < m_minStart)
+        {
+          m_minStart = item.start;
+        }
     }
   *this = list;
 }
diff -Naur ns-3.23/src/network/model/byte-tag-list.h ns-3.24/src/network/model/byte-tag-list.h
--- ns-3.23/src/network/model/byte-tag-list.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/byte-tag-list.h	2015-09-15 11:18:44.000000000 -0700
@@ -20,6 +20,7 @@
 #ifndef BYTE_TAG_LIST_H
 #define BYTE_TAG_LIST_H
 
+#define __STDC_LIMIT_MACROS
 #include <stdint.h>
 #include "ns3/type-id.h"
 #include "tag-buffer.h"
@@ -49,21 +50,15 @@
  *     as-needed to emulate COW semantics.
  *
  *   - Each tag tags a unique set of bytes identified by the pair of offsets
- *     (start,end). These offsets are provided by Buffer::GetCurrentStartOffset
- *     and Buffer::GetCurrentEndOffset which means that they are relative to 
- *     the start of the 'virtual byte buffer' as explained in the documentation
- *     for the ns3::Buffer class. Whenever the origin of the offset of the Buffer
- *     instance associated to this ByteTagList instance changes, the Buffer class
- *     reports this to its container Packet class as a bool return value
- *     in Buffer::AddAtStart and Buffer::AddAtEnd. In both cases, when this happens
- *     the Packet class calls ByteTagList::AddAtEnd and ByteTagList::AddAtStart to update
- *     the byte offsets of each tag in the ByteTagList.
- *
- *   - Whenever bytes are removed from the packet byte buffer, the ByteTagList offsets
- *     are never updated because we rely on the fact that they will be updated in
- *     either the next call to Packet::AddHeader or Packet::AddTrailer or when
- *     the user iterates the tag list with Packet::GetTagIterator and 
- *     TagIterator::Next.
+ *     (start,end). These offsets are relative to the start of the packet
+ *     Whenever the origin of the offset changes, the Packet adjusts all
+ *     byte tags using ByteTagList::Adjust method.
+ *
+ *   - When packet is reduced in size, byte tags that span outside the packet
+ *     boundaries remain in ByteTagList. It is not a problem as iterator fixes
+ *     the boundaries before returning item. However, when packet is extending,
+ *     it calls ByteTagList::AddAtStart or ByteTagList::AddAtEnd to cut byte
+ *     tags that will otherwise cover new bytes.
  */
 class ByteTagList
 {
@@ -125,8 +120,9 @@
      * \param end End tag
      * \param offsetStart offset to the start of the tag from the virtual byte buffer
      * \param offsetEnd offset to the end of the tag from the virtual byte buffer
+     * \param adjustment adjustment to byte tag offsets
      */
-    Iterator (uint8_t *start, uint8_t *end, int32_t offsetStart, int32_t offsetEnd);
+    Iterator (uint8_t *start, uint8_t *end, int32_t offsetStart, int32_t offsetEnd, int32_t m_adjustment);
 
     /**
      * \brief Prepare the iterator for the next tag
@@ -136,6 +132,7 @@
     uint8_t *m_end;         //!< End tag
     int32_t m_offsetStart;  //!< Offset to the start of the tag from the virtual byte buffer
     int32_t m_offsetEnd;    //!< Offset to the end of the tag from the virtual byte buffer
+    int32_t m_adjustment;   //!< Adjustment to byte tag offsets
     uint32_t m_nextTid;     //!< TypeId of the next tag
     uint32_t m_nextSize;    //!< Size of the next tag
     int32_t m_nextStart;    //!< Start of the next tag
@@ -204,42 +201,32 @@
    */
   ByteTagList::Iterator Begin (int32_t offsetStart, int32_t offsetEnd) const;
 
+  /*
+   * Adjust the offsets stored internally by the adjustment delta.
+   *
+   * \param adjustment value to change stored offsets by
+   */
+  inline void Adjust (int32_t adjustment);
+
   /**
-   * Adjust the offsets stored internally by the adjustment delta and
-   * make sure that all offsets are smaller than appendOffset which represents
+   * Make sure that all offsets are smaller than appendOffset which represents
    * the location where new bytes have been added to the byte buffer.
    * 
-   * \param adjustment value to change stored offsets by
    * \param appendOffset maximum offset value
    *
    */
-  void AddAtEnd (int32_t adjustment, int32_t appendOffset);
+  void AddAtEnd (int32_t appendOffset);
   /**
-   * Adjust the offsets stored internally by the adjustment delta and
-   * make sure that all offsets are bigger than prependOffset which represents
+   * Make sure that all offsets are bigger than prependOffset which represents
    * the location where new bytes have been added to the byte buffer.
    *
-   * \param adjustment value to change stored offsets byte
    * \param prependOffset minimum offset value
    *
    */
-  void AddAtStart (int32_t adjustment, int32_t prependOffset);
+  void AddAtStart (int32_t prependOffset);
 
 private:
   /**
-   * \brief Check that all offsets are smaller than appendOffset
-   * \param appendOffset the append offset to check
-   * \returns true if the check is false
-   */
-  bool IsDirtyAtEnd (int32_t appendOffset);
-  /**
-   * \brief Check that all offsets are bigger than prependOffset
-   * \param prependOffset the prepend offset to check
-   * \returns true if the check is false
-   */
-  bool IsDirtyAtStart (int32_t prependOffset);
-
-  /**
    * \brief Returns an iterator pointing to the very first tag in this list.
    *
    * \returns an iterator
@@ -259,10 +246,19 @@
    */
   void Deallocate (struct ByteTagListData *data);
 
+  int32_t m_minStart; // !< minimal start offset
+  int32_t m_maxEnd; // !< maximal end offset
+  int32_t m_adjustment; // !< adjustment to byte tag offsets
   uint16_t m_used; //!< the number of used bytes in the buffer
   struct ByteTagListData *m_data; //!< the ByteTagListData structure
 };
 
+void
+ByteTagList::Adjust (int32_t adjustment)
+{
+  m_adjustment += adjustment;
+}
+
 } // namespace ns3
 
 #endif /* BYTE_TAG_LIST_H */
diff -Naur ns-3.23/src/network/model/chunk.cc ns-3.24/src/network/model/chunk.cc
--- ns-3.23/src/network/model/chunk.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/chunk.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- 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>
+ */
+
 #include "chunk.h"
 
 namespace ns3 {
diff -Naur ns-3.23/src/network/model/chunk.h ns-3.24/src/network/model/chunk.h
--- ns-3.23/src/network/model/chunk.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/chunk.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- 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 CHUNK_H
 #define CHUNK_H
 
diff -Naur ns-3.23/src/network/model/header.cc ns-3.24/src/network/model/header.cc
--- ns-3.23/src/network/model/header.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/header.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- 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>
+ */
+
 #include "header.h"
 #include "ns3/log.h"
 
diff -Naur ns-3.23/src/network/model/net-device.h ns-3.24/src/network/model/net-device.h
--- ns-3.23/src/network/model/net-device.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -131,6 +131,10 @@
    */
   virtual bool IsLinkUp (void) const = 0;
   /**
+   * TracedCallback signature for link changed event.
+   */
+  typedef void (* LinkChangeTracedCallback) (void);
+  /**
    * \param callback the callback to invoke
    *
    * Add a callback invoked whenever the link 
@@ -188,12 +192,12 @@
   virtual Address GetMulticast (Ipv4Address multicastGroup) const = 0;
 
   /**
-* \brief Get the MAC multicast address corresponding
-* to the IPv6 address provided.
-* \param addr IPv6 address
-* \return the MAC multicast address
-* \warning Calling this method is invalid if IsMulticast returns not true.
-*/
+   * \brief Get the MAC multicast address corresponding
+   * to the IPv6 address provided.
+   * \param addr IPv6 address
+   * \return the MAC multicast address
+   * \warning Calling this method is invalid if IsMulticast returns not true.
+   */
   virtual Address GetMulticast (Ipv6Address addr) const = 0;
 
   /**
diff -Naur ns-3.23/src/network/model/packet.cc ns-3.24/src/network/model/packet.cc
--- ns-3.23/src/network/model/packet.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/packet.cc	2015-09-15 11:18:44.000000000 -0700
@@ -229,12 +229,14 @@
 {
   NS_LOG_FUNCTION (this << start << length);
   Buffer buffer = m_buffer.CreateFragment (start, length);
+  ByteTagList byteTagList = m_byteTagList;
+  byteTagList.Adjust (-start);
   NS_ASSERT (m_buffer.GetSize () >= start + length);
   uint32_t end = m_buffer.GetSize () - (start + length);
   PacketMetadata metadata = m_metadata.CreateFragment (start, end);
   // again, call the constructor directly rather than
   // through Create because it is private.
-  return Ptr<Packet> (new Packet (buffer, m_byteTagList, m_packetTagList, metadata), false);
+  return Ptr<Packet> (new Packet (buffer, byteTagList, m_packetTagList, metadata), false);
 }
 
 void
@@ -254,13 +256,9 @@
 {
   uint32_t size = header.GetSerializedSize ();
   NS_LOG_FUNCTION (this << header.GetInstanceTypeId ().GetName () << size);
-  uint32_t orgStart = m_buffer.GetCurrentStartOffset ();
-  bool resized = m_buffer.AddAtStart (size);
-  if (resized)
-    {
-      m_byteTagList.AddAtStart (m_buffer.GetCurrentStartOffset () + size - orgStart,
-                                m_buffer.GetCurrentStartOffset () + size);
-    }
+  m_buffer.AddAtStart (size);
+  m_byteTagList.Adjust (size);
+  m_byteTagList.AddAtStart (size);
   header.Serialize (m_buffer.Begin ());
   m_metadata.AddHeader (header, size);
 }
@@ -270,6 +268,7 @@
   uint32_t deserialized = header.Deserialize (m_buffer.Begin ());
   NS_LOG_FUNCTION (this << header.GetInstanceTypeId ().GetName () << deserialized);
   m_buffer.RemoveAtStart (deserialized);
+  m_byteTagList.Adjust (-deserialized);
   m_metadata.RemoveHeader (header, deserialized);
   return deserialized;
 }
@@ -285,13 +284,8 @@
 {
   uint32_t size = trailer.GetSerializedSize ();
   NS_LOG_FUNCTION (this << trailer.GetInstanceTypeId ().GetName () << size);
-  uint32_t orgStart = m_buffer.GetCurrentStartOffset ();
-  bool resized = m_buffer.AddAtEnd (size);
-  if (resized)
-    {
-      m_byteTagList.AddAtEnd (m_buffer.GetCurrentStartOffset () - orgStart,
-                              m_buffer.GetCurrentEndOffset () - size);
-    }
+  m_byteTagList.AddAtEnd (GetSize ());
+  m_buffer.AddAtEnd (size);
   Buffer::Iterator end = m_buffer.End ();
   trailer.Serialize (end);
   m_metadata.AddTrailer (trailer, size);
@@ -317,29 +311,20 @@
 Packet::AddAtEnd (Ptr<const Packet> packet)
 {
   NS_LOG_FUNCTION (this << packet << packet->GetSize ());
-  uint32_t aStart = m_buffer.GetCurrentStartOffset ();
-  uint32_t bEnd = packet->m_buffer.GetCurrentEndOffset ();
-  m_buffer.AddAtEnd (packet->m_buffer);
-  uint32_t appendPrependOffset = m_buffer.GetCurrentEndOffset () - packet->m_buffer.GetSize ();
-  m_byteTagList.AddAtEnd (m_buffer.GetCurrentStartOffset () - aStart, 
-                          appendPrependOffset);
+  m_byteTagList.AddAtEnd (GetSize ());
   ByteTagList copy = packet->m_byteTagList;
-  copy.AddAtStart (m_buffer.GetCurrentEndOffset () - bEnd,
-                   appendPrependOffset);
+  copy.AddAtStart (0);
+  copy.Adjust (GetSize ());
   m_byteTagList.Add (copy);
+  m_buffer.AddAtEnd (packet->m_buffer);
   m_metadata.AddAtEnd (packet->m_metadata);
 }
 void
 Packet::AddPaddingAtEnd (uint32_t size)
 {
   NS_LOG_FUNCTION (this << size);
-  uint32_t orgEnd = m_buffer.GetCurrentEndOffset ();
-  bool resized = m_buffer.AddAtEnd (size);
-  if (resized)
-    {
-      m_byteTagList.AddAtEnd (m_buffer.GetCurrentEndOffset () - orgEnd,
-                              m_buffer.GetCurrentEndOffset () - size);
-    }
+  m_byteTagList.AddAtEnd (GetSize ());
+  m_buffer.AddAtEnd (size);
   m_metadata.AddPaddingAtEnd (size);
 }
 void 
@@ -354,6 +339,7 @@
 {
   NS_LOG_FUNCTION (this << size);
   m_buffer.RemoveAtStart (size);
+  m_byteTagList.Adjust (-size);
   m_metadata.RemoveAtStart (size);
 }
 
@@ -805,14 +791,14 @@
   NS_LOG_FUNCTION (this << tag.GetInstanceTypeId ().GetName () << tag.GetSerializedSize ());
   ByteTagList *list = const_cast<ByteTagList *> (&m_byteTagList);
   TagBuffer buffer = list->Add (tag.GetInstanceTypeId (), tag.GetSerializedSize (), 
-                                m_buffer.GetCurrentStartOffset (),
-                                m_buffer.GetCurrentEndOffset ());
+                                0,
+                                GetSize ());
   tag.Serialize (buffer);
 }
 ByteTagIterator 
 Packet::GetByteTagIterator (void) const
 {
-  return ByteTagIterator (m_byteTagList.Begin (m_buffer.GetCurrentStartOffset (), m_buffer.GetCurrentEndOffset ()));
+  return ByteTagIterator (m_byteTagList.Begin (0, GetSize ()));
 }
 
 bool 
diff -Naur ns-3.23/src/network/model/packet.h ns-3.24/src/network/model/packet.h
--- ns-3.23/src/network/model/packet.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/packet.h	2015-09-15 11:18:44.000000000 -0700
@@ -29,6 +29,7 @@
 #include "byte-tag-list.h"
 #include "packet-tag-list.h"
 #include "nix-vector.h"
+#include "ns3/mac48-address.h"
 #include "ns3/callback.h"
 #include "ns3/assert.h"
 #include "ns3/ptr.h"
@@ -660,16 +661,25 @@
    *
    * \param [in] packet The packet.
    */
-  typedef void (* TracedCallback) (const Ptr<const Packet> packet);
+  typedef void (* TracedCallback) (Ptr<const Packet> packet);
   
   /**
-   * TracedCallback signature for packet and address.
+   * TracedCallback signature for packet and Address.
    *
    * \param [in] packet The packet.
    * \param [in] address The address.
    */
-  typedef void (* PacketAddressTracedCallback)
-    (const Ptr<const Packet> packet, const Address &address);
+  typedef void (* AddressTracedCallback)
+    (Ptr<const Packet> packet, const Address &address);
+  
+  /**
+   * TracedCallback signature for packet and Mac48Address.
+   *
+   * \param [in] packet The packet.
+   * \param [in] mac The Mac48Address.
+   */
+  typedef void (* Mac48AddressTracedCallback)
+    (Ptr<const Packet> packet, Mac48Address mac);
   
   /**
    * TracedCallback signature for changes in packet size.
@@ -677,9 +687,19 @@
    * \param [in] oldSize The previous packet's size.
    * \param [in] newSize The actual packet's size.
    */
-  typedef void (* PacketSizeTracedCallback)
-    (const uint32_t oldSize, const uint32_t newSize);
+  typedef void (* SizeTracedCallback)
+    (uint32_t oldSize, uint32_t newSize);
 
+  /**
+   * TracedCallback signature for packet and SINR.
+   *
+   * \param [in] packet The packet.
+   * \param [in] sinr The received SINR.
+   */
+  typedef void (* SinrTracedCallback)
+    (Ptr<const Packet> packet, double sinr);
+    
+  
 private:
   /**
    * \brief Constructor
diff -Naur ns-3.23/src/network/model/packet-tag-list.h ns-3.24/src/network/model/packet-tag-list.h
--- ns-3.23/src/network/model/packet-tag-list.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/packet-tag-list.h	2015-09-15 11:18:44.000000000 -0700
@@ -158,7 +158,7 @@
      */
     enum TagData_e
     {
-      MAX_SIZE = 20           /**< Size of serialization buffer #data */
+      MAX_SIZE = 21           /**< Size of serialization buffer #data */
   };
 
     uint8_t data[MAX_SIZE];   /**< Serialization buffer */
diff -Naur ns-3.23/src/network/model/trailer.cc ns-3.24/src/network/model/trailer.cc
--- ns-3.23/src/network/model/trailer.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/model/trailer.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- 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>
+ */
+
 #include "trailer.h"
 #include "ns3/log.h"
 
diff -Naur ns-3.23/src/network/test/buffer-test.cc ns-3.24/src/network/test/buffer-test.cc
--- ns-3.23/src/network/test/buffer-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/test/buffer-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 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>
+ */
+
 #include "ns3/buffer.h"
 #include "ns3/random-variable-stream.h"
 #include "ns3/double.h"
@@ -136,9 +156,8 @@
   buff64.AddAtStart (8);
   i = buff64.Begin ();
   i.WriteU64 (0x0123456789ABCDEFllu);
-  ENSURE_WRITTEN_BYTES (buff64, 8, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01);
   i = buff64.Begin ();
-  NS_TEST_ASSERT_MSG_EQ (i.ReadLsbtohU64 (), 0x0123456789abcdefllu, "Could not read expected value");
+  NS_TEST_ASSERT_MSG_EQ (i.ReadU64 (), 0x0123456789abcdefllu, "Could not read expected value");
   i = buff64.Begin ();
   i.WriteHtolsbU64 (0x0123456789ABCDEFllu);
   ENSURE_WRITTEN_BYTES (buff64, 8, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01);
diff -Naur ns-3.23/src/network/test/packet-test-suite.cc ns-3.24/src/network/test/packet-test-suite.cc
--- ns-3.23/src/network/test/packet-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/test/packet-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -40,7 +40,21 @@
 public:
   ATestTagBase () : m_error (false), m_data (0) {}
   ATestTagBase (uint8_t data) : m_error (false), m_data (data) {}
-  virtual int GetData () const {
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void)
+  {
+    static TypeId tid = TypeId ("ATestTagBase")
+      .SetParent<Tag> ()
+      .SetGroupName ("Network")
+      .HideFromDocumentation ()
+    // No AddConstructor because this is an abstract class.
+      ;
+    return tid;
+  }
+  int GetData () const {
     int result = (int)m_data;
     return result;
   }
@@ -52,13 +66,18 @@
 class ATestTag : public ATestTagBase
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void) {
     std::ostringstream oss;
     oss << "anon::ATestTag<" << N << ">";
     static TypeId tid = TypeId (oss.str ().c_str ())
-      .SetParent<Tag> ()
-      .AddConstructor<ATestTag<N> > ()
+      .SetParent<ATestTagBase> ()
+      .SetGroupName ("Network")
       .HideFromDocumentation ()
+      .AddConstructor<ATestTag<N> > ()
     ;
     return tid;
   }
@@ -99,6 +118,20 @@
 {
 public:
   ATestHeaderBase () : Header (), m_error (false) {}
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void)
+  {
+    static TypeId tid = TypeId ("ATestHeaderBase")
+      .SetParent<Header> ()
+      .SetGroupName ("Network")
+      .HideFromDocumentation ()
+      // No AddConstructor because this is an abstract class.
+      ;
+    return tid;
+  }
   bool m_error;
 };
 
@@ -106,13 +139,18 @@
 class ATestHeader : public ATestHeaderBase
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void) {
     std::ostringstream oss;
     oss << "anon::ATestHeader<" << N << ">";
     static TypeId tid = TypeId (oss.str ().c_str ())
-      .SetParent<Header> ()
-      .AddConstructor<ATestHeader<N> > ()
+      .SetParent<ATestHeaderBase> ()
+      .SetGroupName ("Network")
       .HideFromDocumentation ()
+      .AddConstructor<ATestHeader<N> > ()
     ;
     return tid;
   }
@@ -150,6 +188,20 @@
 {
 public:
   ATestTrailerBase () : Trailer (), m_error (false) {}
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void)
+  {
+    static TypeId tid = TypeId ("ATestTrailerBase")
+      .SetParent<Trailer> ()
+      .SetGroupName ("Network")
+      .HideFromDocumentation ()
+    // No AddConstructor because this is an abstract class.
+      ;
+    return tid;
+  }
   bool m_error;
 };
 
@@ -157,13 +209,18 @@
 class ATestTrailer : public ATestTrailerBase
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void) {
     std::ostringstream oss;
     oss << "anon::ATestTrailer<" << N << ">";
     static TypeId tid = TypeId (oss.str ().c_str ())
-      .SetParent<Header> ()
-      .AddConstructor<ATestTrailer<N> > ()
+      .SetParent<ATestTrailerBase> ()
+      .SetGroupName ("Network")
       .HideFromDocumentation ()
+      .AddConstructor<ATestTrailer<N> > ()
     ;
     return tid;
   }
@@ -451,6 +508,80 @@
     CHECK (tmp, 1, E (20, 1, 1001));
 #endif
   }
+
+  /* Test reducing tagged packet size and increasing it back. */
+  {
+    Ptr<Packet> tmp = Create<Packet> (0);
+    tmp->AddHeader (ATestHeader<100> ());
+    tmp->AddByteTag (ATestTag<25> ());
+    CHECK (tmp, 1, E (25, 0, 100));
+    tmp->RemoveAtStart (50);
+    CHECK (tmp, 1, E (25, 0, 50));
+    tmp->AddHeader (ATestHeader<50> ());
+    CHECK (tmp, 1, E (25, 50, 100));
+  }
+
+  /* Similar test case, but using trailer instead of header. */
+  {
+    Ptr<Packet> tmp = Create<Packet> (0);
+    tmp->AddTrailer (ATestTrailer<100> ());
+    tmp->AddByteTag (ATestTag<25> ());
+    CHECK (tmp, 1, E (25, 0, 100));
+    tmp->RemoveAtEnd (50);
+    CHECK (tmp, 1, E (25, 0, 50));
+    tmp->AddTrailer (ATestTrailer<50> ());
+    CHECK (tmp, 1, E (25, 0, 50));
+  }
+
+  /* Test reducing tagged packet size and increasing it by half. */
+  {
+    Ptr<Packet> tmp = Create<Packet> (0);
+    tmp->AddHeader (ATestHeader<100> ());
+    tmp->AddByteTag (ATestTag<25> ());
+    CHECK (tmp, 1, E (25, 0, 100));
+    tmp->RemoveAtStart (50);
+    CHECK (tmp, 1, E (25, 0, 50));
+    tmp->AddHeader (ATestHeader<25> ());
+    CHECK (tmp, 1, E (25, 25, 75));
+  }
+
+  /* Similar test case, but using trailer instead of header. */
+  {
+    Ptr<Packet> tmp = Create<Packet> (0);
+    tmp->AddTrailer (ATestTrailer<100> ());
+    tmp->AddByteTag (ATestTag<25> ());
+    CHECK (tmp, 1, E (25, 0, 100));
+    tmp->RemoveAtEnd (50);
+    CHECK (tmp, 1, E (25, 0, 50));
+    tmp->AddTrailer (ATestTrailer<25> ());
+    CHECK (tmp, 1, E (25, 0, 50));
+  }
+
+  /* Test AddPaddingAtEnd. */
+  {
+    Ptr<Packet> tmp = Create<Packet> (0);
+    tmp->AddTrailer (ATestTrailer<100> ());
+    tmp->AddByteTag (ATestTag<25> ());
+    CHECK (tmp, 1, E (25, 0, 100));
+    tmp->RemoveAtEnd (50);
+    CHECK (tmp, 1, E (25, 0, 50));
+    tmp->AddPaddingAtEnd (50);
+    CHECK (tmp, 1, E (25, 0, 50));
+  }
+
+  /* Test reducing tagged packet size and increasing it back,
+   * now using padding bytes to avoid triggering dirty state
+   * in virtual buffer
+   */
+  {
+    Ptr<Packet> tmp = Create<Packet> (100);
+    tmp->AddByteTag (ATestTag<25> ());
+    CHECK (tmp, 1, E (25, 0, 100));
+    tmp->RemoveAtEnd (50);
+    CHECK (tmp, 1, E (25, 0, 50));
+    tmp->AddPaddingAtEnd (50);
+    CHECK (tmp, 1, E (25, 0, 50));
+  }
 }
 //--------------------------------------
 class PacketTagListTest : public TestCase
diff -Naur ns-3.23/src/network/test/pcap-file-test-suite.cc ns-3.24/src/network/test/pcap-file-test-suite.cc
--- ns-3.23/src/network/test/pcap-file-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/test/pcap-file-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -211,7 +211,7 @@
 };
 
 ReadModeCreateTestCase::ReadModeCreateTestCase ()
-  : TestCase ("Check to see that PcapFile::Open with mode \"std::ios::in\" works")
+  : TestCase ("Check to see that PcapFile::Open with mode std::ios::in works")
 {
 }
 
@@ -320,7 +320,7 @@
 };
 
 AppendModeCreateTestCase::AppendModeCreateTestCase ()
-  : TestCase ("Check to see that PcapFile::Open with mode \"std::ios::app\" works")
+  : TestCase ("Check to see that PcapFile::Open with mode std::ios::app works")
 {
 }
 
@@ -1090,8 +1090,8 @@
   // Check that PcapDiff(file, file) is false
   //
   std::string filename = CreateDataDirFilename ("known.pcap");
-  uint32_t sec (0), usec (0);
-  bool diff = PcapFile::Diff (filename, filename, sec, usec);
+  uint32_t sec (0), usec (0), packets (0);
+  bool diff = PcapFile::Diff (filename, filename, sec, usec, packets);
   NS_TEST_EXPECT_MSG_EQ (diff, false, "PcapDiff(file, file) must always be false");
 
   //
@@ -1114,7 +1114,8 @@
     }
   f.Close ();
 
-  diff = PcapFile::Diff (filename, filename2, sec, usec);
+  packets = 0;
+  diff = PcapFile::Diff (filename, filename2, sec, usec, packets);
   NS_TEST_EXPECT_MSG_EQ (diff, true, "PcapDiff(file, file2) must be true");
   NS_TEST_EXPECT_MSG_EQ (sec,  2, "Files are different from 2.3696 seconds");
   NS_TEST_EXPECT_MSG_EQ (usec, 3696, "Files are different from 2.3696 seconds");
diff -Naur ns-3.23/src/network/utils/ascii-file.cc ns-3.24/src/network/utils/ascii-file.cc
--- ns-3.23/src/network/utils/ascii-file.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/ascii-file.cc	2015-09-15 11:18:44.000000000 -0700
@@ -80,9 +80,9 @@
 }
 
 bool
-AsciiFile:: Diff (std::string const & f1,
-		  std::string const & f2, 
-		  uint64_t & lineNumber)
+AsciiFile::Diff (std::string const & f1,
+                 std::string const & f2, 
+                 uint64_t & lineNumber)
 {
   AsciiFile ascii1, ascii2;
   ascii1.Open (f1, std::ios::in);
diff -Naur ns-3.23/src/network/utils/data-rate.h ns-3.24/src/network/utils/data-rate.h
--- ns-3.23/src/network/utils/data-rate.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/data-rate.h	2015-09-15 11:18:44.000000000 -0700
@@ -184,6 +184,9 @@
    * Calculates the transmission time at this data rate
    * \param bytes The number of bytes (not bits) for which to calculate
    * \return The transmission time in seconds for the number of bytes specified
+   *
+   * \deprecated This method will go away in future versions of ns-3.
+   * See instead CalculateBytesTxTime()
    */
   double CalculateTxTime (uint32_t bytes) const NS_DEPRECATED;
 
diff -Naur ns-3.23/src/network/utils/drop-tail-queue.cc ns-3.24/src/network/utils/drop-tail-queue.cc
--- ns-3.23/src/network/utils/drop-tail-queue.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/drop-tail-queue.cc	2015-09-15 11:18:44.000000000 -0700
@@ -36,7 +36,8 @@
     .AddAttribute ("Mode", 
                    "Whether to use bytes (see MaxBytes) or packets (see MaxPackets) as the maximum queue size metric.",
                    EnumValue (QUEUE_MODE_PACKETS),
-                   MakeEnumAccessor (&DropTailQueue::SetMode),
+                   MakeEnumAccessor (&DropTailQueue::SetMode,
+                                     &DropTailQueue::GetMode),
                    MakeEnumChecker (QUEUE_MODE_BYTES, "QUEUE_MODE_BYTES",
                                     QUEUE_MODE_PACKETS, "QUEUE_MODE_PACKETS"))
     .AddAttribute ("MaxPackets", 
@@ -75,7 +76,7 @@
 }
 
 DropTailQueue::QueueMode
-DropTailQueue::GetMode (void)
+DropTailQueue::GetMode (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_mode;
diff -Naur ns-3.23/src/network/utils/drop-tail-queue.h ns-3.24/src/network/utils/drop-tail-queue.h
--- ns-3.23/src/network/utils/drop-tail-queue.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/drop-tail-queue.h	2015-09-15 11:18:44.000000000 -0700
@@ -61,7 +61,7 @@
    *
    * \returns The encapsulation mode of this device.
    */
-  DropTailQueue::QueueMode GetMode (void);
+  DropTailQueue::QueueMode GetMode (void) const;
 
 private:
   virtual bool DoEnqueue (Ptr<Packet> p);
diff -Naur ns-3.23/src/network/utils/mac48-address.h ns-3.24/src/network/utils/mac48-address.h
--- ns-3.23/src/network/utils/mac48-address.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/mac48-address.h	2015-09-15 11:18:44.000000000 -0700
@@ -134,7 +134,7 @@
    *
    * \param [in] value Current value of the Mac48Address
    */
-  typedef void (* TracedCallback)(const Mac48Address value);
+  typedef void (* TracedCallback)(Mac48Address value);
   
 private:
   /**
diff -Naur ns-3.23/src/network/utils/packet-burst.h ns-3.24/src/network/utils/packet-burst.h
--- ns-3.23/src/network/utils/packet-burst.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/packet-burst.h	2015-09-15 11:18:44.000000000 -0700
@@ -80,7 +80,7 @@
    *
    * \param [in] burst The PacketBurst
    */
-  typedef void (* TracedCallback)(const Ptr<const PacketBurst> burst);
+  typedef void (* TracedCallback)(Ptr<const PacketBurst> burst);
 
   
 private:
diff -Naur ns-3.23/src/network/utils/packet-data-calculators.cc ns-3.24/src/network/utils/packet-data-calculators.cc
--- ns-3.23/src/network/utils/packet-data-calculators.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/packet-data-calculators.cc	2015-09-15 11:18:44.000000000 -0700
@@ -40,6 +40,17 @@
 {
   NS_LOG_FUNCTION_NOARGS ();
 }
+/* static */
+TypeId
+PacketCounterCalculator::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::PacketCounterCalculator")
+    .SetParent<CounterCalculator<uint32_t> > ()
+    .SetGroupName ("Network")
+    .AddConstructor<PacketCounterCalculator> ()
+    ;
+  return tid;
+}
 void
 PacketCounterCalculator::DoDispose (void)
 {
@@ -85,6 +96,17 @@
 {
   NS_LOG_FUNCTION_NOARGS ();
 }
+/* static */
+TypeId
+PacketSizeMinMaxAvgTotalCalculator::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::PacketSizeMinMaxAvgTotalCalculator")
+    .SetParent<MinMaxAvgTotalCalculator<uint32_t> > ()
+    .SetGroupName ("Network")
+    .AddConstructor<PacketSizeMinMaxAvgTotalCalculator> ()
+    ;
+  return tid;
+}
 void
 PacketSizeMinMaxAvgTotalCalculator::DoDispose (void)
 {
diff -Naur ns-3.23/src/network/utils/packet-data-calculators.h ns-3.24/src/network/utils/packet-data-calculators.h
--- ns-3.23/src/network/utils/packet-data-calculators.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/packet-data-calculators.h	2015-09-15 11:18:44.000000000 -0700
@@ -40,6 +40,12 @@
   virtual ~PacketCounterCalculator();
 
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
+  /**
    * Increments the packet counter by one
    *
    * \param path not used in this method
@@ -72,12 +78,19 @@
  *
  */
 class PacketSizeMinMaxAvgTotalCalculator :
-  public MinMaxAvgTotalCalculator<uint32_t> {
+  public MinMaxAvgTotalCalculator<uint32_t>
+{
 public:
   PacketSizeMinMaxAvgTotalCalculator();
   virtual ~PacketSizeMinMaxAvgTotalCalculator();
   
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
+  /**
    * Increments the packet stats by the size of the packet
    *
    * \param path not used in this method
diff -Naur ns-3.23/src/network/utils/packet-probe.cc ns-3.24/src/network/utils/packet-probe.cc
--- ns-3.23/src/network/utils/packet-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/packet-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -48,7 +48,7 @@
     .AddTraceSource ( "OutputBytes",
                       "The number of bytes in the packet",
                       MakeTraceSourceAccessor (&PacketProbe::m_outputBytes),
-                      "ns3::Packet::PacketSizeTracedCallback")
+                      "ns3::Packet::SizeTracedCallback")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/network/utils/packet-socket-client.cc ns-3.24/src/network/utils/packet-socket-client.cc
--- ns-3.23/src/network/utils/packet-socket-client.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/packet-socket-client.cc	2015-09-15 11:18:44.000000000 -0700
@@ -62,7 +62,7 @@
                    MakeUintegerChecker<uint32_t> ())
     .AddTraceSource ("Tx", "A packet has been sent",
                      MakeTraceSourceAccessor (&PacketSocketClient::m_txTrace),
-                     "ns3::Packet::PacketAddressTracedCallback")
+                     "ns3::Packet::AddressTracedCallback")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/network/utils/packet-socket-server.cc ns-3.24/src/network/utils/packet-socket-server.cc
--- ns-3.23/src/network/utils/packet-socket-server.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/packet-socket-server.cc	2015-09-15 11:18:44.000000000 -0700
@@ -48,7 +48,7 @@
     .AddConstructor<PacketSocketServer> ()
     .AddTraceSource ("Rx", "A packet has been received",
                      MakeTraceSourceAccessor (&PacketSocketServer::m_rxTrace),
-                     "ns3::Packet::PacketAddressTracedCallback")
+                     "ns3::Packet::AddressTracedCallback")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/network/utils/pcap-file.cc ns-3.24/src/network/utils/pcap-file.cc
--- ns-3.23/src/network/utils/pcap-file.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/pcap-file.cc	2015-09-15 11:18:44.000000000 -0700
@@ -28,6 +28,7 @@
 #include "ns3/buffer.h"
 #include "pcap-file.h"
 #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 
 // adding any ns-3 specific constructs such as Packet to this file.
@@ -397,6 +398,7 @@
   m_file.write ((const char *)&header.m_tsUsec, sizeof(header.m_tsUsec));
   m_file.write ((const char *)&header.m_inclLen, sizeof(header.m_inclLen));
   m_file.write ((const char *)&header.m_origLen, sizeof(header.m_origLen));
+  NS_BUILD_DEBUG(m_file.flush());
   return inclLen;
 }
 
@@ -406,6 +408,7 @@
   NS_LOG_FUNCTION (this << tsSec << tsUsec << &data << totalLen);
   uint32_t inclLen = WritePacketHeader (tsSec, tsUsec, totalLen);
   m_file.write ((const char *)data, inclLen);
+  NS_BUILD_DEBUG(m_file.flush());
 }
 
 void 
@@ -414,10 +417,11 @@
   NS_LOG_FUNCTION (this << tsSec << tsUsec << p);
   uint32_t inclLen = WritePacketHeader (tsSec, tsUsec, p->GetSize ());
   p->CopyData (&m_file, inclLen);
+  NS_BUILD_DEBUG(m_file.flush());
 }
 
 void 
-PcapFile::Write (uint32_t tsSec, uint32_t tsUsec, Header &header, Ptr<const Packet> p)
+PcapFile::Write (uint32_t tsSec, uint32_t tsUsec, const Header &header, Ptr<const Packet> p)
 {
   NS_LOG_FUNCTION (this << tsSec << tsUsec << &header << p);
   uint32_t headerSize = header.GetSerializedSize ();
@@ -494,7 +498,7 @@
 
 bool
 PcapFile::Diff (std::string const & f1, std::string const & f2, 
-                uint32_t & sec, uint32_t & usec, 
+                uint32_t & sec, uint32_t & usec, uint32_t & packets,
                 uint32_t snapLen)
 {
   NS_LOG_FUNCTION (f1 << f2 << sec << usec << snapLen);
@@ -537,6 +541,8 @@
           break;
         }
 
+      ++packets;
+      
       if (tsSec1 != tsSec2 || tsUsec1 != tsUsec2)
         {
           diff = true; // Next packet timestamps do not match
diff -Naur ns-3.23/src/network/utils/pcap-file.h ns-3.24/src/network/utils/pcap-file.h
--- ns-3.23/src/network/utils/pcap-file.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/pcap-file.h	2015-09-15 11:18:44.000000000 -0700
@@ -95,7 +95,7 @@
    * PCAP_PPP, PCAP_80211, etc.  If you are storing different kinds of packet
    * data, such as naked TCP headers, you are at liberty to locally define your
    * own data link types.  According to the pcap-linktype man page, "well-known"
-   * pcap linktypes range from 0 to 177.  If you use a large random number for
+   * pcap linktypes range from 0 to 263.  If you use a large random number for
    * your type, chances are small for a collision.
    *
    * \param snapLen An optional maximum size for packets written to the file.
@@ -147,7 +147,7 @@
    * \param p           Packet to write
    * 
    */
-  void Write (uint32_t tsSec, uint32_t tsUsec, Header &header, Ptr<const Packet> p);
+  void Write (uint32_t tsSec, uint32_t tsUsec, const Header &header, Ptr<const Packet> p);
 
 
   /**
@@ -273,7 +273,7 @@
    * \param  snapLen    Snap length (if used)
    */
   static bool Diff (std::string const & f1, std::string const & f2, 
-                    uint32_t & sec, uint32_t & usec, 
+                    uint32_t & sec, uint32_t & usec, uint32_t & packets,
                     uint32_t snapLen = SNAPLEN_DEFAULT);
 
 private:
@@ -337,6 +337,10 @@
   void WriteFileHeader (void);
   /**
    * \brief Write a Pcap packet header
+   *
+   * The pcap header has a fixed length of 24 bytes. The last 4 bytes
+   * represent the link-layer type
+   *
    * \param tsSec Time stamp (seconds part)
    * \param tsUsec Time stamp (microseconds part)
    * \param totalLen total packet length
diff -Naur ns-3.23/src/network/utils/pcap-file-wrapper.cc ns-3.24/src/network/utils/pcap-file-wrapper.cc
--- ns-3.23/src/network/utils/pcap-file-wrapper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/pcap-file-wrapper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -121,7 +121,7 @@
 }
 
 void
-PcapFileWrapper::Write (Time t, Header &header, Ptr<const Packet> p)
+PcapFileWrapper::Write (Time t, const Header &header, Ptr<const Packet> p)
 {
   NS_LOG_FUNCTION (this << t << &header << p);
   uint64_t current = t.GetMicroSeconds ();
diff -Naur ns-3.23/src/network/utils/pcap-file-wrapper.h ns-3.24/src/network/utils/pcap-file-wrapper.h
--- ns-3.23/src/network/utils/pcap-file-wrapper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/pcap-file-wrapper.h	2015-09-15 11:18:44.000000000 -0700
@@ -130,7 +130,7 @@
    * \param p Packet to write to the pcap file.
    * 
    */
-  void Write (Time t, Header &header, Ptr<const Packet> p);
+  void Write (Time t, const Header &header, Ptr<const Packet> p);
 
   /**
    * \brief Write the provided data buffer to the pcap file.
diff -Naur ns-3.23/src/network/utils/pcap-test.h ns-3.24/src/network/utils/pcap-test.h
--- ns-3.23/src/network/utils/pcap-test.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/pcap-test.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 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 PCAP_TEST_H
 #define PCAP_TEST_H
 
@@ -21,12 +41,14 @@
     oss << filename;                                                    \
     std::string expected = CreateDataDirFilename (oss.str());           \
     std::string got = CreateTempDirFilename (oss.str());                \
-    uint32_t sec(0), usec(0);                                           \
-    /** \todo support default PcapWriter snap length here */			\
-    bool diff = PcapFile::Diff (got, expected, sec, usec);              \
+    uint32_t sec(0), usec(0), packets(0);				\
+    /** \todo support default PcapWriter snap length here */		\
+    bool diff = PcapFile::Diff (got, expected, sec, usec, packets);	\
     NS_TEST_EXPECT_MSG_EQ (diff, false,                                 \
-                           "PCAP traces " << got << " and " << expected \
-                           << " differ starting from " << sec << " s "  \
+                           "PCAP traces "				\
+			   << got << " and " << expected		\
+                           << " differ starting from packet "		\
+			   << packets << " at " << sec << " s "		\
                            << usec << " us");                           \
   } while (false)
 
diff -Naur ns-3.23/src/network/utils/radiotap-header.cc ns-3.24/src/network/utils/radiotap-header.cc
--- ns-3.23/src/network/utils/radiotap-header.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/radiotap-header.cc	2015-09-15 11:18:44.000000000 -0700
@@ -3,7 +3,7 @@
  * 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 
+ * 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,
@@ -15,7 +15,8 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Include., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: Nicola Baldo <nbaldo@cttc.es>
+ * Authors: Nicola Baldo <nbaldo@cttc.es>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
 #include <iomanip>
@@ -28,8 +29,8 @@
 NS_LOG_COMPONENT_DEFINE ("RadiotapHeader");
 
 NS_OBJECT_ENSURE_REGISTERED (RadiotapHeader);
- 
-RadiotapHeader::RadiotapHeader()
+
+RadiotapHeader::RadiotapHeader ()
   : m_length (8),
     m_present (0),
     m_tsft (0),
@@ -38,23 +39,33 @@
     m_channelFreq (0),
     m_channelFlags (CHANNEL_FLAG_NONE),
     m_antennaSignal (0),
-    m_antennaNoise (0)
+    m_antennaNoise (0),
+    m_ampduStatusRef (0),
+    m_ampduStatusFlags (0),
+    m_ampduStatusCRC (0),
+    m_vhtPad (0),
+    m_vhtKnown (0),
+    m_vhtFlags (0),
+    m_vhtBandwidth (0),
+    m_vhtCoding (0),
+    m_vhtGroupId (0),
+    m_vhtPartialAid (0)
 {
   NS_LOG_FUNCTION (this);
 }
- 
+
 TypeId RadiotapHeader::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::RadiotapHeader")
     .SetParent<Header> ()
-    .SetGroupName("Network")
+    .SetGroupName ("Network")
 
     .AddConstructor<RadiotapHeader> ()
   ;
   return tid;
 }
 
-TypeId 
+TypeId
 RadiotapHeader::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
@@ -78,7 +89,7 @@
   start.WriteU32 (m_present); // bits describing which fields follow header
 
   //
-  // Time Synchronization Function Timer (when the first bit of the MPDU 
+  // Time Synchronization Function Timer (when the first bit of the MPDU
   // arrived at the MAC)
   //
   if (m_present & RADIOTAP_TSFT) // bit 0
@@ -107,11 +118,21 @@
   //
   if (m_present & RADIOTAP_CHANNEL) // bit 3
     {
+      start.WriteU8 (0, m_channelPad);
       start.WriteU16 (m_channelFreq);
       start.WriteU16 (m_channelFlags);
     }
 
   //
+  // The hop set and pattern for frequency-hopping radios.  We don't need it but
+  // still need to account for it.
+  //
+  if (m_present & RADIOTAP_FHSS) // bit 4
+    {
+      start.WriteU8 (0); //not yet implemented
+    }
+
+  //
   // RF signal power at the antenna, decibel difference from an arbitrary, fixed
   // reference.
   //
@@ -121,13 +142,121 @@
     }
 
   //
-  // RF noise power at the antenna, decibel difference from an arbitrary, fixed 
+  // RF noise power at the antenna, decibel difference from an arbitrary, fixed
   // reference.
   //
   if (m_present & RADIOTAP_DBM_ANTNOISE) // bit 6
     {
       start.WriteU8 (m_antennaNoise);
     }
+
+  //
+  // Quality of Barker code lock.
+  //
+  if (m_present & RADIOTAP_LOCK_QUALITY) // bit 7
+    {
+      start.WriteU16 (0); //not yet implemented
+    }
+
+  //
+  // Transmit power expressed as unitless distance from max power
+  // set at factory calibration (0 is max power).
+  //
+  if (m_present & RADIOTAP_TX_ATTENUATION) // bit 8
+    {
+      start.WriteU16 (0); //not yet implemented
+    }
+
+  //
+  // Transmit power expressed as decibel distance from max power
+  // set at factory calibration (0 is max power).
+  //
+  if (m_present & RADIOTAP_DB_TX_ATTENUATION) // bit 9
+    {
+      start.WriteU16 (0); //not yet implemented
+    }
+
+  //
+  // Transmit power expressed as dBm (decibels from a 1 milliwatt reference).
+  // This is the absolute power level measured at the antenna port.
+  //
+  if (m_present & RADIOTAP_DBM_TX_POWER) // bit 10
+    {
+      start.WriteU8 (0); //not yet implemented
+    }
+
+  //
+  // Unitless indication of the Rx/Tx antenna for this packet.
+  // The first antenna is antenna 0.
+  //
+  if (m_present & RADIOTAP_ANTENNA) // bit 11
+    {
+      start.WriteU8 (0); //not yet implemented
+    }
+
+  //
+  // RF signal power at the antenna (decibel difference from an arbitrary fixed reference).
+  //
+  if (m_present & RADIOTAP_DB_ANTSIGNAL) // bit 12
+    {
+      start.WriteU8 (0); //not yet implemented
+    }
+
+  //
+  // RF noise power at the antenna (decibel difference from an arbitrary fixed reference).
+  //
+  if (m_present & RADIOTAP_DB_ANTNOISE) // bit 13
+    {
+      start.WriteU8 (0); //not yet implemented
+    }
+
+  //
+  // Properties of received frames.
+  //
+  if (m_present & RADIOTAP_RX_FLAGS) // bit 14
+    {
+      start.WriteU16 (0); //not yet implemented
+    }
+
+  //
+  // MCS field.
+  //
+  if (m_present & RADIOTAP_MCS) // bit 19
+    {
+      start.WriteU8 (m_mcsKnown);
+      start.WriteU8 (m_mcsFlags);
+      start.WriteU8 (m_mcsRate);
+    }
+
+  //
+  // A-MPDU Status, information about the received or transmitted A-MPDU.
+  //
+  if (m_present & RADIOTAP_AMPDU_STATUS) // bit 20
+    {
+      start.WriteU8 (0, m_ampduStatusPad);
+      start.WriteU32 (m_ampduStatusRef);
+      start.WriteU16 (m_ampduStatusFlags);
+      start.WriteU8 (m_ampduStatusCRC);
+      start.WriteU8 (0);
+    }
+
+  //
+  // Information about the received or transmitted VHT frame.
+  //
+  if (m_present & RADIOTAP_VHT) // bit 21
+    {
+      start.WriteU8 (0, m_vhtPad);
+      start.WriteU16 (m_vhtKnown);
+      start.WriteU8 (m_vhtFlags);
+      start.WriteU8 (m_vhtBandwidth);
+      for (uint8_t i = 0; i < 4; i++)
+        {
+          start.WriteU8 (m_vhtMcsNss[i]);
+        }
+      start.WriteU8 (m_vhtCoding);
+      start.WriteU8 (m_vhtGroupId);
+      start.WriteU16 (m_vhtPartialAid);
+    }
 }
 
 uint32_t
@@ -176,9 +305,11 @@
   //
   if (m_present & RADIOTAP_CHANNEL) // bit 3
     {
+      m_channelPad = ((2 - bytesRead % 2) % 2);
+      start.Next (m_channelPad);
       m_channelFreq = start.ReadU16 ();
       m_channelFlags = start.ReadU16 ();
-      bytesRead += 4;
+      bytesRead += (4 + m_channelPad);
     }
 
   //
@@ -187,6 +318,7 @@
   //
   if (m_present & RADIOTAP_FHSS) // bit 4
     {
+      //not yet implemented
       start.ReadU8 ();
       ++bytesRead;
     }
@@ -202,7 +334,7 @@
     }
 
   //
-  // RF noise power at the antenna, decibel difference from an arbitrary, fixed 
+  // RF noise power at the antenna, decibel difference from an arbitrary, fixed
   // reference.
   //
   if (m_present & RADIOTAP_DBM_ANTNOISE) // bit 6
@@ -211,6 +343,135 @@
       ++bytesRead;
     }
 
+  //
+  // Quality of Barker code lock.
+  //
+  if (m_present & RADIOTAP_LOCK_QUALITY) // bit 7
+    {
+      //not yet implemented
+      start.ReadU16 ();
+      bytesRead += 2;
+    }
+
+  //
+  // Transmit power expressed as unitless distance from max power
+  // set at factory calibration (0 is max power).
+  //
+  if (m_present & RADIOTAP_TX_ATTENUATION) // bit 8
+    {
+      //not yet implemented
+      start.ReadU16 ();
+      bytesRead += 2;
+    }
+
+  //
+  // Transmit power expressed as decibel distance from max power
+  // set at factory calibration (0 is max power).
+  //
+  if (m_present & RADIOTAP_DB_TX_ATTENUATION) // bit 9
+    {
+      //not yet implemented
+      start.ReadU16 ();
+      bytesRead += 2;
+    }
+
+  //
+  // Transmit power expressed as dBm (decibels from a 1 milliwatt reference).
+  // This is the absolute power level measured at the antenna port.
+  //
+  if (m_present & RADIOTAP_DBM_TX_POWER) // bit 10
+    {
+      //not yet implemented
+      start.ReadU8 ();
+      ++bytesRead;
+    }
+
+  //
+  // Unitless indication of the Rx/Tx antenna for this packet.
+  // The first antenna is antenna 0.
+  //
+  if (m_present & RADIOTAP_ANTENNA) // bit 11
+    {
+      //not yet implemented
+      start.ReadU8 ();
+      ++bytesRead;
+    }
+
+  //
+  // RF signal power at the antenna (decibel difference from an arbitrary fixed reference).
+  //
+  if (m_present & RADIOTAP_DB_ANTSIGNAL) // bit 12
+    {
+      //not yet implemented
+      start.ReadU8 ();
+      ++bytesRead;
+    }
+
+  //
+  // RF noise power at the antenna (decibel difference from an arbitrary fixed reference).
+  //
+  if (m_present & RADIOTAP_DB_ANTNOISE) // bit 13
+    {
+      //not yet implemented
+      start.ReadU8 ();
+      ++bytesRead;
+    }
+
+  //
+  // Properties of received frames.
+  //
+  if (m_present & RADIOTAP_RX_FLAGS) // bit 14
+    {
+      //not yet implemented
+      start.ReadU16 ();
+      bytesRead += 2;
+    }
+
+  //
+  // MCS field.
+  //
+  if (m_present & RADIOTAP_MCS) // bit 19
+    {
+      m_mcsKnown = start.ReadU8 ();
+      m_mcsFlags = start.ReadU8 ();
+      m_mcsRate = start.ReadU8 ();
+      bytesRead += 3;
+    }
+
+  //
+  // A-MPDU Status, information about the received or transmitted A-MPDU.
+  //
+  if (m_present & RADIOTAP_AMPDU_STATUS) // bit 20
+    {
+      m_ampduStatusPad = ((4 - bytesRead % 4) % 4);
+      start.Next (m_ampduStatusPad);
+      m_ampduStatusRef = start.ReadU32 ();
+      m_ampduStatusFlags = start.ReadU16 ();
+      m_ampduStatusCRC = start.ReadU8 ();
+      start.ReadU8 ();
+      bytesRead += (8 + m_ampduStatusPad);
+    }
+
+  //
+  // Information about the received or transmitted VHT frame.
+  //
+  if (m_present & RADIOTAP_VHT) // bit 21
+    {
+      m_vhtPad = ((2 - bytesRead % 2) % 2);
+      start.Next (m_vhtPad);
+      m_vhtKnown = start.ReadU16 ();
+      m_vhtFlags = start.ReadU8 ();
+      m_vhtBandwidth = start.ReadU8 ();
+      for (uint8_t i = 0; i < 4; i++)
+        {
+          m_vhtMcsNss[i] = start.ReadU8 ();
+        }
+      m_vhtCoding = start.ReadU8 ();
+      m_vhtGroupId = start.ReadU8 ();
+      m_vhtPartialAid = start.ReadU16 ();
+      bytesRead += (12 + m_vhtPad);
+    }
+
   NS_ASSERT_MSG (m_length == bytesRead, "RadiotapHeader::Deserialize(): expected and actual lengths inconsistent");
   return bytesRead;
 }
@@ -225,7 +486,21 @@
      << " freq=" << m_channelFreq
      << " chflags=" << std::hex << (uint32_t)m_channelFlags << std::dec
      << " signal=" << (int16_t) m_antennaSignal
-     << " noise=" << (int16_t) m_antennaNoise;
+     << " noise=" << (int16_t) m_antennaNoise
+     << " mcsKnown=" << m_mcsKnown
+     << " mcsFlags=" << m_mcsFlags
+     << " mcsRate=" << m_mcsRate
+     << " ampduStatusFlags=" << (int16_t) m_ampduStatusFlags
+     << " vhtKnown=" << m_vhtKnown
+     << " vhtFlags=" << m_vhtFlags
+     << " vhtBandwidth=" << m_vhtBandwidth
+     << " vhtMcsNss for user 1=" << m_vhtMcsNss[0]
+     << " vhtMcsNss for user 2=" << m_vhtMcsNss[1]
+     << " vhtMcsNss for user 3=" << m_vhtMcsNss[2]
+     << " vhtMcsNss for user 4=" << m_vhtMcsNss[3]
+     << " vhtCoding=" << m_vhtCoding
+     << " vhtGroupId=" << m_vhtGroupId
+     << " vhtPartialAid=" << m_vhtPartialAid;
 }
 
 void
@@ -250,7 +525,7 @@
   return m_tsft;
 }
 
-void 
+void
 RadiotapHeader::SetFrameFlags (uint8_t flags)
 {
   NS_LOG_FUNCTION (this << static_cast<uint32_t> (flags));
@@ -272,7 +547,7 @@
   return m_flags;
 }
 
-void 
+void
 RadiotapHeader::SetRate (uint8_t rate)
 {
   NS_LOG_FUNCTION (this << static_cast<uint32_t> (rate));
@@ -294,7 +569,7 @@
   return m_rate;
 }
 
-void 
+void
 RadiotapHeader::SetChannelFrequencyAndFlags (uint16_t frequency, uint16_t flags)
 {
   NS_LOG_FUNCTION (this << frequency << flags);
@@ -303,28 +578,29 @@
 
   if (!(m_present & RADIOTAP_CHANNEL))
     {
+      m_channelPad = ((2 - m_length % 2) % 2);
       m_present |= RADIOTAP_CHANNEL;
-      m_length += 4;
+      m_length += (4 + m_channelPad);
     }
 
   NS_LOG_LOGIC (this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present << std::dec);
 }
 
-uint16_t 
+uint16_t
 RadiotapHeader::GetChannelFrequency (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_channelFreq;
 }
 
-uint16_t 
+uint16_t
 RadiotapHeader::GetChannelFlags (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_channelFlags;
 }
 
-void 
+void
 RadiotapHeader::SetAntennaSignalPower (double signal)
 {
   NS_LOG_FUNCTION (this << signal);
@@ -383,11 +659,173 @@
   NS_LOG_LOGIC (this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present << std::dec);
 }
 
-uint8_t 
+uint8_t
 RadiotapHeader::GetAntennaNoisePower (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_antennaNoise;
 }
 
+void
+RadiotapHeader::SetMcsFields (uint8_t known, uint8_t flags, uint8_t mcs)
+{
+  NS_LOG_FUNCTION (this << known << flags << mcs);
+  m_mcsKnown = known;
+  m_mcsFlags = flags;
+  m_mcsRate = mcs;
+  if (!(m_present & RADIOTAP_MCS))
+    {
+      m_present |= RADIOTAP_MCS;
+      m_length += 3;
+    }
+
+  NS_LOG_LOGIC (this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present << std::dec);
+}
+
+uint8_t
+RadiotapHeader::GetMcsKnown () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_mcsKnown;
+}
+
+uint8_t
+RadiotapHeader::GetMcsFlags () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_mcsFlags;
+}
+
+uint8_t
+RadiotapHeader::GetMcsRate () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_mcsRate;
+}
+
+void
+RadiotapHeader::SetAmpduStatus (uint32_t referenceNumber, uint16_t flags, uint8_t crc)
+{
+  NS_LOG_FUNCTION (this << referenceNumber << flags);
+  m_ampduStatusRef = referenceNumber;
+  m_ampduStatusFlags = flags;
+  m_ampduStatusCRC = crc;
+  if (!(m_present & RADIOTAP_AMPDU_STATUS))
+    {
+      m_ampduStatusPad = ((4 - m_length % 4) % 4);
+      m_present |= RADIOTAP_AMPDU_STATUS;
+      m_length += (8 + m_ampduStatusPad);
+    }
+
+  NS_LOG_LOGIC (this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present << std::dec);
+}
+
+uint32_t
+RadiotapHeader::GetAmpduStatusRef () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_ampduStatusRef;
+}
+
+uint16_t
+RadiotapHeader::GetAmpduStatusFlags () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_ampduStatusFlags;
+}
+
+void
+RadiotapHeader::SetVhtFields (uint16_t known, uint8_t flags, uint8_t bandwidth, uint8_t mcs_nss[4], uint8_t coding, uint8_t group_id, uint16_t partial_aid)
+{
+  NS_LOG_FUNCTION (this << known << flags << mcs_nss[0] << mcs_nss[1] << mcs_nss[2] << mcs_nss[3] << coding << group_id << partial_aid);
+  m_vhtKnown = known;
+  m_vhtFlags = flags;
+  m_vhtBandwidth = bandwidth;
+  for (uint8_t i = 0; i < 4; i++)
+    {
+      m_vhtMcsNss[i] = mcs_nss[i];
+    }
+  m_vhtCoding = coding;
+  m_vhtGroupId = group_id;
+  m_vhtPartialAid = partial_aid;
+  if (!(m_present & RADIOTAP_VHT))
+    {
+      m_vhtPad = ((2 - m_length % 2) % 2);
+      m_present |= RADIOTAP_VHT;
+      m_length += (12 + m_vhtPad);
+    }
+
+  NS_LOG_LOGIC (this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present << std::dec);
+}
+
+uint16_t
+RadiotapHeader::GetVhtKnown () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtKnown;
+}
+
+uint8_t
+RadiotapHeader::GetVhtFlags () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtFlags;
+}
+
+uint8_t
+RadiotapHeader::GetVhtBandwidth () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtBandwidth;
+}
+
+uint8_t
+RadiotapHeader::GetVhtMcsNssUser1 () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtMcsNss[0];
+}
+
+uint8_t
+RadiotapHeader::GetVhtMcsNssUser2 () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtMcsNss[1];
+}
+
+uint8_t
+RadiotapHeader::GetVhtMcsNssUser3 () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtMcsNss[2];
+}
+
+uint8_t
+RadiotapHeader::GetVhtMcsNssUser4 () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtMcsNss[3];
+}
+
+uint8_t
+RadiotapHeader::GetVhtCoding () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtCoding;
+}
+
+uint8_t
+RadiotapHeader::GetVhtGroupId () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtGroupId;
+}
+
+uint8_t
+RadiotapHeader::GetVhtPartialAid () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtPartialAid;
+}
+
 } // namespace ns3
diff -Naur ns-3.23/src/network/utils/radiotap-header.h ns-3.24/src/network/utils/radiotap-header.h
--- ns-3.23/src/network/utils/radiotap-header.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/radiotap-header.h	2015-09-15 11:18:44.000000000 -0700
@@ -3,7 +3,7 @@
  * 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 
+ * 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,
@@ -15,40 +15,30 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Include., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: Nicola Baldo <nbaldo@cttc.es>
+ * Authors: Nicola Baldo <nbaldo@cttc.es>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
 #ifndef RADIOTAP_HEADER_H
 #define RADIOTAP_HEADER_H
 
 
-#include <ns3/header.h> 
+#include <ns3/header.h>
 
 namespace ns3 {
 
 /**
  * @brief Radiotap header implementation
  *
- * Radiotap is a de facto standard for 802.11 frame injection and reception. 
- * The radiotap header format is a mechanism to supply additional information 
- * about frames, from the driver to userspace applications such as libpcap, and 
- * from a userspace application to the driver for transmission. 
- *
- * @warning the radiotap header specification says that the fields included in
- * the header should be aligned to their natural size (e.g., 16-bit fields
- * aligned to 16-bit boundaries, 32-bit fields aligned to 32-bit boundaries, 
- * and so on.  This implementation does not enforce this.  However, the radiotap
- * specification enforces an order in which fields have to appear (if they 
- * appear), and this ordering is such that, provided you don't leave gaps, all
- * fields will end up aligned without the need of inserting padding space.  By 
- * the term "gap" I mean not using a field which would appear between two used 
- * fields.  Moral: don't leave gaps, or if you do be careful about how you
- * do it.
+ * Radiotap is a de facto standard for 802.11 frame injection and reception.
+ * The radiotap header format is a mechanism to supply additional information
+ * about frames, from the driver to userspace applications such as libpcap, and
+ * from a userspace application to the driver for transmission.
  */
 class RadiotapHeader : public Header
 {
 public:
-  RadiotapHeader();
+  RadiotapHeader ();
   /**
    * \brief Get the type ID.
    * \return the object TypeId
@@ -58,7 +48,7 @@
 
   /**
    * This method is used by Packet::AddHeader to store the header into the byte
-   * buffer of a packet.  This method returns the number of bytes which are 
+   * buffer of a packet.  This method returns the number of bytes which are
    * needed to store the header data during a Serialize.
    *
    * @returns The expected size of the header.
@@ -67,7 +57,7 @@
 
   /**
    * This method is used by Packet::AddHeader to store the header into the byte
-   * buffer of a packet.  The data written is expected to match bit-for-bit the 
+   * buffer of a packet.  The data written is expected to match bit-for-bit the
    * representation of this header in a real network.
    *
    * @param start An iterator which points to where the header should
@@ -76,8 +66,8 @@
   virtual void Serialize (Buffer::Iterator start) const;
 
   /**
-   * This method is used by Packet::RemoveHeader to re-create a header from the 
-   * byte buffer of a packet.  The data read is expected to match bit-for-bit 
+   * This method is used by Packet::RemoveHeader to re-create a header from the
+   * byte buffer of a packet.  The data read is expected to match bit-for-bit
    * the representation of this header in real networks.
    *
    * @param start An iterator which points to where the header should
@@ -87,12 +77,12 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
   /**
-   * This method is used by Packet::Print to print the content of the header as 
-   * ascii data to a C++ output stream.  Although the header is free to format 
+   * This method is used by Packet::Print to print the content of the header as
+   * ascii data to a C++ output stream.  Although the header is free to format
    * its output as it wishes, it is recommended to follow a few rules to integrate
-   * with the packet pretty printer: start with flags, small field 
-   * values located between a pair of parens. Values should be separated 
-   * by whitespace. Follow the parens with the important fields, 
+   * with the packet pretty printer: start with flags, small field
+   * values located between a pair of parens. Values should be separated
+   * by whitespace. Follow the parens with the important fields,
    * separated by whitespace.
    *
    * eg: (field1 val1 field2 val2 field3 val3) field4 val4 field5 val5
@@ -103,9 +93,9 @@
 
   /**
    * @brief Set the Time Synchronization Function Timer (TSFT) value.  Valid for
-   * received frames only. 
+   * received frames only.
    *
-   * @param tsft Value in microseconds of the MAC's 64-bit 802.11 Time 
+   * @param tsft Value in microseconds of the MAC's 64-bit 802.11 Time
    *             Synchronization Function timer when the first bit of the MPDU
    *             arrived at the MAC.
    */
@@ -113,15 +103,16 @@
 
   /**
    * @brief Get the Time Synchronization Function Timer (TSFT) value.  Valid for
-   * received frames only. 
+   * received frames only.
    *
-   * @returns The value in microseconds of the MAC's 64-bit 802.11 Time 
+   * @returns The value in microseconds of the MAC's 64-bit 802.11 Time
    *          Synchronization Function timer when the first bit of the MPDU
    *          arrived at the MAC.
    */
   uint64_t GetTsft (void) const;
 
-  enum {
+  enum
+  {
     FRAME_FLAG_NONE           = 0x00, /**< No flags set */
     FRAME_FLAG_CFP            = 0x01, /**< Frame sent/received during CFP */
     FRAME_FLAG_SHORT_PREAMBLE = 0x02, /**< Frame sent/received with short preamble */
@@ -158,7 +149,8 @@
    */
   uint8_t GetRate (void) const;
 
-  enum {
+  enum
+  {
     CHANNEL_FLAG_NONE          = 0x0000, /**< No flags set */
     CHANNEL_FLAG_TURBO         = 0x0010, /**< Turbo Channel */
     CHANNEL_FLAG_CCK           = 0x0020, /**< CCK channel */
@@ -193,7 +185,7 @@
 
   /**
    * @brief Set the RF signal power at the antenna as a decibel difference
-   * from an arbitrary, fixed reference. 
+   * from an arbitrary, fixed reference.
    *
    * @param signal The RF signal power at the antenna as a decibel difference
    *               from an arbitrary, fixed reference;
@@ -202,33 +194,224 @@
 
   /**
    * @brief Get the RF signal power at the antenna as a decibel difference
-   * from an arbitrary, fixed reference. 
+   * from an arbitrary, fixed reference.
    *
    * @returns The RF signal power at the antenna as a decibel difference
-   *          from an arbitrary, fixed reference. 
+   *          from an arbitrary, fixed reference.
    */
   uint8_t GetAntennaSignalPower (void) const;
 
   /**
    * @brief Set the RF noise power at the antenna as a decibel difference
-   * from an arbitrary, fixed reference. 
+   * from an arbitrary, fixed reference.
    *
    * @param noise The RF noise power at the antenna as a decibel difference
-   *              from an arbitrary, fixed reference. 
+   *              from an arbitrary, fixed reference.
    */
   void SetAntennaNoisePower (double noise);
 
   /**
    * @brief Get the RF noise power at the antenna as a decibel difference
-   * from an arbitrary, fixed reference. 
+   * from an arbitrary, fixed reference.
    *
    * @returns The RF noise power at the antenna as a decibel difference
-   *          from an arbitrary, fixed reference. 
+   *          from an arbitrary, fixed reference.
    */
   uint8_t GetAntennaNoisePower (void) const;
 
+  enum
+  {
+    MCS_KNOWN_NONE           = 0x00, /**< No flags set */
+    MCS_KNOWN_BANDWIDTH      = 0x01, /**< Bandwidth */
+    MCS_KNOWN_INDEX          = 0x02, /**< MCS index known */
+    MCS_KNOWN_GUARD_INTERVAL = 0x04, /**< Guard interval */
+    MCS_KNOWN_HT_FORMAT      = 0x08, /**< HT format */
+    MCS_KNOWN_FEC_TYPE       = 0x10, /**< FEC type */
+    MCS_KNOWN_STBC           = 0x20, /**< STBC known */
+    MCS_KNOWN_NESS           = 0x40, /**< Ness known (Number of extension spatial streams) */
+    MCS_KNOWN_NESS_BIT_1     = 0x80, /**< Ness data - bit 1 (MSB) of Number of extension spatial streams */
+  };
+
+  enum
+  {
+    MCS_FLAGS_NONE           = 0x00, /**< Default: 20 MHz, long guard interval, mixed HT format and BCC FEC type */
+    MCS_FLAGS_BANDWIDTH_40   = 0x01, /**< 40 MHz */
+    MCS_FLAGS_BANDWIDTH_20L  = 0x02, /**< 20L (20 MHz in lower half of 40 MHz channel) */
+    MCS_FLAGS_BANDWIDTH_20U  = 0x03, /**< 20U (20 MHz in upper half of 40 MHz channel) */
+    MCS_FLAGS_GUARD_INTERVAL = 0x04, /**< Short guard interval */
+    MCS_FLAGS_HT_GREENFIELD  = 0x08, /**< Greenfield HT format */
+    MCS_FLAGS_FEC_TYPE       = 0x10, /**< LDPC FEC type */
+    MCS_FLAGS_STBC_STREAMS   = 0x60, /**< STBC enabled */
+    MCS_FLAGS_NESS_BIT_0     = 0x80, /**< Ness - bit 0 (LSB) of Number of extension spatial streams */
+  };
+
+  /**
+   * @brief Set the MCS fields
+   *
+   * @param known The kwown flags.
+   * @param flags The flags to set.
+   * @param mcs The MCS index value.
+   */
+  void SetMcsFields (uint8_t known, uint8_t flags, uint8_t mcs);
+
+  /**
+   * @brief Get the MCS known bitmap.
+   *
+   * @returns The MCS known bitmap.
+   */
+  uint8_t GetMcsKnown (void) const;
+  /**
+   * @brief Get the MCS flags.
+   *
+   * @returns The MCS flags.
+   */
+  uint8_t GetMcsFlags (void) const;
+  /**
+   * @brief Get the MCS index value.
+   *
+   * @returns The MCS index value.
+   */
+  uint8_t GetMcsRate (void) const;
+
+  enum
+  {
+    A_MPDU_STATUS_NONE                = 0x00, /**< No flags set */
+    A_MPDU_STATUS_REPORT_ZERO_LENGTH  = 0x01, /**< Driver reports 0-length subframes */
+    A_MPDU_STATUS_IS_ZERO_LENGTH      = 0x02, /**< Frame is 0-length subframe (valid only if 0x0001 is set) */
+    A_MPDU_STATUS_LAST_KNOWN          = 0x04, /**< Last subframe is known (should be set for all subframes in an A-MPDU) */
+    A_MPDU_STATUS_LAST                = 0x08, /**< This frame is the last subframe */
+    A_MPDU_STATUS_DELIMITER_CRC_ERROR = 0x10, /**< Delimiter CRC error */
+    A_MPDU_STATUS_DELIMITER_CRC_KNOWN = 0x20  /**< Delimiter CRC value known: the delimiter CRC value field is valid */
+  };
+
+  /**
+   * @brief Set the A-MPDU status fields
+   *
+   * @param referenceNumber The A-MPDU reference number to identify all subframes belonging to the same A-MPDU.
+   * @param flags The flags to set.
+   * @param crc The CRC value value.
+   */
+  void SetAmpduStatus (uint32_t referenceNumber, uint16_t flags, uint8_t crc);
+
+  /**
+   * @brief Get the A-MPDU reference number.
+   *
+   * @returns The A-MPDU reference number.
+   */
+  uint32_t GetAmpduStatusRef (void) const;
+  /**
+   * @brief Get the A-MPDU status flags.
+   *
+   * @returns The A-MPDU status flags.
+   */
+  uint16_t GetAmpduStatusFlags (void) const;
+
+  enum
+  {
+    VHT_KNOWN_NONE                         = 0x0000, /**< No flags set */
+    VHT_KNOWN_STBC                         = 0x0001, /**< Space-time block coding (1 if all spatial streams of all users have STBC, 0 otherwise). */
+    VHT_KNOWN_TXOP_PS_NOT_ALLOWED          = 0x0002, /**< TXOP_PS_NOT_ALLOWED known */
+    VHT_KNOWN_GUARD_INTERVAL               = 0x0004, /**< Guard interval */
+    VHT_KNOWN_SHORT_GI_NSYM_DISAMBIGUATION = 0x0008, /**< Short GI NSYM disambiguation known */
+    VHT_KNOWN_LDPC_EXTRA_OFDM_SYMBOL       = 0x0010, /**< LDPC extra OFDM symbol known */
+    VHT_KNOWN_BEAMFORMED                   = 0x0020, /**< Beamformed known/applicable (this flag should be set to zero for MU PPDUs). */
+    VHT_KNOWN_BANDWIDTH                    = 0x0040, /**< Bandwidth known */
+    VHT_KNOWN_GROUP_ID                     = 0x0080, /**< Group ID known */
+    VHT_KNOWN_PARTIAL_AID                  = 0x0100, /**< Partial AID known/applicable */
+  };
+
+  enum
+  {
+    VHT_FLAGS_NONE                         = 0x00, /**< No flags set */
+    VHT_FLAGS_STBC                         = 0x01, /**< Set if all spatial streams of all users have space-time block coding */
+    VHT_FLAGS_TXOP_PS_NOT_ALLOWED          = 0x02, /**< Set if STAs may not doze during TXOP (valid only for AP transmitters). */
+    VHT_FLAGS_GUARD_INTERVAL               = 0x04, /**< Short guard interval */
+    VHT_FLAGS_SHORT_GI_NSYM_DISAMBIGUATION = 0x08, /**< Set if NSYM mod 10 = 9 (valid only if short GI is used).*/
+    VHT_FLAGS__LDPC_EXTRA_OFDM_SYMBOL      = 0x10, /**< Set if one or more users are using LDPC and the encoding process resulted in extra OFDM symbol(s) */
+    VHT_FLAGS_BEAMFORMED                   = 0x20, /**< Set if beamforming is used (valid for SU PPDUs only). */
+  };
+
+  /**
+   * @brief Set the VHT fields
+   *
+   * @param known The kwown flags.
+   * @param flags The flags to set.
+   * @param bandwidth The bandwidth value.
+   * @param mcs_nss The mcs_nss value.
+   * @param coding The coding value.
+   * @param group_id The group_id value.
+   * @param partial_aid The partial_aid value.
+   */
+  void SetVhtFields (uint16_t known, uint8_t flags,
+                     uint8_t bandwidth, uint8_t mcs_nss [4],
+                     uint8_t coding, uint8_t group_id,
+                     uint16_t partial_aid);
+
+  /**
+   * @brief Get the VHT known bitmap.
+   *
+   * @returns The MCS known bitmap.
+   */
+  uint16_t GetVhtKnown (void) const;
+  /**
+   * @brief Get the VHT flags.
+   *
+   * @returns The VHT flags.
+   */
+  uint8_t GetVhtFlags (void) const;
+  /**
+   * @brief Get the VHT bandwidth field value.
+   *
+   * @returns The VHT bandwidth field value.
+   */
+  uint8_t GetVhtBandwidth (void) const;
+  /**
+   * @brief Get the VHT mcs_nss field value for user 1.
+   *
+   * @returns The VHT mcs_nss field value for user 1.
+   */
+  uint8_t GetVhtMcsNssUser1 () const;
+  /**
+   * @brief Get the VHT mcs_nss field value for user 2.
+   *
+   * @returns The VHT mcs_nss field value for user 2.
+   */
+  uint8_t GetVhtMcsNssUser2 () const;
+  /**
+   * @brief Get the VHT mcs_nss field value for user 3.
+   *
+   * @returns The VHT mcs_nss field value for user 3.
+   */
+  uint8_t GetVhtMcsNssUser3 () const;
+  /**
+   * @brief Get the VHT mcs_nss field value for user 4.
+   *
+   * @returns The VHT mcs_nss field value for user 4.
+   */
+  uint8_t GetVhtMcsNssUser4 () const;
+  /**
+   * @brief Get the VHT coding field value.
+   *
+   * @returns The VHT coding field value.
+   */
+  uint8_t GetVhtCoding (void) const;
+  /**
+   * @brief Get the VHT group_id field value.
+   *
+   * @returns The VHT group_id field value.
+   */
+  uint8_t GetVhtGroupId (void) const;
+  /**
+   * @brief Get the VHT partial_aid field value.
+   *
+   * @returns The VHT partial_aid field value.
+   */
+  uint8_t GetVhtPartialAid (void) const;
+
+
 private:
-  enum {
+  enum
+  {
     RADIOTAP_TSFT              = 0x00000001,
     RADIOTAP_FLAGS             = 0x00000002,
     RADIOTAP_RATE              = 0x00000004,
@@ -239,23 +422,46 @@
     RADIOTAP_LOCK_QUALITY      = 0x00000080,
     RADIOTAP_TX_ATTENUATION    = 0x00000100,
     RADIOTAP_DB_TX_ATTENUATION = 0x00000200,
-    RADIOTAP_DBM_TX_POWER      = 0x00000200,
-    RADIOTAP_ANTENNA           = 0x00000400,
-    RADIOTAP_DB_ANTSIGNAL      = 0x00000800,
-    RADIOTAP_DB_ANTNOISE       = 0x00001000,
+    RADIOTAP_DBM_TX_POWER      = 0x00000400,
+    RADIOTAP_ANTENNA           = 0x00000800,
+    RADIOTAP_DB_ANTSIGNAL      = 0x00001000,
+    RADIOTAP_DB_ANTNOISE       = 0x00002000,
+    RADIOTAP_RX_FLAGS          = 0x00004000,
+    RADIOTAP_MCS               = 0x00080000,
+    RADIOTAP_AMPDU_STATUS      = 0x00100000,
+    RADIOTAP_VHT               = 0x00200000,
     RADIOTAP_EXT               = 0x10000000
   };
- 
+
   uint16_t m_length;        //!< entire length of radiotap data + header
   uint32_t m_present;       //!< bits describing which fields follow header
 
   uint64_t m_tsft;          //!< Time Synchronization Function Timer (when the first bit of the MPDU arrived at the MAC)
   uint8_t m_flags;          //!< Properties of transmitted and received frames.
   uint8_t m_rate;           //!< TX/RX data rate in units of 500 kbps
+  uint8_t m_channelPad;     //!< Tx/Rx channel padding.
   uint16_t m_channelFreq;   //!< Tx/Rx frequency in MHz.
   uint16_t m_channelFlags;  //!< Tx/Rx channel flags.
   int8_t m_antennaSignal;   //!< RF signal power at the antenna, dB difference from an arbitrary, fixed reference.
   int8_t m_antennaNoise;    //!< RF noise power at the antenna, dB difference from an arbitrary, fixed reference.
+
+  uint8_t m_mcsKnown; //!< MCS Flags, known information field.
+  uint8_t m_mcsFlags; //!< MCS Flags, flags field.
+  uint8_t m_mcsRate;  //!< MCS Flags, mcs rate index.
+
+  uint8_t m_ampduStatusPad;       //!< A-MPDU Status Flags, padding before A-MPDU Status Field.
+  uint32_t m_ampduStatusRef;      //!< A-MPDU Status Flags, reference number.
+  uint16_t m_ampduStatusFlags;    //!< A-MPDU Status Flags, information about the received A-MPDU.
+  uint8_t m_ampduStatusCRC;       //!< A-MPDU Status Flags, delimiter CRC value.
+
+  uint8_t m_vhtPad;         //!< VHT padding.
+  uint16_t m_vhtKnown;      //!< VHT known field.
+  uint8_t m_vhtFlags;       //!< VHT flags field.
+  uint8_t m_vhtBandwidth;   //!< VHT bandwidth field.
+  uint8_t m_vhtMcsNss[4];   //!< VHT mcs_nss field.
+  uint8_t m_vhtCoding;      //!< VHT coding field.
+  uint8_t m_vhtGroupId;     //!< VHT group_id field.
+  uint16_t m_vhtPartialAid; //!< VHT partial_aid field.
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/network/utils/sequence-number.h ns-3.24/src/network/utils/sequence-number.h
--- ns-3.23/src/network/utils/sequence-number.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/sequence-number.h	2015-09-15 11:18:44.000000000 -0700
@@ -482,6 +482,8 @@
  */
 typedef SequenceNumber<uint8_t, int8_t> SequenceNumber8;
 
+namespace TracedValueCallback {
+
 /**
  * \ingroup network
  * TracedValue callback signature for SequenceNumber32
@@ -489,8 +491,10 @@
  * \param [in] oldValue original value of the traced variable
  * \param [in] newValue new value of the traced variable
  */
-typedef void (* SequenceNumber32TracedValueCallback)(const SequenceNumber32 oldValue,
-                                                     const SequenceNumber32 newValue);
+typedef void (* SequenceNumber32)(SequenceNumber32 oldValue,
+                                  SequenceNumber32 newValue);
+
+}  // namespace TracedValueCallback
 
 } // namespace ns3
 
diff -Naur ns-3.23/src/network/utils/sgi-hashmap.h ns-3.24/src/network/utils/sgi-hashmap.h
--- ns-3.23/src/network/utils/sgi-hashmap.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/sgi-hashmap.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 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;
+ *
+ * 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>
+ */
+
 /* This code snippet was ripped out of the gcc 
  * documentation and slightly modified to work
  * with gcc 4.x
diff -Naur ns-3.23/src/network/utils/simple-channel.cc ns-3.24/src/network/utils/simple-channel.cc
--- ns-3.23/src/network/utils/simple-channel.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/simple-channel.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+#include <algorithm>
 #include "simple-channel.h"
 #include "simple-net-device.h"
 #include "ns3/simulator.h"
@@ -63,6 +64,14 @@
         {
           continue;
         }
+      if (m_blackListedDevices.find (tmp) != m_blackListedDevices.end ())
+        {
+          if (find (m_blackListedDevices[tmp].begin (), m_blackListedDevices[tmp].end (), sender) !=
+              m_blackListedDevices[tmp].end () )
+            {
+              continue;
+            }
+        }
       Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), m_delay,
                                       &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
     }
@@ -81,6 +90,7 @@
   NS_LOG_FUNCTION (this);
   return m_devices.size ();
 }
+
 Ptr<NetDevice>
 SimpleChannel::GetDevice (uint32_t i) const
 {
@@ -88,4 +98,36 @@
   return m_devices[i];
 }
 
+void
+SimpleChannel::BlackList (Ptr<SimpleNetDevice> from, Ptr<SimpleNetDevice> to)
+{
+  if (m_blackListedDevices.find (to) != m_blackListedDevices.end ())
+    {
+      if (find (m_blackListedDevices[to].begin (), m_blackListedDevices[to].end (), from) ==
+          m_blackListedDevices[to].end () )
+        {
+          m_blackListedDevices[to].push_back (from);
+        }
+    }
+  else
+    {
+      m_blackListedDevices[to].push_back (from);
+    }
+}
+
+void
+SimpleChannel::UnBlackList (Ptr<SimpleNetDevice> from, Ptr<SimpleNetDevice> to)
+{
+  if (m_blackListedDevices.find (to) != m_blackListedDevices.end ())
+    {
+      std::vector<Ptr<SimpleNetDevice> >::iterator iter;
+      iter = find (m_blackListedDevices[to].begin (), m_blackListedDevices[to].end (), from);
+      if (iter != m_blackListedDevices[to].end () )
+        {
+          m_blackListedDevices[to].erase (iter);
+        }
+    }
+}
+
+
 } // namespace ns3
diff -Naur ns-3.23/src/network/utils/simple-channel.h ns-3.24/src/network/utils/simple-channel.h
--- ns-3.23/src/network/utils/simple-channel.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/simple-channel.h	2015-09-15 11:18:44.000000000 -0700
@@ -24,6 +24,7 @@
 #include "ns3/nstime.h"
 #include "mac48-address.h"
 #include <vector>
+#include <map>
 
 namespace ns3 {
 
@@ -74,6 +75,24 @@
    */ 
   virtual void Add (Ptr<SimpleNetDevice> device);
 
+  /**
+   * Blocks the communications from a NetDevice to another NetDevice.
+   * The block is unidirectional
+   *
+   * \param from the device to BlackList
+   * \param to the device wanting to block the other one
+   */
+  virtual void BlackList (Ptr<SimpleNetDevice> from, Ptr<SimpleNetDevice> to);
+
+  /**
+   * Un-Blocks the communications from a NetDevice to another NetDevice.
+   * The block is unidirectional
+   *
+   * \param from the device to BlackList
+   * \param to the device wanting to block the other one
+   */
+  virtual void UnBlackList (Ptr<SimpleNetDevice> from, Ptr<SimpleNetDevice> to);
+
   // inherited from ns3::Channel
   virtual uint32_t GetNDevices (void) const;
   virtual Ptr<NetDevice> GetDevice (uint32_t i) const;
@@ -81,6 +100,7 @@
 private:
   Time m_delay; //!< The assigned speed-of-light delay of the channel
   std::vector<Ptr<SimpleNetDevice> > m_devices; //!< devices connected by the channel
+  std::map<Ptr<SimpleNetDevice>, std::vector<Ptr<SimpleNetDevice> > > m_blackListedDevices; //!< devices blocked on a device
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/network/utils/simple-net-device.cc ns-3.24/src/network/utils/simple-net-device.cc
--- ns-3.23/src/network/utils/simple-net-device.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/network/utils/simple-net-device.cc	2015-09-15 11:18:44.000000000 -0700
@@ -446,7 +446,7 @@
 
   if (m_queue->Enqueue (p))
     {
-      if (m_queue->GetNPackets () == 1)
+      if (m_queue->GetNPackets () == 1 && !TransmitCompleteEvent.IsRunning ())
         {
           p = m_queue->Dequeue ();
           p->RemovePacketTag (tag);
diff -Naur ns-3.23/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py ns-3.24/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -299,6 +299,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -334,6 +340,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -572,17 +585,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -604,11 +617,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -618,16 +626,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -865,14 +863,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -933,11 +935,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -2152,7 +2149,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2244,10 +2241,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4059,11 +4056,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5749,6 +5756,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5761,6 +5769,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py ns-3.24/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -299,6 +299,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -334,6 +340,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -572,17 +585,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -604,11 +617,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -618,16 +626,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -865,14 +863,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -933,11 +935,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -2152,7 +2149,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2244,10 +2241,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4059,11 +4056,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5749,6 +5756,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5761,6 +5769,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/olsr/bindings/modulegen__gcc_ILP32.py ns-3.24/src/olsr/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/olsr/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -104,8 +104,14 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
+    ## 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]
@@ -302,6 +308,10 @@
     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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -349,6 +359,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace olsr
     
     nested_module = module.add_cpp_namespace('olsr')
@@ -389,6 +405,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_olsr(module):
     root_module = module.get_root()
     
@@ -514,7 +537,9 @@
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     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'])
@@ -601,6 +626,8 @@
     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_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'])
@@ -761,17 +788,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -793,11 +820,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -807,16 +829,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1054,14 +1066,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1122,11 +1138,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventGarbageCollector_methods(root_module, cls):
@@ -1895,6 +1906,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NodeContainer_methods(root_module, cls):
     ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NodeContainer const &', 'arg0')])
@@ -1959,6 +2042,12 @@
                    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([])
@@ -2281,7 +2370,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2373,10 +2462,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4563,11 +4652,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4677,10 +4776,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5495,6 +5594,46 @@
                    is_virtual=True)
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -7201,6 +7340,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_olsr(module.get_submodule('olsr'), root_module)
     return
 
@@ -7214,6 +7354,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_olsr(module, root_module):
     ## olsr-header.h (module 'olsr'): extern double ns3::olsr::EmfToSeconds(uint8_t emf) [free function]
     module.add_function('EmfToSeconds', 
diff -Naur ns-3.23/src/olsr/bindings/modulegen__gcc_LP64.py ns-3.24/src/olsr/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/olsr/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -104,8 +104,14 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
+    ## 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]
@@ -302,6 +308,10 @@
     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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -349,6 +359,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace olsr
     
     nested_module = module.add_cpp_namespace('olsr')
@@ -389,6 +405,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_olsr(module):
     root_module = module.get_root()
     
@@ -514,7 +537,9 @@
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     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'])
@@ -601,6 +626,8 @@
     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_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'])
@@ -761,17 +788,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -793,11 +820,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -807,16 +829,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1054,14 +1066,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1122,11 +1138,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventGarbageCollector_methods(root_module, cls):
@@ -1895,6 +1906,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NodeContainer_methods(root_module, cls):
     ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NodeContainer const &', 'arg0')])
@@ -1959,6 +2042,12 @@
                    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([])
@@ -2281,7 +2370,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2373,10 +2462,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4563,11 +4652,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4677,10 +4776,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5495,6 +5594,46 @@
                    is_virtual=True)
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -7201,6 +7340,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_olsr(module.get_submodule('olsr'), root_module)
     return
 
@@ -7214,6 +7354,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_olsr(module, root_module):
     ## olsr-header.h (module 'olsr'): extern double ns3::olsr::EmfToSeconds(uint8_t emf) [free function]
     module.add_function('EmfToSeconds', 
diff -Naur ns-3.23/src/olsr/model/olsr-routing-protocol.h ns-3.24/src/olsr/model/olsr-routing-protocol.h
--- ns-3.23/src/olsr/model/olsr-routing-protocol.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/model/olsr-routing-protocol.h	2015-09-15 11:18:44.000000000 -0700
@@ -126,7 +126,7 @@
    *
    * \param [in] size Final routing table size.
    */
-  typedef void (* TableChangeTracedCallback) (const uint32_t size);
+  typedef void (* TableChangeTracedCallback) (uint32_t size);
 
 private:
   std::set<uint32_t> m_interfaceExclusions;
diff -Naur ns-3.23/src/olsr/test/bug780-0-0.pcap ns-3.24/src/olsr/test/bug780-0-0.pcap
--- ns-3.23/src/olsr/test/bug780-0-0.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/bug780-0-0.pcap	1969-12-31 16:00:00.000000000 -0800
@@ -1,2301 +0,0 @@
-ò            i        T   T                     E  0    @  
-
-       
-             eW T   T                     E  0    @  
-
-       
-             d   d                    E  @   @  
-
- ,   $   
-      
-  
-       6 \   \                    E  8   @  
-
- $     
-      
-       B d   d                     E  @   @  
-
- ,   $   
-      
-  
-        \   \                     E  8   @  
-
- $     
-      
-       :  \   \               0     E  8   @  
-
- $     
-    
-  
-        d   d               0     E  @   @  
-
- ,   $   
-      
-  
-       ) \   \               @     E  8   @  
-
- $     
-    
-  
-       F d   d               @     E  @   @  
-
- ,   $   
-      
-  
-    
-   7  \   \               P     E  8   @  
-
- $     
-    
-  
-    
-   B9 |   |               P     E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-       r \   \               `     E  8   @  
-
- $     
-    
-  
-        d   d               `     E  @   @  
-
- ,   $   
-      
-  
-       < \   \               p     E  8   @  
-
- $     
-    
-  
-       8c d   d               p     E  @   @  
-
- ,   $   
-      
-  
-        \   \                    E  8   @  
-
- $     
-  	   
-
-        d   d                    E  @ 	  @  
-
- ,   $ 	  
-  
-    
-  
-       $ \   \                    E  8   @  
-
- $     
-    
-  
-       ? \   \                    E  8 	  @  
-
- $    	 
-  	  
-  
-       2 d   d                    E  @ 
-  @  
-
- ,   $ 
-  
-      
-  
-       t^ \   \                    E  8 
-  @  
-
- $    
- 
-  
-  
-  
-        |   |                    E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-        \   \                    E  8   @  
-
- $     
-    
-  
-       O d   d                    E  @   @  
-
- ,   $   
-      
-  
-       p  d   d                    E  @   @  
-
- ,   $   
-      
-  
-       O \   \                    E  8   @  
-
- $     
-    
-  
-       qI \   \                    E  8   @  
-
- $     
-     
-
-        d   d                    E  @   @  
-
- ,   $   
-      
-  
-       : \   \                    E  8   @  
-
- $     
-    
-  
-       L \   \                    E  8   @  
-
- $     
-    
-  
-       S d   d                    E  @   @  
-
- ,   $   
-      
-  
-       r? \   \                    E  8   @  
-
- $     
-    
-  
-       W |   |                   E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-        Qk d   d                    E  @   @  
-
- ,   $   
-      
-  
-         \   \                    E  8   @  
-
- $     
-    
-  
-    "   #  d   d               0    E  @   @  
-
- ,   $   
-      
-  
-    "   ; \   \                   E  8   @  
-
- $     
-    
-  
-    #   * \   \               @    E  8   @  
-
- $     
-     
-
-    $   eq d   d               P    E  @   @  
-
- ,   $   
-      
-  
-    $   R \   \                    E  8   @  
-
- $     
-    
-  
-    &     d   d               `    E  @   @  
-
- ,   $   
-      
-  
-    &   / \   \               0    E  8   @  
-
- $     
-    
-  
-    (   {  \   \               @    E  8   @  
-
- $     
-    
-  
-    (   ˆ |   |               p    E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-    *    d   d                   E  @   @  
-
- ,   $   
-      
-  
-    *    \   \               P    E  8   @  
-
- $     
-    
-  
-    ,   b d   d                   E  @   @  
-
- ,   $   
-      
-  
-    ,   $ \   \               `    E  8   @  
-
- $     
-    
-  
-    -    \   \                   E  8   @  
-
- $     
-     
-
-    .   D  d   d                   E  @   @  
-
- ,   $   
-      
-  
-    .   G \   \               p    E  8   @  
-
- $     
-    
-  
-    0   s d   d                   E  @   @  
-
- ,   $   
-       
-  
-    0   fr \   \                   E  8   @  
-
- $     
-    
-  
-    2     @   @                          
-
-    2   k  @   @   :                          
-     
-    2   u        Ԁ           2   C  x   x   :                   E  T    @  
-
-                                                                   2           Ԁ           2   0  @   @                          
-
-    2   ?0  @   @   :                          
-     
-    2   :4        Ԁ           2   :  x   x   :                   E  T    @  
-
-                                                                    2   :        Ԁ           2   B |   |                    E  X   @  
-
- D   <  
-  !   
-
-  
-  "    
-  
-    2   ڿ \   \                   E  8   @  
-
- $     
-    
-  
-    3       x   x   :                   E  T   @  
-
-                                                                  3           Ԁ           3   m
-  x   x   :                   E  T   @  
-
-                                                                   3   w
-        Ԁ           4       x   x   :                   E  T   @  
-
-                                                                  4           Ԁ           4   m
-  x   x   :                    E  T   @  
-
-                                                                   4   w
-        Ԁ           4   ^9 \   \                   E  8   @  
-
- $     
-    
-  
-    4   8 d   d               0    E  @   @  
-
- ,   $   
-  #    
-  
-    5       x   x   :                    E  T   @  
-
-                                                                  5           Ԁ           5   m
-  x   x   :               @    E  T   @  
-
-                                                                   5   w
-        Ԁ           6       x   x   :                   E  T   @  
-
-                                                                  6           Ԁ           6   m
-  x   x   :               P    E  T   @  
-
-                                                                   6   w
-        Ԁ           6   Z \   \                    E  8   @  
-
- $     
-    
-  
-    6   M7 d   d               `    E  @   @  
-
- ,   $   
-  $    
-  
-    7       x   x   :               0    E  T   @  
-
-                                                                  7           Ԁ           7   m
-  x   x   :               p    E  T   @  
-
-                                                                   7   w
-        Ԁ           7    \   \                   E  8    @  
-
- $      
-  %   
-
-    8       x   x   :               @    E  T   @  
-
-                                                                  8           Ԁ           8   m
-  x   x   :                   E  T   @  
-
-                                                                   8   w
-        Ԁ           8    d   d                   E  @ !  @  
-
- ,   $ !  
-  &    
-  
-    8   = \   \               P    E  8   @  
-
- $     
-    
-  
-    9       x   x   :               `    E  T   @  
-
-                                                                  9           Ԁ           9   m
-  x   x   :                   E  T   @  
-
-                                                                   9   w
-        Ԁ           :       x   x   :               p    E  T   @  
-
-                                                                  :           Ԁ           :   m
-  x   x   :                   E  T   @  
-
-                                                                   :   w
-        Ԁ           :   x[ d   d                   E  @ "  @  
-
- ,   $ "  
-  '    
-  
-    :   / \   \                   E  8   @  
-
- $     
-    
-  
-    ;       x   x   :                   E  T 	  @  
-
-      	                                                            ;           Ԁ           ;   m
-  x   x   :                   E  T 	  @  
-
-       	                                                            ;   w
-        Ԁ           <       x   x   :                   E  T 
-  @  
-
-      
-                                                            <           Ԁ           <   m
-  x   x   :                   E  T 
-  @  
-
-       
-                                                            <   w
-        Ԁ           <   Ɖ |   |                    E  X #  @  
-
- D   < # 
-  (   
-
-  
-  )    
-  
-    <   # \   \                   E  8   @  
-
- $     
-    
-  
-    =       x   x   :                   E  T   @  
-
-                                                                  =           Ԁ           =   m
-  x   x   :                   E  T   @  
-
-                                                                   =   w
-        Ԁ           >       x   x   :                   E  T   @  
-
-                                                                  >           Ԁ           >   m
-  x   x   :                    E  T   @  
-
-                                                                   >   w
-        Ԁ           >   r d   d               0    E  @ $  @  
-
- ,   $ $  
-  *    
-  
-    >   E] \   \                   E  8   @  
-
- $     
-    
-  
-    ?       x   x   :                   E  T   @  
-
-                                                                  ?           Ԁ           ?   m
-  x   x   :               @    E  T   @  
-
-                                                                   ?   w
-        Ԁ           @       x   x   :                    E  T   @  
-
-                                                                  @           Ԁ           @   m
-  x   x   :               P    E  T   @  
-
-                                                                   @   w
-        Ԁ           @   Y d   d               `    E  @ %  @  
-
- ,   $ %  
-  +    
-  
-    @    \   \                   E  8    @  
-
- $      
-     
-  
-    A       x   x   :                    E  T   @  
-
-                                                                  A           Ԁ           A   m
-  x   x   :               p    E  T   @  
-
-                                                                   A   w
-        Ԁ           A   b \   \                   E  8 &  @  
-
- $    & 
-  ,   
-
-    B       x   x   :               0    E  T   @  
-
-                                                                  B           Ԁ           B   m
-  x   x   :                   E  T   @  
-
-                                                                   B   w
-        Ԁ           B   &| \   \               @    E  8 !  @  
-
- $    ! 
-  !  
-  
-    B    d   d                   E  @ '  @  
-
- ,   $ '  
-  -    
-  
-    C       x   x   :               P    E  T   @  
-
-                                                                  C           Ԁ           C   m
-  x   x   :                   E  T   @  
-
-                                                                   C   w
-        Ԁ           D       x   x   :               `    E  T   @  
-
-                                                                  D           Ԁ           D   m
-  x   x   :                   E  T   @  
-
-                                                                   D   w
-        Ԁ           D   q d   d                   E  @ (  @  
-
- ,   $ (  
-  .    
-  
-    D    \   \               p    E  8 "  @  
-
- $    " 
-  "  
-  
-    E       x   x   :                   E  T   @  
-
-                                                                  E           Ԁ           E   m
-  x   x   :                   E  T   @  
-
-                                                                   E   w
-        Ԁ           F       x   x   :                   E  T   @  
-
-                                                                  F           Ԁ           F   m
-  x   x   :                   E  T   @  
-
-                                                                   F   w
-        Ԁ           F   ) \   \                   E  8 #  @  
-
- $    # 
-  #  
-  
-    F   ni |   |                    E  X )  @  
-
- D   < ) 
-  /   
-
-  
-  0    
-  
-    G       x   x   :                   E  T   @  
-
-                                                                  G           Ԁ           G   m
-  x   x   :                   E  T   @  
-
-                                                                   G   w
-        Ԁ           H       x   x   :                   E  T   @  
-
-                                                                  H           Ԁ           H   m
-  x   x   :                    E  T   @  
-
-                                                                   H   w
-        Ԁ           H   q d   d               0    E  @ *  @  
-
- ,   $ *  
-  1    
-  
-    H   Q \   \                   E  8 $  @  
-
- $    $ 
-  $  
-  
-    I       x   x   :                   E  T   @  
-
-                                                                  I           Ԁ           I   m
-  x   x   :               @    E  T   @  
-
-                                                                   I   w
-        Ԁ           J       x   x   :                   E  T   @  
-
-                                                                  J           Ԁ           J   m
-  x   x   :               P    E  T   @  
-
-                                                                   J   w
-        Ԁ           J   = d   d               `    E  @ +  @  
-
- ,   $ +  
-  2    
-  
-    J   z \   \                    E  8 %  @  
-
- $    % 
-  %  
-  
-    K       x   x   :                   E  T   @  
-
-                                                                  K           Ԁ           K   m
-  x   x   :               p    E  T   @  
-
-                                                                   K   w
-        Ԁ           K    \   \                   E  8 ,  @  
-
- $    , 
-  3   
-
-    L       x   x   :                    E  T   @  
-
-                                                                  L           Ԁ           L   m
-  x   x   :                   E  T   @  
-
-                                                                   L   w
-        Ԁ           L   * \   \               0    E  8 &  @  
-
- $    & 
-  &  
-  
-    L    d   d                   E  @ -  @  
-
- ,   $ -  
-  4    
-  
-    M       x   x   :               @    E  T   @  
-
-                                                                  M           Ԁ           M   m
-  x   x   :                   E  T   @  
-
-                                                                   M   w
-        Ԁ           N       x   x   :               P    E  T   @  
-
-                                                                  N           Ԁ           N   m
-  x   x   :                   E  T   @  
-
-                                                                   N   w
-        Ԁ           N     d   d                   E  @ .  @  
-
- ,   $ .  
-  5    
-  
-    N    \   \               p    E  8 '  @  
-
- $    ' 
-  '  
-  
-    N     \   \               `    E  8 '  @  
-
- $    ' 
-  '  
-  
-    O       x   x   :               p    E  T   @  
-
-                                                                  O           Ԁ           O   m
-  x   x   :                   E  T   @  
-
-                                                                   O   w
-        Ԁ           P       x   x   :                   E  T   @  
-
-                                                                  P           Ԁ           P   m
-  x   x   :                   E  T   @  
-
-                                                                   P   w
-        Ԁ           P    d   d                   E  @ (  @  
-
- ,   $ (  
-  (  
-  
-  
-    P    d   d                   E  @ (  @  
-
- ,   $ (  
-  (  
-  
-  
-    P   N |   |                    E  X /  @  
-
- D   < / 
-  6   
-
-  
-  7    
-  
-    Q       x   x   :                   E  T   @  
-
-                                                                  Q           Ԁ           Q   m
-  x   x   :                   E  T   @  
-
-                                                                   Q   w
-        Ԁ           R       x   x   :                   E  T    @  
-
-                                                                   R           Ԁ           R   m
-  x   x   :                    E  T    @  
-
-                                                                    R   w
-        Ԁ           R   G d   d               0    E  @ 0  @  
-
- ,   $ 0  
-  8    
-  
-    R   y d   d                   E  @ )  @  
-
- ,   $ )  
-  )    
-  
-    R   ۊ d   d                   E  @ )  @  
-
- ,   $ )  
-  )    
-  
-    S       x   x   :                   E  T !  @  
-
-      !                                                            S           Ԁ           S   m
-  x   x   :               @    E  T !  @  
-
-       !                                                            S   w
-        Ԁ           T       x   x   :                   E  T "  @  
-
-      "                                                            T           Ԁ           T   m
-  x   x   :               P    E  T "  @  
-
-       "                                                            T   w
-        Ԁ           T   ˧ d   d                   E  @ *  @  
-
- ,   $ *  
-  *    
-  
-    T   9 d   d                   E  @ *  @  
-
- ,   $ *  
-  *    
-  
-    T    d   d               `    E  @ 1  @  
-
- ,   $ 1  
-  9    
-  
-    U       x   x   :                    E  T #  @  
-
-      #                                                            U           Ԁ           U   m
-  x   x   :               p    E  T #  @  
-
-       #                                                            U   w
-        Ԁ           U   / \   \                   E  8 2  @  
-
- $    2 
-  :   
-
-    V       x   x   :                   E  T $  @  
-
-      $                                                            V           Ԁ           V   m
-  x   x   :                   E  T $  @  
-
-       $                                                            V   w
-        Ԁ           V   2 d   d                   E  @ 3  @  
-
- ,   $ 3  
-  ;    
-  
-    V   f d   d                    E  @ +  @  
-
- ,   $ +  
-  +    
-  
-    V   N d   d                   E  @ +  @  
-
- ,   $ +  
-  +    
-  
-    W       x   x   :               0    E  T %  @  
-
-      %                                                            W           Ԁ           W   m
-  x   x   :                   E  T %  @  
-
-       %                                                            W   w
-        Ԁ           X       x   x   :               @    E  T &  @  
-
-      &                                                            X           Ԁ           X   m
-  x   x   :                   E  T &  @  
-
-       &                                                            X   w
-        Ԁ           X    d   d                   E  @ ,  @  
-
- ,   $ ,  
-  ,    
-  
-    X   & d   d                   E  @ 4  @  
-
- ,   $ 4  
-  <    
-  
-    X   U d   d               P    E  @ ,  @  
-
- ,   $ ,  
-  ,    
-  
-    Y       x   x   :               `    E  T '  @  
-
-      '                                                            Y           Ԁ           Y   m
-  x   x   :                   E  T '  @  
-
-       '                                                            Y   w
-        Ԁ           Z       x   x   :               p    E  T (  @  
-
-      (                                                            Z           Ԁ           Z   m
-  x   x   :                   E  T (  @  
-
-       (                                                            Z   w
-        Ԁ           Z   h  d   d                    E  @ 5  @  
-
- ,   $ 5  
-  =    
-  
-    Z   E d   d                   E  @ -  @  
-
- ,   $ -  
-  -    
-  
-    Z    d   d                   E  @ -  @  
-
- ,   $ -  
-  -    
-  
-    [       x   x   :                   E  T )  @  
-
-      )                                                            [           Ԁ           [   m
-  x   x   :                   E  T )  @  
-
-       )                                                            [   w
-        Ԁ           \       x   x   :                   E  T *  @  
-
-      *                                                            \           Ԁ           \   m
-  x   x   :                    E  T *  @  
-
-       *                                                            \   w
-        Ԁ           \   Q  d   d                   E  @ .  @  
-
- ,   $ .  
-  .    
-  
-    \     d   d                   E  @ .  @  
-
- ,   $ .  
-  .    
-  
-    \   U d   d               0    E  @ 6  @  
-
- ,   $ 6  
-  >    
-  
-    ]       x   x   :                   E  T +  @  
-
-      +                                                            ]           Ԁ           ]   m
-  x   x   :               @    E  T +  @  
-
-       +                                                            ]   w
-        Ԁ           ^       x   x   :                   E  T ,  @  
-
-      ,                                                            ^           Ԁ           ^   m
-  x   x   :               P    E  T ,  @  
-
-       ,                                                            ^   w
-        Ԁ           ^     d   d                   E  @ /  @  
-
- ,   $ /  
-  /    
-  
-    ^   M d   d               `    E  @ 7  @  
-
- ,   $ 7  
-  ?    
-  
-    ^    d   d                   E  @ /  @  
-
- ,   $ /  
-  /    
-  
-    _       x   x   :                   E  T -  @  
-
-      -                                                            _           Ԁ           _   m
-  x   x   :               p    E  T -  @  
-
-       -                                                            _   w
-        Ԁ           `       x   x   :                    E  T .  @  
-
-      .                                                            `           Ԁ           `   m
-  x   x   :                   E  T .  @  
-
-       .                                                            `   w
-        Ԁ           `     d   d                   E  @ 0  @  
-
- ,   $ 0  
-  0    
-  
-    `   '7 d   d                   E  @ 8  @  
-
- ,   $ 8  
-  @    
-  
-    `    d   d                    E  @ 0  @  
-
- ,   $ 0  
-  0    
-  
-    a       x   x   :                    E  T /  @  
-
-      /                                                            a           Ԁ           a   m
-  x   x   :                   E  T /  @  
-
-       /                                                            a   w
-        Ԁ           b       x   x   :               0    E  T 0  @  
-
-      0                                                            b           Ԁ           b   m
-  x   x   :                   E  T 0  @  
-
-       0                                                            b   w
-        Ԁ           b    d   d                   E  @ 1  @  
-
- ,   $ 1  
-  1    
-  
-    b    d   d               @    E  @ 1  @  
-
- ,   $ 1  
-  1    
-  
-    b   W d   d                   E  @ 9  @  
-
- ,   $ 9  
-  A    
-  
-    c       x   x   :               P    E  T 1  @  
-
-      1                                                            c           Ԁ           c   m
-  x   x   :                   E  T 1  @  
-
-       1                                                            c   w
-        Ԁ           d       x   x   :               `    E  T 2  @  
-
-      2                                                            d           Ԁ           d   m
-  x   x   :                   E  T 2  @  
-
-       2                                                            d   w
-        Ԁ           d   * d   d               p    E  @ 2  @  
-
- ,   $ 2  
-  2    
-  
-    d   v d   d                    E  @ 2  @  
-
- ,   $ 2  
-  2    
-  
-    d   m d   d                   E  @ :  @  
-
- ,   $ :  
-  B    
-  
-    e       x   x   :                   E  T 3  @  
-
-      3                                                            e           Ԁ           e   m
-  x   x   :                    E  T 3  @  
-
-       3                                                            e   w
-        Ԁ           f       x   x   :                   E  T 4  @  
-
-      4                                                            f           Ԁ           f   m
-  x   x   :                   E  T 4  @  
-
-       4                                                            f   w
-        Ԁ           f   & d   d                   E  @ 3  @  
-
- ,   $ 3  
-  3    
-  
-    f    d   d               0    E  @ 3  @  
-
- ,   $ 3  
-  3    
-  
-    f    d   d                    E  @ ;  @  
-
- ,   $ ;  
-  C    
-  
-    g       x   x   :                   E  T 5  @  
-
-      5                                                            g           Ԁ           g   m
-  x   x   :               0    E  T 5  @  
-
-       5                                                            g   w
-        Ԁ           h       x   x   :                   E  T 6  @  
-
-      6                                                            h           Ԁ           h   m
-  x   x   :               @    E  T 6  @  
-
-       6                                                            h   w
-        Ԁ           h   e  d   d               @    E  @ 4  @  
-
- ,   $ 4  
-  4    
-  
-    h    d   d               P    E  @ <  @  
-
- ,   $ <  
-  D    
-  
-    h    d   d                   E  @ 4  @  
-
- ,   $ 4  
-  4    
-  
-    i       x   x   :                   E  T 7  @  
-
-      7                                                            i           Ԁ           i   m
-  x   x   :               `    E  T 7  @  
-
-       7                                                            i   w
-        Ԁ           j       x   x   :                   E  T 8  @  
-
-      8                                                            j           Ԁ           j   m
-  x   x   :               p    E  T 8  @  
-
-       8                                                            j   w
-        Ԁ           j    d   d               P    E  @ 5  @  
-
- ,   $ 5  
-  5    
-  
-    j   \f d   d                    E  @ 5  @  
-
- ,   $ 5  
-  5    
-  
-    j    d   d                   E  @ =  @  
-
- ,   $ =  
-  E    
-  
-    k       x   x   :                   E  T 9  @  
-
-      9                                                            k           Ԁ           k   m
-  x   x   :                   E  T 9  @  
-
-       9                                                            k   w
-        Ԁ           l       x   x   :                    E  T :  @  
-
-      :                                                            l           Ԁ           l   m
-  x   x   :                   E  T :  @  
-
-       :                                                            l   w
-        Ԁ           l    d   d               0    E  @ 6  @  
-
- ,   $ 6  
-  6    
-  
-    l    d   d               `    E  @ 6  @  
-
- ,   $ 6  
-  6    
-  
-    l   4 d   d                   E  @ >  @  
-
- ,   $ >  
-  F    
-  
-    m       x   x   :               @    E  T ;  @  
-
-      ;                                                            m           Ԁ           m   m
-  x   x   :                   E  T ;  @  
-
-       ;                                                            m   w
-        Ԁ           n       x   x   :               P    E  T <  @  
-
-      <                                                            n           Ԁ           n   n
-  x   x   :                   E  T <  @  
-
-       <                                                            n   x
-        Ԁ           n   Q  d   d                   E  @ ?  @  
-
- ,   $ ?  
-  G    
-  
-    n   4T d   d               `    E  @ 7  @  
-
- ,   $ 7  
-  7    
-  
-    n   R d   d               p    E  @ 7  @  
-
- ,   $ 7  
-  7    
-  
-    o       x   x   :               p    E  T =  @  
-
-      =                                                            o           Ԁ           o   n
-  x   x   :                   E  T =  @  
-
-       =                                                            o   x
-        Ԁ           p       x   x   :                   E  T >  @  
-
-      >                                                            p           Ԁ           p   n
-  x   x   :                    E  T >  @  
-
-       >                                                            p   x
-        Ԁ           p     d   d                   E  @ 8  @  
-
- ,   $ 8  
-  8    
-  
-    p    d   d                   E  @ @  @  
-
- ,   $ @  
-  H    
-  
-    p   % d   d                   E  @ 8  @  
-
- ,   $ 8  
-  8    
-  
-    q       x   x   :                   E  T ?  @  
-
-      ?                                                            q           Ԁ           q   n
-  x   x   :                    E  T ?  @  
-
-       ?                                                            q   x
-        Ԁ           r       x   x   :                   E  T @  @  
-
-      @                                                            r           Ԁ           r   n
-  x   x   :               0    E  T @  @  
-
-       @                                                            r   x
-        Ԁ           r   % d   d               @    E  @ A  @  
-
- ,   $ A  
-  I    
-  
-    r    d   d                   E  @ 9  @  
-
- ,   $ 9  
-  9    
-  
-    r   & d   d                   E  @ 9  @  
-
- ,   $ 9  
-  9    
-  
-    s       x   x   :                   E  T A  @  
-
-      A                                                            s           Ԁ           s   n
-  x   x   :               P    E  T A  @  
-
-       A                                                            s   x
-        Ԁ           t       x   x   :                   E  T B  @  
-
-      B                                                            t           Ԁ           t   n
-  x   x   :               `    E  T B  @  
-
-       B                                                            t   x
-        Ԁ           t    d   d               p    E  @ B  @  
-
- ,   $ B  
-  J    
-  
-    t    d   d                   E  @ :  @  
-
- ,   $ :  
-  :    
-  
-    t   W d   d                   E  @ :  @  
-
- ,   $ :  
-  :    
-  
-    u       x   x   :                    E  T C  @  
-
-      C                                                            u           Ԁ           u   n
-  x   x   :                   E  T C  @  
-
-       C                                                            u   x
-        Ԁ           v       x   x   :                   E  T D  @  
-
-      D                                                            v           Ԁ           v   n
-  x   x   :                   E  T D  @  
-
-       D                                                            v   x
-        Ԁ           v    d   d                    E  @ ;  @  
-
- ,   $ ;  
-  ;    
-  
-    v   S d   d                   E  @ C  @  
-
- ,   $ C  
-  K    
-  
-    v   - d   d                   E  @ ;  @  
-
- ,   $ ;  
-  ;    
-  
-    w       x   x   :               0    E  T E  @  
-
-      E                                                            w           Ԁ           w   n
-  x   x   :                   E  T E  @  
-
-       E                                                            w   x
-        Ԁ           x       x   x   :               @    E  T F  @  
-
-      F                                                            x           Ԁ           x   n
-  x   x   :                   E  T F  @  
-
-       F                                                            x   x
-        Ԁ           x   ^ d   d                   E  @ <  @  
-
- ,   $ <  
-  <    
-  
-    x   R d   d               P    E  @ <  @  
-
- ,   $ <  
-  <    
-  
-    x   O. d   d                   E  @ D  @  
-
- ,   $ D  
-  L    
-  
-    y       x   x   :               `    E  T G  @  
-
-      G                                                            y           Ԁ           y   n
-  x   x   :                   E  T G  @  
-
-       G                                                            y   x
-        Ԁ           z       x   x   :               p    E  T H  @  
-
-      H                                                            z           Ԁ           z   n
-  x   x   :                   E  T H  @  
-
-       H                                                            z   x
-        Ԁ           z    d   d                   E  @ =  @  
-
- ,   $ =  
-  =    
-  
-    z   * d   d                   E  @ =  @  
-
- ,   $ =  
-  =    
-  
-    {       x   x   :                   E  T I  @  
-
-      I                                                            {   
-  x   x   :                   E  T I  @  
-
-      I                                                            {     x   x   :                   E  T I  @  
-
-      I                                                            {   "  x   x   :                   E  T I  @  
-
-      I                                                            {   $4  x   x   :                   E  T I  @  
-
-      I                                                            {   Y  x   x   :                   E  T I  @  
-
-      I                                                            {   x  x   x   :                   E  T I  @  
-
-      I                                                            |       x   x   :                   E  T J  @  
-
-      J                                                            |     x   x   :                   E  T J  @  
-
-      J                                                            |   d  x   x   :                   E  T J  @  
-
-      J                                                            |     x   x   :                   E  T J  @  
-
-      J                                                            |   <I  x   x   :                   E  T J  @  
-
-      J                                                            |     x   x   :                   E  T J  @  
-
-      J                                                            |     x   x   :                   E  T J  @  
-
-      J                                                            |   0  d   d                   E  @ >  @  
-
- ,   $ >  
-  >    
-  
-    |    d   d                   E  @ >  @  
-
- ,   $ >  
-  >    
-  
-    }       x   x   :                   E  T K  @  
-
-      K                                                            }     x   x   :                   E  T K  @  
-
-      K                                                            }     x   x   :                   E  T K  @  
-
-      K                                                            }   (  x   x   :                   E  T K  @  
-
-      K                                                            }   B  x   x   :                   E  T K  @  
-
-      K                                                            }   VO  x   x   :                   E  T K  @  
-
-      K                                                            }     x   x   :                   E  T K  @  
-
-      K                                                            ~       x   x   :                   E  T L  @  
-
-      L                                                            ~   b	  x   x   :                   E  T L  @  
-
-      L                                                            ~     x   x   :                   E  T L  @  
-
-      L                                                            ~   -  x   x   :                   E  T L  @  
-
-      L                                                            ~    G  x   x   :                   E  T L  @  
-
-      L                                                            ~     x   x   :                   E  T L  @  
-
-      L                                                            ~   A  d   d                   E  @ ?  @  
-
- ,   $ ?  
-  ?    
-  
-    ~     x   x   :                   E  T L  @  
-
-      L                                                            ~     d   d                   E  @ ?  @  
-
- ,   $ ?  
-  ?    
-  
-         @   @                          
-
-       k  @   @   :                           
-     
-       u        Ԁ                x   x   :                	    E  T M  @  
-
-      M                                                                       Ԁ              >  @   @                          
-
-       B        Ԁ              dH  x   x   :                    E  T M  ?  
-
-      M                                                               ?q  @   @   :               0           
-     
-       z        Ԁ                @   @               @           
-
-       Η  @   @   :               	           
-     
-       ɛ        Ԁ              ߠ  x   x   :               P    E  T I  ?  
-
-       M                                                                       Ԁ                  x   x   :                	    E  T N  @  
-
-      N                                                                       Ԁ              m
-  x   x   :               `    E  T N  ?  
-
-      N                                                                       Ԁ                x   x   :               p    E  T J  ?  
-
-       N                                                                       Ԁ               d   d               0	    E  @ @  @  
-
- ,   $ @  
-  @    
-
-  
-       ~ d   d                   E  @ @  @  
-
- ,   $ @  
-  @    
-  
-           x   x   :               @	    E  T O  @  
-
-      O                                                                       Ԁ              m
-  x   x   :                   E  T O  ?  
-
-      O                                                                       Ԁ              "  x   x   :                   E  T K  ?  
-
-       O                                                               ,        Ԁ                  x   x   :               P	    E  T P  @  
-
-      P                                                                       Ԁ              m
-  x   x   :                   E  T P  ?  
-
-      P                                                                       Ԁ                x   x   :                   E  T L  ?  
-
-       P                                                                       Ԁ              7 d   d               `	    E  @ A  @  
-
- ,   $ A  
-  A    
-
-  
-       z |   |                   E  X A  @  
-
- D   < A 
-  A   
-
-  
-  B    
-  
-           x   x   :               p	    E  T Q  @  
-
-      Q                                                                       Ԁ              m
-  x   x   :                   E  T Q  ?  
-
-      Q                                                                       Ԁ                x   x   :                   E  T M  ?  
-
-       Q                                                                       Ԁ                  x   x   :               	    E  T R  @  
-
-      R                                                                       Ԁ              m
-  x   x   :                    E  T R  ?  
-
-      R                                                                       Ԁ              F  x   x   :                   E  T N  ?  
-
-       R                                                               P        Ԁ              ?| d   d                    E  @ B  @  
-
- ,   $ B  
-  C    
-  
-       + d   d               	    E  @ B  @  
-
- ,   $ B  
-  B    
-
-  
-           x   x   :               	    E  T S  @  
-
-      S                                                                       Ԁ              m
-  x   x   :               0    E  T S  ?  
-
-      S                                                                       Ԁ                x   x   :               @    E  T O  ?  
-
-       S                                                                       Ԁ                  x   x   :               	    E  T T  @  
-
-      T                                                                       Ԁ              m
-  x   x   :               P    E  T T  ?  
-
-      T                                                                       Ԁ              6  x   x   :               `    E  T P  ?  
-
-       T                                                               @        Ԁ               d   d               p    E  @ C  @  
-
- ,   $ C  
-  D    
-  
-        \   \               	    E  8 C  @  
-
- $    C 
-  C  
-  
-           x   x   :               	    E  T U  @  
-
-      U                                                                       Ԁ              m
-  x   x   :                   E  T U  ?  
-
-      U                                                                       Ԁ                x   x   :                   E  T Q  ?  
-
-       U                                                                       Ԁ              qT  \   \                   E  8 D  @  
-
- $    D 
-  E   
-
-           x   x   :               	    E  T V  @  
-
-      V                                                                       Ԁ              m
-  x   x   :                   E  T V  ?  
-
-      V                                                                 x   x   :                   E  T V  ?  
-
-      V                                                                       Ԁ              T  x   x   :                   E  T R  ?  
-
-       V                                                               ^        Ԁ               \   \               	    E  8 D  @  
-
- $    D 
-  D  
-  
-       oG d   d                   E  @ E  @  
-
- ,   $ E  
-  F    
-  
-           x   x   :                
-    E  T W  @  
-
-      W                                                                       Ԁ              m
-  x   x   :                   E  T W  ?  
-
-      W                                                                       Ԁ              r  x   x   :                   E  T S  ?  
-
-       W                                                               |        Ԁ                  x   x   :               
-    E  T X  @  
-
-      X                                                                       Ԁ              m
-  x   x   :                    E  T X  ?  
-
-      X                                                                       Ԁ              6  x   x   :                   E  T T  ?  
-
-       X                                                               @        Ԁ              F  \   \                
-    E  8 E  @  
-
- $    E 
-  E  
-  
-        d   d                    E  @ F  @  
-
- ,   $ F  
-  G    
-  
-           x   x   :               0
-    E  T Y  @  
-
-      Y                                                                       Ԁ              m
-  x   x   :               0    E  T Y  ?  
-
-      Y                                                                       Ԁ                x   x   :               @    E  T U  ?  
-
-       Y                                                                       Ԁ                  x   x   :               @
-    E  T Z  @  
-
-      Z                                                                       Ԁ              m
-  x   x   :               P    E  T Z  ?  
-
-      Z                                                                       Ԁ              K  x   x   :               `    E  T V  ?  
-
-       Z                                                               U        Ԁ              Tr  \   \               P
-    E  8 F  @  
-
- $    F 
-  F  
-  
-       h |   |               p    E  X G  @  
-
- D   < G 
-  H   
-
-  
-  I    
-  
-           x   x   :               `
-    E  T [  @  
-
-      [                                                                       Ԁ              m
-  x   x   :                   E  T [  ?  
-
-      [                                                                       Ԁ              O  x   x   :                   E  T W  ?  
-
-       [                                                               Y        Ԁ                  x   x   :               p
-    E  T \  @  
-
-      \                                                                       Ԁ              m
-  x   x   :                   E  T \  ?  
-
-      \                                                                       Ԁ                x   x   :                   E  T X  ?  
-
-       \                                                                       Ԁ              `% \   \               
-    E  8 G  @  
-
- $    G 
-  G  
-  
-       ^7 d   d                   E  @ H  @  
-
- ,   $ H  
-  J    
-  
-           x   x   :               
-    E  T ]  @  
-
-      ]                                                                       Ԁ              m
-  x   x   :                   E  T ]  ?  
-
-      ]                                                                       Ԁ              '  x   x   :                   E  T Y  ?  
-
-       ]                                                               1        Ԁ                  x   x   :               
-    E  T ^  @  
-
-      ^                                                                       Ԁ              m
-  x   x   :                   E  T ^  ?  
-
-      ^                                                                       Ԁ                x   x   :                    E  T Z  ?  
-
-       ^                                                                       Ԁ              I  d   d                   E  @ I  @  
-
- ,   $ I  
-  K    
-  
-       <~ \   \               
-    E  8 H  @  
-
- $    H 
-  H  
-  
-           x   x   :               
-    E  T _  @  
-
-      _                                                                       Ԁ              m
-  x   x   :                    E  T _  ?  
-
-      _                                                                       Ԁ                x   x   :               0    E  T [  ?  
-
-       _                                                                       Ԁ              k \   \               @    E  8 J  @  
-
- $    J 
-  L   
-
-           x   x   :               
-    E  T `  @  
-
-      `                                                                       Ԁ              m
-  x   x   :               P    E  T `  ?  
-
-      `                                                                       Ԁ                x   x   :               `    E  T \  ?  
-
-       `                                                                       Ԁ              - d   d               p    E  @ K  @  
-
- ,   $ K  
-  M    
-  
-       ; \   \               
-    E  8 I  @  
-
- $    I 
-  I  
-  
-           x   x   :               
-    E  T a  @  
-
-      a                                                                       Ԁ              m
-  x   x   :                   E  T a  ?  
-
-      a                                                                       Ԁ              c  x   x   :                   E  T ]  ?  
-
-       a                                                               m        Ԁ                  x   x   :                    E  T b  @  
-
-      b                                                                       Ԁ              m
-  x   x   :                   E  T b  ?  
-
-      b                                                                       Ԁ                x   x   :                   E  T ^  ?  
-
-       b                                                               	        Ԁ              b7 d   d                   E  @ L  @  
-
- ,   $ L  
-  N    
-  
-       j~ \   \                   E  8 J  @  
-
- $    J 
-  J  
-  
-           x   x   :                    E  T c  @  
-
-      c                                                                       Ԁ              m
-  x   x   :                   E  T c  ?  
-
-      c                                                                       Ԁ              7  x   x   :                   E  T _  ?  
-
-       c                                                               A        Ԁ                  x   x   :               0    E  T d  @  
-
-      d                                                                       Ԁ              m
-  x   x   :                   E  T d  ?  
-
-      d                                                                       Ԁ                x   x   :                    E  T `  ?  
-
-       d                                                                       Ԁ              s' |   |                   E  X M  @  
-
- D   < M 
-  O   
-
-  
-  P    
-  
-       < \   \               @    E  8 K  @  
-
- $    K 
-  K  
-  
-           x   x   :               P    E  T e  @  
-
-      e                                                                       Ԁ              m
-  x   x   :                    E  T e  ?  
-
-      e                                                                       Ԁ              c  x   x   :               0    E  T a  ?  
-
-       e                                                               m        Ԁ                  x   x   :               `    E  T f  @  
-
-      f                                                                       Ԁ              m
-  x   x   :               @    E  T f  ?  
-
-      f                                                                       Ԁ              #  x   x   :               P    E  T b  ?  
-
-       f                                                               -        Ԁ              Y; \   \               p    E  8 L  @  
-
- $    L 
-  L  
-  
-        d   d               `    E  @ N  @  
-
- ,   $ N  
-  Q    
-  
-           x   x   :                   E  T g  @  
-
-      g                                                                       Ԁ              m
-  x   x   :               p    E  T g  ?  
-
-      g                                                                       Ԁ              o  x   x   :                   E  T c  ?  
-
-       g                                                               y        Ԁ                  x   x   :                   E  T h  @  
-
-      h                                                                       Ԁ              m
-  x   x   :                   E  T h  ?  
-
-      h                                                                       Ԁ                x   x   :                   E  T d  ?  
-
-       h                                                                       Ԁ              <  d   d                   E  @ O  @  
-
- ,   $ O  
-  R    
-  
-       |M \   \                   E  8 M  @  
-
- $    M 
-  M  
-  
-           x   x   :                   E  T i  @  
-
-      i                                                                       Ԁ              m
-  x   x   :                   E  T i  ?  
-
-      i                                                                       Ԁ                x   x   :                   E  T e  ?  
-
-       i                                                                       Ԁ               \   \                   E  8 P  @  
-
- $    P 
-  S   
-
-           x   x   :                   E  T j  @  
-
-      j                                                                       Ԁ              m
-  x   x   :                   E  T j  ?  
-
-      j                                                                       Ԁ              7  x   x   :                	    E  T f  ?  
-
-       j                                                               A        Ԁ               d   d               	    E  @ Q  @  
-
- ,   $ Q  
-  T    
-  
-       rH \   \                   E  8 N  @  
-
- $    N 
-  N  
-  
-           x   x   :                   E  T k  @  
-
-      k                                                                       Ԁ              m
-  x   x   :                	    E  T k  ?  
-
-      k                                                                       Ԁ                x   x   :               0	    E  T g  ?  
-
-       k                                                                       Ԁ                  x   x   :                   E  T l  @  
-
-      l                                                                       Ԁ              m
-  x   x   :               @	    E  T l  ?  
-
-      l                                                                       Ԁ                x   x   :               P	    E  T h  ?  
-
-       l                                                                       Ԁ              `) \   \                    E  8 O  @  
-
- $    O 
-  O  
-  
-       z d   d               `	    E  @ R  @  
-
- ,   $ R  
-  U    
-  
-           x   x   :                   E  T m  @  
-
-      m                                                                       Ԁ              m
-  x   x   :               p	    E  T m  ?  
-
-      m                                                                       Ԁ              7  x   x   :               	    E  T i  ?  
-
-       m                                                               A        Ԁ                  x   x   :                    E  T n  @  
-
-      n                                                                       Ԁ              m
-  x   x   :               	    E  T n  ?  
-
-      n                                                                       Ԁ                x   x   :               	    E  T j  ?  
-
-       n                                                                       Ԁ              1 \   \               0    E  8 P  @  
-
- $    P 
-  P  
-  
-       E |   |               	    E  X S  @  
-
- D   < S 
-  V   
-
-  
-  W    
-  
-           x   x   :               @    E  T o  @  
-
-      o                                                                       Ԁ              m
-  x   x   :               	    E  T o  ?  
-
-      o                                                                       Ԁ                x   x   :               	    E  T k  ?  
-
-       o                                                                       Ԁ                  x   x   :               P    E  T p  @  
-
-      p                                                                       Ԁ              m
-  x   x   :               	    E  T p  ?  
-
-      p                                                                       Ԁ              c  x   x   :               	    E  T l  ?  
-
-       p                                                               m        Ԁ              0 d   d                
-    E  @ T  @  
-
- ,   $ T  
-  X    
-  
-       V_ \   \               `    E  8 Q  @  
-
- $    Q 
-  Q  
-  
-           x   x   :               p    E  T q  @  
-
-      q                                                                       Ԁ              m
-  x   x   :               
-    E  T q  ?  
-
-      q                                                                       Ԁ              w  x   x   :                
-    E  T m  ?  
-
-       q                                                                       Ԁ                  x   x   :                   E  T r  @  
-
-      r                                                                       Ԁ              m
-  x   x   :               0
-    E  T r  ?  
-
-      r                                                                       Ԁ                x   x   :               @
-    E  T n  ?  
-
-       r                                                                       Ԁ               d   d               P
-    E  @ U  @  
-
- ,   $ U  
-  Y    
-  
-       ; \   \                   E  8 R  @  
-
- $    R 
-  R  
-  
-           x   x   :                   E  T s  @  
-
-      s                                                                       Ԁ              m
-  x   x   :               `
-    E  T s  ?  
-
-      s                                                                       Ԁ              _  x   x   :               p
-    E  T o  ?  
-
-       s                                                               i        Ԁ              f \   \               
-    E  8 V  @  
-
- $    V 
-  Z   
-
-           x   x   :                   E  T t  @  
-
-      t                                                                       Ԁ              m
-  x   x   :               
-    E  T t  ?  
-
-      t                                                                       Ԁ              O  x   x   :               
-    E  T p  ?  
-
-       t                                                               Y        Ԁ               \   \                   E  8 S  @  
-
- $    S 
-  S  
-  
-       H4 d   d               
-    E  @ W  @  
-
- ,   $ W  
-  [    
-  
-           x   x   :                   E  T u  @  
-
-      u                                                                       Ԁ              m
-  x   x   :               
-    E  T u  ?  
-
-      u                                                                       Ԁ                x   x   :               
-    E  T q  ?  
-
-       u                                                               	        Ԁ                  x   x   :                   E  T v  @  
-
-      v                                                                       Ԁ              m
-  x   x   :               
-    E  T v  ?  
-
-      v                                                                       Ԁ                x   x   :               
-    E  T r  ?  
-
-       v                                                                       Ԁ               \   \                   E  8 T  @  
-
- $    T 
-  T  
-  
-        d   d                    E  @ X  @  
-
- ,   $ X  
-  \    
-  
-           x   x   :                    E  T w  @  
-
-      w                                                                       Ԁ              m
-  x   x   :                   E  T w  ?  
-
-      w                                                                       Ԁ              G  x   x   :                    E  T s  ?  
-
-       w                                                               Q        Ԁ                  x   x   :                   E  T x  @  
-
-      x                                                                       Ԁ              m
-  x   x   :               0    E  T x  ?  
-
-      x                                                                       Ԁ                x   x   :               @    E  T t  ?  
-
-       x                                                                       Ԁ              h=  |   |               P    E  X Y  @  
-
- D   < Y 
-  ]   
-
-  
-  ^    
-  
-       v \   \                    E  8 U  @  
-
- $    U 
-  U  
-  
-           x   x   :               0    E  T y  @  
-
-      y                                                                       Ԁ              m
-  x   x   :               `    E  T y  ?  
-
-      y                                                                       Ԁ              K  x   x   :               p    E  T u  ?  
-
-       y                                                               U        Ԁ                  x   x   :               @    E  T z  @  
-
-      z                                                                       Ԁ              m
-  x   x   :                   E  T z  ?  
-
-      z                                                                       Ԁ                x   x   :                   E  T v  ?  
-
-       z                                                                       Ԁ              M \   \               P    E  8 V  @  
-
- $    V 
-  V  
-  
-       UZ d   d                   E  @ Z  @  
-
- ,   $ Z  
-  _    
-  
-           x   x   :               `    E  T {  @  
-
-      {                                                                       Ԁ              m
-  x   x   :                   E  T {  ?  
-
-      {                                                                       Ԁ                x   x   :                   E  T w  ?  
-
-       {                                                                       Ԁ                  x   x   :               p    E  T |  @  
-
-      |                                                                       Ԁ              m
-  x   x   :                   E  T |  ?  
-
-      |                                                               +  x   x   :                   E  T |  ?  
-
-      |                                                               S        Ԁ              ]   x   x   :                   E  T x  ?  
-
-       |                                                               g         Ԁ              +  \   \                   E  8 W  @  
-
- $    W 
-  W  
-  
-       Y d   d                   E  @ [  @  
-
- ,   $ [  
-  `    
-  
-           x   x   :                   E  T }  @  
-
-      }                                                                       Ԁ              m
-  x   x   :                    E  T }  ?  
-
-      }                                                                       Ԁ              #  x   x   :                   E  T y  ?  
-
-       }                                                               -        Ԁ               \   \                    E  8 \  @  
-
- $    \ 
-  a   
-
-           x   x   :                   E  T ~  @  
-
-      ~                                                                       Ԁ              m
-  x   x   :               0    E  T ~  ?  
-
-      ~                                                                       Ԁ                x   x   :               @    E  T z  ?  
-
-       ~                                                                       Ԁ              y d   d               P    E  @ ]  @  
-
- ,   $ ]  
-  b    
-  
-       p9 \   \                   E  8 X  @  
-
- $    X 
-  X  
-  
-           x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :               `    E  T   ?  
-
-                                                                             Ԁ                x   x   :               p    E  T {  ?  
-
-                                                                              Ԁ                  x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ              G  x   x   :                   E  T |  ?  
-
-                                                                      Q        Ԁ               \   \                   E  8 Y  @  
-
- $    Y 
-  Y  
-  
-        d   d                   E  @ ^  @  
-
- ,   $ ^  
-  c    
-  
-           x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ              _  x   x   :                   E  T }  ?  
-
-                                                                      i        Ԁ                  x   x   :                    E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ              7  x   x   :                   E  T ~  ?  
-
-                                                                      A        Ԁ              _  \   \                   E  8 Z  @  
-
- $    Z 
-  Z  
-  
-        |   |                   E  X _  @  
-
- D   < _ 
-  d   
-
-  
-  e    
-  
-           x   x   :                    E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                    E  T   ?  
-
-                                                                             Ԁ              s  x   x   :                   E  T   ?  
-
-                                                                      }        Ԁ                  x   x   :               0    E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                    E  T   ?  
-
-                                                                             Ԁ                x   x   :               0    E  T   ?  
-
-                                                                              Ԁ               \   \               @    E  8 [  @  
-
- $    [ 
-  [  
-  
-       ɟ d   d               @    E  @ `  @  
-
- ,   $ `  
-  f    
-  
-           x   x   :               P    E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :               P    E  T   ?  
-
-                                                                             Ԁ              '  x   x   :               `    E  T   ?  
-
-                                                                      1        Ԁ                  x   x   :               `    E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :               p    E  T   ?  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ               d   d                   E  @ a  @  
-
- ,   $ a  
-  g    
-  
-       P \   \               p    E  8 \  @  
-
- $    \ 
-  \  
-  
-           x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ              K  x   x   :                   E  T   ?  
-
-                                                                      U        Ԁ              aQ \   \                   E  8 b  @  
-
- $    b 
-  h   
-
-           x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ              `  d   d                   E  @ c  @  
-
- ,   $ c  
-  i    
-  
-       [ \   \                   E  8 ]  @  
-
- $    ] 
-  ]  
-  
-           x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                    E  T   ?  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ                  x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                    E  T   ?  
-
-                                                                             Ԁ              ;  x   x   :               0    E  T   ?  
-
-                                                                      E        Ԁ              % d   d               @    E  @ d  @  
-
- ,   $ d  
-  j    
-  
-       ) \   \                   E  8 ^  @  
-
- $    ^ 
-  ^  
-  
-           x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :               P    E  T   ?  
-
-                                                                             Ԁ              7  x   x   :               `    E  T   ?  
-
-                                                                      A        Ԁ                  x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :               p    E  T   ?  
-
-                                                                             Ԁ              #  x   x   :                   E  T   ?  
-
-                                                                      -        Ԁ               \   \                    E  8 _  @  
-
- $    _ 
-  _  
-  
-        |   |                   E  X e  @  
-
- D   < e 
-  k   
-
-  
-  l    
-  
-           x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                      	        Ԁ                  x   x   :                    E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ              3 \   \               0    E  8 `  @  
-
- $    ` 
-  `  
-  
-       ? d   d                   E  @ f  @  
-
- ,   $ f  
-  m    
-  
-           x   x   :               @    E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ                x   x   :                    E  T   ?  
-
-                                                                              Ԁ                  x   x   :               P    E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ                x   x   :                    E  T   ?  
-
-                                                                              Ԁ              N  \   \               `    E  8 a  @  
-
- $    a 
-  a  
-  
-       | d   d               0    E  @ g  @  
-
- ,   $ g  
-  n    
-  
-           x   x   :               p    E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :               @    E  T   ?  
-
-                                                                             Ԁ                x   x   :               P    E  T   ?  
-
-                                                                              Ԁ              4 \   \               `    E  8 h  @  
-
- $    h 
-  o   
-
-           x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :               p    E  T   ?  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ              Z \   \                   E  8 b  @  
-
- $    b 
-  b  
-  
-       N d   d                   E  @ i  @  
-
- ,   $ i  
-  p    
-  
-           x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ              K  x   x   :                   E  T   ?  
-
-                                                                      U        Ԁ                  x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ              _  x   x   :                   E  T   ?  
-
-                                                                      i        Ԁ              5 \   \                   E  8 c  @  
-
- $    c 
-  c  
-  
-       $ d   d                   E  @ j  @  
-
- ,   $ j  
-  q    
-  
-           x   x   :                   E  T   @  
-
-                                                                             Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                             Ԁ                x   x   :                    E  T   ?  
-
-                                                                              Ԁ           
\ No newline at end of file
diff -Naur ns-3.23/src/olsr/test/bug780-1-0.pcap ns-3.24/src/olsr/test/bug780-1-0.pcap
--- ns-3.23/src/olsr/test/bug780-1-0.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/bug780-1-0.pcap	1969-12-31 16:00:00.000000000 -0800
@@ -1,2363 +0,0 @@
-ò            i       y T   T                     E  0    @  
-
-       
-              T   T                     E  0    @  
-
-       
-             T T   T                     E  0    @  
-
-       
-            	 d   d                    E  @   @  
-
- ,   $   
-      
-  
-       6: \   \                    E  8   @  
-
- $     
-      
-       & \   \                    E  8   @  
-
- $     
-      
-       > d   d                     E  @   @  
-
- ,   $   
-      
-  
-       &q \   \                     E  8   @  
-
- $     
-      
-        \   \                     E  8   @  
-
- $     
-      
-         \   \               0     E  8   @  
-
- $     
-    
-  
-        d   d               0     E  @   @  
-
- ,   $   
-      
-  
-       0 \   \               0     E  8   @  
-
- $     
-    
-  
-        \   \               @     E  8   @  
-
- $     
-    
-  
-       B d   d               @     E  @   @  
-
- ,   $   
-      
-  
-        \   \               @     E  8   @  
-
- $     
-    
-  
-    
-   1;  \   \               P     E  8   @  
-
- $     
-    
-  
-    
-   4 |   |               P     E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-    
-    \   \               P     E  8   @  
-
- $     
-    
-  
-        \   \               `     E  8   @  
-
- $     
-    
-  
-       "v \   \               `     E  8   @  
-
- $     
-    
-  
-        d   d               `     E  @   @  
-
- ,   $   
-      
-  
-       @ \   \               p     E  8   @  
-
- $     
-    
-  
-       | \   \               p     E  8   @  
-
- $     
-    
-  
-       W_ d   d               p     E  @   @  
-
- ,   $   
-      
-  
-       V \   \                    E  8   @  
-
- $     
-  	   
-
-       [  \   \                    E  8   @  
-
- $     
-    
-  
-        d   d                    E  @ 	  @  
-
- ,   $ 	  
-  
-    
-  
-       ^( \   \                    E  8   @  
-
- $     
-    
-  
-        \   \                    E  8 	  @  
-
- $    	 
-  	  
-  
-        \   \                    E  8 	  @  
-
- $    	 
-  	  
-  
-       7. d   d                    E  @ 
-  @  
-
- ,   $ 
-  
-      
-  
-       
- \   \                    E  8 
-  @  
-
- $    
- 
-  
-  
-  
-       b \   \                    E  8 
-  @  
-
- $    
- 
-  
-  
-  
-       K |   |                    E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-       - \   \                    E  8   @  
-
- $     
-    
-  
-       ^ \   \                    E  8   @  
-
- $     
-    
-  
-       L d   d                    E  @   @  
-
- ,   $   
-      
-  
-       .l  d   d                    E  @   @  
-
- ,   $   
-      
-  
-        \   \                    E  8   @  
-
- $     
-    
-  
-        \   \                    E  8   @  
-
- $     
-    
-  
-       E \   \                    E  8   @  
-
- $     
-     
-
-        \   \                    E  8   @  
-
- $     
-    
-  
-       ſ d   d                    E  @   @  
-
- ,   $   
-      
-  
-        \   \                    E  8   @  
-
- $     
-    
-  
-        \   \                    E  8   @  
-
- $     
-    
-  
-       b \   \                    E  8   @  
-
- $     
-    
-  
-       r d   d                    E  @   @  
-
- ,   $   
-      
-  
-       C \   \                    E  8   @  
-
- $     
-    
-  
-       |e \   \                    E  8   @  
-
- $     
-    
-  
-       #S |   |                   E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-        pg d   d                    E  @   @  
-
- ,   $   
-      
-  
-        + \   \                    E  8   @  
-
- $     
-    
-  
-        X \   \                    E  8   @  
-
- $     
-    
-  
-    "   *  d   d               0    E  @   @  
-
- ,   $   
-      
-  
-    "     \   \                   E  8   @  
-
- $     
-    
-  
-    "    \   \                   E  8   @  
-
- $     
-    
-  
-    #    \   \               @    E  8   @  
-
- $     
-     
-
-    $   m d   d               P    E  @   @  
-
- ,   $   
-      
-  
-    $   PV \   \                    E  8   @  
-
- $     
-    
-  
-    $   0 \   \                    E  8   @  
-
- $     
-    
-  
-    &     d   d               `    E  @   @  
-
- ,   $   
-      
-  
-    &    \   \               0    E  8   @  
-
- $     
-    
-  
-    &    \   \               0    E  8   @  
-
- $     
-    
-  
-    (     \   \               @    E  8   @  
-
- $     
-    
-  
-    (   c \   \               @    E  8   @  
-
- $     
-    
-  
-    (   + |   |               p    E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-    *    d   d                   E  @   @  
-
- ,   $   
-      
-  
-    *   , \   \               P    E  8   @  
-
- $     
-    
-  
-    *    \   \               P    E  8   @  
-
- $     
-    
-  
-    ,    \   \               `    E  8   @  
-
- $     
-    
-  
-    ,    d   d                   E  @   @  
-
- ,   $   
-      
-  
-    ,   Ţ \   \               `    E  8   @  
-
- $     
-    
-  
-    -   = \   \                   E  8   @  
-
- $     
-     
-
-    .   A  d   d                   E  @   @  
-
- ,   $   
-      
-  
-    .    \   \               p    E  8   @  
-
- $     
-    
-  
-    .   ] \   \               p    E  8   @  
-
- $     
-    
-  
-    0   o d   d                   E  @   @  
-
- ,   $   
-       
-  
-    0   v \   \                   E  8   @  
-
- $     
-    
-  
-    0    \   \                   E  8   @  
-
- $     
-    
-  
-    2   x  @   @                          
-
-    2     @   @   :                          
-     
-    2           Ԁ           2     x   x   :                   E  T    @  
-
-                                                                   2           Ԁ           2   L-  @   @                          
-
-    2    3  @   @   :                          
-     
-    2   
-3        Ԁ           2   $6  x   x   :                   E  T    @  
-
-                                                                    2   ;        Ԁ           2   > |   |                    E  X   @  
-
- D   <  
-  !   
-
-  
-  "    
-  
-    2   2 \   \                   E  8   @  
-
- $     
-    
-  
-    2   { \   \                   E  8   @  
-
- $     
-    
-  
-    3     x   x   :                   E  T   @  
-
-                                                                  3           Ԁ           3     x   x   :                   E  T   @  
-
-                                                                   3           Ԁ           4     x   x   :                   E  T   @  
-
-                                                                  4           Ԁ           4     x   x   :                    E  T   @  
-
-                                                                   4           Ԁ           4   Q \   \                   E  8   @  
-
- $     
-    
-  
-    4   < \   \                   E  8   @  
-
- $     
-    
-  
-    4   5 d   d               0    E  @   @  
-
- ,   $   
-  #    
-  
-    5     x   x   :                    E  T   @  
-
-                                                                  5           Ԁ           5     x   x   :               @    E  T   @  
-
-                                                                   5           Ԁ           6     x   x   :                   E  T   @  
-
-                                                                  6           Ԁ           6     x   x   :               P    E  T   @  
-
-                                                                   6           Ԁ           6   c \   \                   E  8   @  
-
- $     
-    
-  
-    6   ] \   \                    E  8   @  
-
- $     
-    
-  
-    6   l3 d   d               `    E  @   @  
-
- ,   $   
-  $    
-  
-    7     x   x   :               0    E  T   @  
-
-                                                                  7           Ԁ           7     x   x   :               p    E  T   @  
-
-                                                                   7           Ԁ           7   k \   \                   E  8    @  
-
- $      
-  %   
-
-    8     x   x   :               @    E  T   @  
-
-                                                                  8           Ԁ           8     x   x   :                   E  T   @  
-
-                                                                   8           Ԁ           8   T \   \                   E  8   @  
-
- $     
-    
-  
-    8   & d   d                   E  @ !  @  
-
- ,   $ !  
-  &    
-  
-    8   ޢ \   \               P    E  8   @  
-
- $     
-    
-  
-    9     x   x   :               `    E  T   @  
-
-                                                                  9           Ԁ           9     x   x   :                   E  T   @  
-
-                                                                   9           Ԁ           :     x   x   :               p    E  T   @  
-
-                                                                  :           Ԁ           :     x   x   :                   E  T   @  
-
-                                                                   :           Ԁ           :   W d   d                   E  @ "  @  
-
- ,   $ "  
-  '    
-  
-    :    \   \                   E  8   @  
-
- $     
-    
-  
-    :   Љ \   \                   E  8   @  
-
- $     
-    
-  
-    ;     x   x   :                   E  T 	  @  
-
-      	                                                            ;           Ԁ           ;     x   x   :                   E  T 	  @  
-
-       	                                                            ;           Ԁ           <     x   x   :                   E  T 
-  @  
-
-      
-                                                            <           Ԁ           <     x   x   :                   E  T 
-  @  
-
-       
-                                                            <           Ԁ           <   %  \   \                   E  8   @  
-
- $     
-    
-  
-    <   % |   |                    E  X #  @  
-
- D   < # 
-  (   
-
-  
-  )    
-  
-    <   ' \   \                   E  8   @  
-
- $     
-    
-  
-    =     x   x   :                   E  T   @  
-
-                                                                  =           Ԁ           =     x   x   :                   E  T   @  
-
-                                                                   =           Ԁ           >     x   x   :                   E  T   @  
-
-                                                                  >           Ԁ           >     x   x   :                    E  T   @  
-
-                                                                   >           Ԁ           >    d   d               0    E  @ $  @  
-
- ,   $ $  
-  *    
-  
-    >   ` \   \                   E  8   @  
-
- $     
-    
-  
-    >   6 \   \                   E  8   @  
-
- $     
-    
-  
-    ?     x   x   :                   E  T   @  
-
-                                                                  ?           Ԁ           ?     x   x   :               @    E  T   @  
-
-                                                                   ?           Ԁ           @     x   x   :                    E  T   @  
-
-                                                                  @           Ԁ           @     x   x   :               P    E  T   @  
-
-                                                                   @           Ԁ           @   . \   \                    E  8    @  
-
- $      
-     
-  
-    @   x d   d               `    E  @ %  @  
-
- ,   $ %  
-  +    
-  
-    @   C \   \                   E  8    @  
-
- $      
-     
-  
-    A     x   x   :                    E  T   @  
-
-                                                                  A           Ԁ           A     x   x   :               p    E  T   @  
-
-                                                                   A           Ԁ           A   0_ \   \                   E  8 &  @  
-
- $    & 
-  ,   
-
-    B     x   x   :               0    E  T   @  
-
-                                                                  B           Ԁ           B     x   x   :                   E  T   @  
-
-                                                                   B           Ԁ           B     \   \                   E  8 !  @  
-
- $    ! 
-  !  
-  
-    B    \   \               @    E  8 !  @  
-
- $    ! 
-  !  
-  
-    B    d   d                   E  @ '  @  
-
- ,   $ '  
-  -    
-  
-    C     x   x   :               P    E  T   @  
-
-                                                                  C           Ԁ           C     x   x   :                   E  T   @  
-
-                                                                   C           Ԁ           D     x   x   :               `    E  T   @  
-
-                                                                  D           Ԁ           D     x   x   :                   E  T   @  
-
-                                                                   D           Ԁ           D     \   \                    E  8 "  @  
-
- $    " 
-  "  
-  
-    D   n d   d                   E  @ (  @  
-
- ,   $ (  
-  .    
-  
-    D   W \   \               p    E  8 "  @  
-
- $    " 
-  "  
-  
-    E     x   x   :                   E  T   @  
-
-                                                                  E           Ԁ           E     x   x   :                   E  T   @  
-
-                                                                   E           Ԁ           F     x   x   :                   E  T   @  
-
-                                                                  F           Ԁ           F     x   x   :                   E  T   @  
-
-                                                                   F           Ԁ           F   - \   \                   E  8 #  @  
-
- $    # 
-  #  
-  
-    F    \   \               0    E  8 #  @  
-
- $    # 
-  #  
-  
-    F   d |   |                    E  X )  @  
-
- D   < ) 
-  /   
-
-  
-  0    
-  
-    G     x   x   :                   E  T   @  
-
-                                                                  G           Ԁ           G     x   x   :                   E  T   @  
-
-                                                                   G           Ԁ           H     x   x   :                   E  T   @  
-
-                                                                  H           Ԁ           H     x   x   :                    E  T   @  
-
-                                                                   H           Ԁ           H   5 \   \               @    E  8 $  @  
-
- $    $ 
-  $  
-  
-    H    d   d               0    E  @ *  @  
-
- ,   $ *  
-  1    
-  
-    H    \   \                   E  8 $  @  
-
- $    $ 
-  $  
-  
-    I     x   x   :                   E  T   @  
-
-                                                                  I           Ԁ           I     x   x   :               @    E  T   @  
-
-                                                                   I           Ԁ           J     x   x   :                   E  T   @  
-
-                                                                  J           Ԁ           J     x   x   :               P    E  T   @  
-
-                                                                   J           Ԁ           J   \ d   d               `    E  @ +  @  
-
- ,   $ +  
-  2    
-  
-    J    \   \                    E  8 %  @  
-
- $    % 
-  %  
-  
-    J   _ \   \               P    E  8 %  @  
-
- $    % 
-  %  
-  
-    K     x   x   :                   E  T   @  
-
-                                                                  K           Ԁ           K     x   x   :               p    E  T   @  
-
-                                                                   K           Ԁ           K   @ \   \                   E  8 ,  @  
-
- $    , 
-  3   
-
-    L     x   x   :                    E  T   @  
-
-                                                                  L           Ԁ           L     x   x   :                   E  T   @  
-
-                                                                   L           Ԁ           L   ; \   \               `    E  8 &  @  
-
- $    & 
-  &  
-  
-    L   . \   \               0    E  8 &  @  
-
- $    & 
-  &  
-  
-    L    d   d                   E  @ -  @  
-
- ,   $ -  
-  4    
-  
-    M     x   x   :               @    E  T   @  
-
-                                                                  M           Ԁ           M     x   x   :                   E  T   @  
-
-                                                                   M           Ԁ           N     x   x   :               P    E  T   @  
-
-                                                                  N           Ԁ           N     x   x   :                   E  T   @  
-
-                                                                   N           Ԁ           N     d   d                   E  @ .  @  
-
- ,   $ .  
-  5    
-  
-    N    \   \               p    E  8 '  @  
-
- $    ' 
-  '  
-  
-    N   - \   \               `    E  8 '  @  
-
- $    ' 
-  '  
-  
-    O     x   x   :               p    E  T   @  
-
-                                                                  O           Ԁ           O     x   x   :                   E  T   @  
-
-                                                                   O           Ԁ           P     x   x   :                   E  T   @  
-
-                                                                  P           Ԁ           P     x   x   :                   E  T   @  
-
-                                                                   P           Ԁ           P    d   d                   E  @ (  @  
-
- ,   $ (  
-  (  
-  
-  
-    P    d   d                   E  @ (  @  
-
- ,   $ (  
-  (  
-  
-  
-    P   {I |   |                    E  X /  @  
-
- D   < / 
-  6   
-
-  
-  7    
-  
-    Q     x   x   :                   E  T   @  
-
-                                                                  Q           Ԁ           Q     x   x   :                   E  T   @  
-
-                                                                   Q           Ԁ           R     x   x   :                   E  T    @  
-
-                                                                   R           Ԁ           R     x   x   :                    E  T    @  
-
-                                                                    R           Ԁ           R   C d   d               0    E  @ 0  @  
-
- ,   $ 0  
-  8    
-  
-    R   x d   d                   E  @ )  @  
-
- ,   $ )  
-  )    
-  
-    R    d   d                   E  @ )  @  
-
- ,   $ )  
-  )    
-  
-    S     x   x   :                   E  T !  @  
-
-      !                                                            S           Ԁ           S     x   x   :               @    E  T !  @  
-
-       !                                                            S           Ԁ           T     x   x   :                   E  T "  @  
-
-      "                                                            T           Ԁ           T     x   x   :               P    E  T "  @  
-
-       "                                                            T           Ԁ           T    d   d                   E  @ *  @  
-
- ,   $ *  
-  *    
-  
-    T   9 d   d                   E  @ *  @  
-
- ,   $ *  
-  *    
-  
-    T    d   d               `    E  @ 1  @  
-
- ,   $ 1  
-  9    
-  
-    U     x   x   :                    E  T #  @  
-
-      #                                                            U           Ԁ           U     x   x   :               p    E  T #  @  
-
-       #                                                            U           Ԁ           U    \   \                   E  8 2  @  
-
- $    2 
-  :   
-
-    V     x   x   :                   E  T $  @  
-
-      $                                                            V           Ԁ           V     x   x   :                   E  T $  @  
-
-       $                                                            V           Ԁ           V   Q d   d                   E  @ 3  @  
-
- ,   $ 3  
-  ;    
-  
-    V   G d   d                    E  @ +  @  
-
- ,   $ +  
-  +    
-  
-    V   M d   d                   E  @ +  @  
-
- ,   $ +  
-  +    
-  
-    W     x   x   :               0    E  T %  @  
-
-      %                                                            W           Ԁ           W     x   x   :                   E  T %  @  
-
-       %                                                            W           Ԁ           X     x   x   :               @    E  T &  @  
-
-      &                                                            X           Ԁ           X     x   x   :                   E  T &  @  
-
-       &                                                            X           Ԁ           X    d   d                   E  @ ,  @  
-
- ,   $ ,  
-  ,    
-  
-    X   " d   d                   E  @ 4  @  
-
- ,   $ 4  
-  <    
-  
-    X   6 d   d               P    E  @ ,  @  
-
- ,   $ ,  
-  ,    
-  
-    Y     x   x   :               `    E  T '  @  
-
-      '                                                            Y           Ԁ           Y     x   x   :                   E  T '  @  
-
-       '                                                            Y           Ԁ           Z     x   x   :               p    E  T (  @  
-
-      (                                                            Z           Ԁ           Z     x   x   :                   E  T (  @  
-
-       (                                                            Z           Ԁ           Z     d   d                    E  @ 5  @  
-
- ,   $ 5  
-  =    
-  
-    Z   E d   d                   E  @ -  @  
-
- ,   $ -  
-  -    
-  
-    Z   j d   d                   E  @ -  @  
-
- ,   $ -  
-  -    
-  
-    [     x   x   :                   E  T )  @  
-
-      )                                                            [           Ԁ           [     x   x   :                   E  T )  @  
-
-       )                                                            [           Ԁ           \     x   x   :                   E  T *  @  
-
-      *                                                            \           Ԁ           \     x   x   :                    E  T *  @  
-
-       *                                                            \           Ԁ           \   Q  d   d                   E  @ .  @  
-
- ,   $ .  
-  .    
-  
-    \     d   d                   E  @ .  @  
-
- ,   $ .  
-  .    
-  
-    \   R d   d               0    E  @ 6  @  
-
- ,   $ 6  
-  >    
-  
-    ]     x   x   :                   E  T +  @  
-
-      +                                                            ]           Ԁ           ]     x   x   :               @    E  T +  @  
-
-       +                                                            ]           Ԁ           ^     x   x   :                   E  T ,  @  
-
-      ,                                                            ^           Ԁ           ^     x   x   :               P    E  T ,  @  
-
-       ,                                                            ^           Ԁ           ^     d   d                   E  @ /  @  
-
- ,   $ /  
-  /    
-  
-    ^   I d   d               `    E  @ 7  @  
-
- ,   $ 7  
-  ?    
-  
-    ^    d   d                   E  @ /  @  
-
- ,   $ /  
-  /    
-  
-    _     x   x   :                   E  T -  @  
-
-      -                                                            _           Ԁ           _     x   x   :               p    E  T -  @  
-
-       -                                                            _           Ԁ           `     x   x   :                    E  T .  @  
-
-      .                                                            `           Ԁ           `     x   x   :                   E  T .  @  
-
-       .                                                            `           Ԁ           `   d  d   d                   E  @ 0  @  
-
- ,   $ 0  
-  0    
-  
-    `   F3 d   d                   E  @ 8  @  
-
- ,   $ 8  
-  @    
-  
-    `    d   d                    E  @ 0  @  
-
- ,   $ 0  
-  0    
-  
-    a     x   x   :                    E  T /  @  
-
-      /                                                            a           Ԁ           a     x   x   :                   E  T /  @  
-
-       /                                                            a           Ԁ           b     x   x   :               0    E  T 0  @  
-
-      0                                                            b           Ԁ           b     x   x   :                   E  T 0  @  
-
-       0                                                            b           Ԁ           b    d   d                   E  @ 1  @  
-
- ,   $ 1  
-  1    
-  
-    b   p! d   d               @    E  @ 1  @  
-
- ,   $ 1  
-  1    
-  
-    b   T d   d                   E  @ 9  @  
-
- ,   $ 9  
-  A    
-  
-    c     x   x   :               P    E  T 1  @  
-
-      1                                                            c           Ԁ           c     x   x   :                   E  T 1  @  
-
-       1                                                            c           Ԁ           d     x   x   :               `    E  T 2  @  
-
-      2                                                            d           Ԁ           d     x   x   :                   E  T 2  @  
-
-       2                                                            d           Ԁ           d   
- d   d               p    E  @ 2  @  
-
- ,   $ 2  
-  2    
-  
-    d   v d   d                    E  @ 2  @  
-
- ,   $ 2  
-  2    
-  
-    d    d   d                   E  @ :  @  
-
- ,   $ :  
-  B    
-  
-    e     x   x   :                   E  T 3  @  
-
-      3                                                            e           Ԁ           e     x   x   :                    E  T 3  @  
-
-       3                                                            e           Ԁ           f     x   x   :                   E  T 4  @  
-
-      4                                                            f           Ԁ           f     x   x   :                   E  T 4  @  
-
-       4                                                            f           Ԁ           f   * d   d                   E  @ 3  @  
-
- ,   $ 3  
-  3    
-  
-    f    d   d               0    E  @ 3  @  
-
- ,   $ 3  
-  3    
-  
-    f    d   d                    E  @ ;  @  
-
- ,   $ ;  
-  C    
-  
-    g     x   x   :                   E  T 5  @  
-
-      5                                                            g           Ԁ           g     x   x   :               0    E  T 5  @  
-
-       5                                                            g           Ԁ           h     x   x   :                   E  T 6  @  
-
-      6                                                            h           Ԁ           h     x   x   :               @    E  T 6  @  
-
-       6                                                            h           Ԁ           h   d  d   d               @    E  @ 4  @  
-
- ,   $ 4  
-  4    
-  
-    h    d   d               P    E  @ <  @  
-
- ,   $ <  
-  D    
-  
-    h   	 d   d                   E  @ 4  @  
-
- ,   $ 4  
-  4    
-  
-    i     x   x   :                   E  T 7  @  
-
-      7                                                            i           Ԁ           i     x   x   :               `    E  T 7  @  
-
-       7                                                            i           Ԁ           j     x   x   :                   E  T 8  @  
-
-      8                                                            j           Ԁ           j     x   x   :               p    E  T 8  @  
-
-       8                                                            j           Ԁ           j    d   d               P    E  @ 5  @  
-
- ,   $ 5  
-  5    
-  
-    j   =j d   d                    E  @ 5  @  
-
- ,   $ 5  
-  5    
-  
-    j    d   d                   E  @ =  @  
-
- ,   $ =  
-  E    
-  
-    k     x   x   :                   E  T 9  @  
-
-      9                                                            k           Ԁ           k     x   x   :                   E  T 9  @  
-
-       9                                                            k           Ԁ           l     x   x   :                    E  T :  @  
-
-      :                                                            l           Ԁ           l     x   x   :                   E  T :  @  
-
-       :                                                            l           Ԁ           l    d   d               0    E  @ 6  @  
-
- ,   $ 6  
-  6    
-  
-    l   
- d   d               `    E  @ 6  @  
-
- ,   $ 6  
-  6    
-  
-    l   0 d   d                   E  @ >  @  
-
- ,   $ >  
-  F    
-  
-    m     x   x   :               @    E  T ;  @  
-
-      ;                                                            m           Ԁ           m     x   x   :                   E  T ;  @  
-
-       ;                                                            m           Ԁ           n     x   x   :               P    E  T <  @  
-
-      <                                                            n           Ԁ           n     x   x   :                   E  T <  @  
-
-       <                                                            n           Ԁ           n   M  d   d                   E  @ ?  @  
-
- ,   $ ?  
-  G    
-  
-    n   X d   d               `    E  @ 7  @  
-
- ,   $ 7  
-  7    
-  
-    n   R d   d               p    E  @ 7  @  
-
- ,   $ 7  
-  7    
-  
-    o     x   x   :               p    E  T =  @  
-
-      =                                                            o           Ԁ           o     x   x   :                   E  T =  @  
-
-       =                                                            o           Ԁ           p     x   x   :                   E  T >  @  
-
-      >                                                            p           Ԁ           p     x   x   :                    E  T >  @  
-
-       >                                                            p           Ԁ           p     d   d                   E  @ 8  @  
-
- ,   $ 8  
-  8    
-  
-    p   . d   d                   E  @ @  @  
-
- ,   $ @  
-  H    
-  
-    p   % d   d                   E  @ 8  @  
-
- ,   $ 8  
-  8    
-  
-    q     x   x   :                   E  T ?  @  
-
-      ?                                                            q           Ԁ           q     x   x   :                    E  T ?  @  
-
-       ?                                                            q           Ԁ           r     x   x   :                   E  T @  @  
-
-      @                                                            r           Ԁ           r     x   x   :               0    E  T @  @  
-
-       @                                                            r           Ԁ           r   D d   d               @    E  @ A  @  
-
- ,   $ A  
-  I    
-  
-    r    d   d                   E  @ 9  @  
-
- ,   $ 9  
-  9    
-  
-    r   * d   d                   E  @ 9  @  
-
- ,   $ 9  
-  9    
-  
-    s     x   x   :                   E  T A  @  
-
-      A                                                            s           Ԁ           s     x   x   :               P    E  T A  @  
-
-       A                                                            s           Ԁ           t     x   x   :                   E  T B  @  
-
-      B                                                            t           Ԁ           t     x   x   :               `    E  T B  @  
-
-       B                                                            t           Ԁ           t    d   d               p    E  @ B  @  
-
- ,   $ B  
-  J    
-  
-    t    d   d                   E  @ :  @  
-
- ,   $ :  
-  :    
-  
-    t   W d   d                   E  @ :  @  
-
- ,   $ :  
-  :    
-  
-    u     x   x   :                    E  T C  @  
-
-      C                                                            u           Ԁ           u     x   x   :                   E  T C  @  
-
-       C                                                            u           Ԁ           v     x   x   :                   E  T D  @  
-
-      D                                                            v           Ԁ           v     x   x   :                   E  T D  @  
-
-       D                                                            v           Ԁ           v   ף d   d                    E  @ ;  @  
-
- ,   $ ;  
-  ;    
-  
-    v   r d   d                   E  @ C  @  
-
- ,   $ C  
-  K    
-  
-    v   - d   d                   E  @ ;  @  
-
- ,   $ ;  
-  ;    
-  
-    w     x   x   :               0    E  T E  @  
-
-      E                                                            w           Ԁ           w     x   x   :                   E  T E  @  
-
-       E                                                            w           Ԁ           x     x   x   :               @    E  T F  @  
-
-      F                                                            x           Ԁ           x     x   x   :                   E  T F  @  
-
-       F                                                            x           Ԁ           x   ^ d   d                   E  @ <  @  
-
- ,   $ <  
-  <    
-  
-    x   3 d   d               P    E  @ <  @  
-
- ,   $ <  
-  <    
-  
-    x   n* d   d                   E  @ D  @  
-
- ,   $ D  
-  L    
-  
-    y     x   x   :               `    E  T G  @  
-
-      G                                                            y           Ԁ           y     x   x   :                   E  T G  @  
-
-       G                                                            y           Ԁ           z     x   x   :               p    E  T H  @  
-
-      H                                                            z           Ԁ           z     x   x   :                   E  T H  @  
-
-       H                                                            z           Ԁ           z   * d   d                   E  @ =  @  
-
- ,   $ =  
-  =    
-  
-    z   L d   d                	    E  @ E  @  
-
- ,   $ E  
-  M    
-  
-    |   0  d   d                   E  @ >  @  
-
- ,   $ >  
-  >    
-  
-    |   X d   d               	    E  @ F  @  
-
- ,   $ F  
-  N    
-  
-    ~   @  d   d                   E  @ ?  @  
-
- ,   $ ?  
-  ?    
-  
-    ~   k> d   d                	    E  @ G  @  
-
- ,   $ G  
-  O    
-  
-       k  @   @   :                           
-     
-               Ԁ              >  @   @                          
-
-       >  @   @   :               0	           
-     
-       B        Ԁ              cH  x   x   :                    E  T M  ?  
-
-      M                                                               mH        Ԁ              k  @   @               @	           
-
-       >q  @   @   :               0           
-     
-       Hq        Ԁ              u  x   x   :               P	    E  T I  @  
-
-       M                                                               z        Ԁ                @   @               @           
-
-       ɛ        Ԁ              ߠ  x   x   :               P    E  T I  ?  
-
-       M                                                                       Ԁ              m
-  x   x   :               `    E  T N  ?  
-
-      N                                                               w
-        Ԁ                x   x   :               `	    E  T J  @  
-
-       N                                                                       Ԁ                x   x   :               p    E  T J  ?  
-
-       N                                                               } d   d                   E  @ @  @  
-
- ,   $ @  
-  @    
-  
-       8 d   d               p	    E  @ H  @  
-
- ,   $ H  
-  P  
-  
-  
-               Ԁ              m
-  x   x   :                   E  T O  ?  
-
-      O                                                               w
-        Ԁ                x   x   :               	    E  T K  @  
-
-       O                                                                       Ԁ              "  x   x   :                   E  T K  ?  
-
-       O                                                                       Ԁ              m
-  x   x   :                   E  T P  ?  
-
-      P                                                               w
-        Ԁ                x   x   :               	    E  T L  @  
-
-       P                                                                       Ԁ                x   x   :                   E  T L  ?  
-
-       P                                                               R d   d               	    E  @ I  @  
-
- ,   $ I  
-  Q  
-  
-  
-       z |   |                   E  X A  @  
-
- D   < A 
-  A   
-
-  
-  B    
-  
-               Ԁ              m
-  x   x   :                   E  T Q  ?  
-
-      Q                                                               w
-        Ԁ                x   x   :               	    E  T M  @  
-
-       Q                                                                       Ԁ                x   x   :                   E  T M  ?  
-
-       Q                                                                       Ԁ              m
-  x   x   :                    E  T R  ?  
-
-      R                                                               w
-        Ԁ                x   x   :               	    E  T N  @  
-
-       R                                                                       Ԁ              F  x   x   :                   E  T N  ?  
-
-       R                                                                d   d               	    E  @ J  @  
-
- ,   $ J  
-  R  
-  
-  
-       ?| d   d                    E  @ B  @  
-
- ,   $ B  
-  C    
-  
-               Ԁ              m
-  x   x   :               0    E  T S  ?  
-
-      S                                                               w
-        Ԁ                x   x   :               	    E  T O  @  
-
-       S                                                                       Ԁ                x   x   :               @    E  T O  ?  
-
-       S                                                                       Ԁ              m
-  x   x   :               P    E  T T  ?  
-
-      T                                                               w
-        Ԁ                x   x   :               	    E  T P  @  
-
-       T                                                                       Ԁ              6  x   x   :               `    E  T P  ?  
-
-       T                                                                d   d               p    E  @ C  @  
-
- ,   $ C  
-  D    
-  
-        \   \                
-    E  8 K  @  
-
- $    K 
-  S  
-  
-               Ԁ              m
-  x   x   :                   E  T U  ?  
-
-      U                                                               w
-        Ԁ                x   x   :               
-    E  T Q  @  
-
-       U                                                                       Ԁ                x   x   :                   E  T Q  ?  
-
-       U                                                               qT  \   \                   E  8 D  @  
-
- $    D 
-  E   
-
-               Ԁ                \   \                
-    E  8 L  @  
-
- $    L 
-  T  
-  
-         x   x   :                   E  T V  ?  
-
-      V                                                                       Ԁ              /  x   x   :               0
-    E  T R  @  
-
-       V                                                                       Ԁ              T  x   x   :                   E  T R  ?  
-
-       V                                                               oG d   d                   E  @ E  @  
-
- ,   $ E  
-  F    
-  
-               Ԁ              m
-  x   x   :                   E  T W  ?  
-
-      W                                                               w
-        Ԁ                x   x   :               @
-    E  T S  @  
-
-       W                                                                       Ԁ              r  x   x   :                   E  T S  ?  
-
-       W                                                                       Ԁ              m
-  x   x   :                    E  T X  ?  
-
-      X                                                               w
-        Ԁ                x   x   :               P
-    E  T T  @  
-
-       X                                                                       Ԁ              6  x   x   :                   E  T T  ?  
-
-       X                                                                d   d                    E  @ F  @  
-
- ,   $ F  
-  G    
-  
-        \   \               `
-    E  8 M  @  
-
- $    M 
-  U  
-  
-               Ԁ              m
-  x   x   :               0    E  T Y  ?  
-
-      Y                                                               w
-        Ԁ                x   x   :               p
-    E  T U  @  
-
-       Y                                                                       Ԁ                x   x   :               @    E  T U  ?  
-
-       Y                                                                       Ԁ              m
-  x   x   :               P    E  T Z  ?  
-
-      Z                                                               w
-        Ԁ                x   x   :               
-    E  T V  @  
-
-       Z                                                                       Ԁ              J  x   x   :               `    E  T V  ?  
-
-       Z                                                                 \   \               
-    E  8 N  @  
-
- $    N 
-  V  
-  
-       h |   |               p    E  X G  @  
-
- D   < G 
-  H   
-
-  
-  I    
-  
-               Ԁ              m
-  x   x   :                   E  T [  ?  
-
-      [                                                               w
-        Ԁ                x   x   :               
-    E  T W  @  
-
-       [                                                                       Ԁ              N  x   x   :                   E  T W  ?  
-
-       [                                                                       Ԁ              m
-  x   x   :                   E  T \  ?  
-
-      \                                                               w
-        Ԁ                x   x   :               
-    E  T X  @  
-
-       \                                                                       Ԁ                x   x   :                   E  T X  ?  
-
-       \                                                               <d  \   \               
-    E  8 O  @  
-
- $    O 
-  W  
-  
-       ^7 d   d                   E  @ H  @  
-
- ,   $ H  
-  J    
-  
-               Ԁ              m
-  x   x   :                   E  T ]  ?  
-
-      ]                                                               w
-        Ԁ                x   x   :               
-    E  T Y  @  
-
-       ]                                                                       Ԁ              &  x   x   :                   E  T Y  ?  
-
-       ]                                                                       Ԁ              m
-  x   x   :                   E  T ^  ?  
-
-      ^                                                               w
-        Ԁ                x   x   :               
-    E  T Z  @  
-
-       ^                                                                       Ԁ                x   x   :                    E  T Z  ?  
-
-       ^                                                               I  d   d                   E  @ I  @  
-
- ,   $ I  
-  K    
-  
-        \   \               
-    E  8 P  @  
-
- $    P 
-  X  
-  
-               Ԁ              m
-  x   x   :                    E  T _  ?  
-
-      _                                                               w
-        Ԁ                x   x   :                    E  T [  @  
-
-       _                                                                       Ԁ                x   x   :               0    E  T [  ?  
-
-       _                                                               k \   \               @    E  8 J  @  
-
- $    J 
-  L   
-
-               Ԁ              m
-  x   x   :               P    E  T `  ?  
-
-      `                                                               w
-        Ԁ                x   x   :                   E  T \  @  
-
-       `                                                                       Ԁ                x   x   :               `    E  T \  ?  
-
-       `                                                               j \   \                    E  8 Q  @  
-
- $    Q 
-  Y  
-  
-       - d   d               p    E  @ K  @  
-
- ,   $ K  
-  M    
-  
-               Ԁ              m
-  x   x   :                   E  T a  ?  
-
-      a                                                               w
-        Ԁ                x   x   :               0    E  T ]  @  
-
-       a                                                                       Ԁ              c  x   x   :                   E  T ]  ?  
-
-       a                                                                       Ԁ              m
-  x   x   :                   E  T b  ?  
-
-      b                                                               w
-        Ԁ                x   x   :               @    E  T ^  @  
-
-       b                                                                       Ԁ                x   x   :                   E  T ^  ?  
-
-       b                                                               b7 d   d                   E  @ L  @  
-
- ,   $ L  
-  N    
-  
-        \   \               P    E  8 R  @  
-
- $    R 
-  Z  
-  
-               Ԁ              m
-  x   x   :                   E  T c  ?  
-
-      c                                                               w
-        Ԁ                x   x   :               `    E  T _  @  
-
-       c                                                                       Ԁ              7  x   x   :                   E  T _  ?  
-
-       c                                                                       Ԁ              m
-  x   x   :                   E  T d  ?  
-
-      d                                                               w
-        Ԁ                x   x   :               p    E  T `  @  
-
-       d                                                                       Ԁ                x   x   :                    E  T `  ?  
-
-       d                                                               s' |   |                   E  X M  @  
-
- D   < M 
-  O   
-
-  
-  P    
-  
-         \   \                   E  8 S  @  
-
- $    S 
-  [  
-  
-               Ԁ              m
-  x   x   :                    E  T e  ?  
-
-      e                                                               w
-        Ԁ                x   x   :                   E  T a  @  
-
-       e                                                                       Ԁ              c  x   x   :               0    E  T a  ?  
-
-       e                                                                       Ԁ              m
-  x   x   :               @    E  T f  ?  
-
-      f                                                               w
-        Ԁ                x   x   :                   E  T b  @  
-
-       f                                                                       Ԁ              #  x   x   :               P    E  T b  ?  
-
-       f                                                               ~  \   \                   E  8 T  @  
-
- $    T 
-  \  
-  
-        d   d               `    E  @ N  @  
-
- ,   $ N  
-  Q    
-  
-               Ԁ              m
-  x   x   :               p    E  T g  ?  
-
-      g                                                               w
-        Ԁ                x   x   :                   E  T c  @  
-
-       g                                                                       Ԁ              o  x   x   :                   E  T c  ?  
-
-       g                                                                       Ԁ              m
-  x   x   :                   E  T h  ?  
-
-      h                                                               w
-        Ԁ                x   x   :                   E  T d  @  
-
-       h                                                                       Ԁ                x   x   :                   E  T d  ?  
-
-       h                                                               <  d   d                   E  @ O  @  
-
- ,   $ O  
-  R    
-  
-       Os \   \                   E  8 U  @  
-
- $    U 
-  ]  
-  
-               Ԁ              m
-  x   x   :                   E  T i  ?  
-
-      i                                                               w
-        Ԁ                x   x   :                   E  T e  @  
-
-       i                                                                       Ԁ                x   x   :                   E  T e  ?  
-
-       i                                                                \   \                   E  8 P  @  
-
- $    P 
-  S   
-
-               Ԁ              m
-  x   x   :                   E  T j  ?  
-
-      j                                                               w
-        Ԁ                x   x   :                    E  T f  @  
-
-       j                                                                       Ԁ              7  x   x   :                	    E  T f  ?  
-
-       j                                                                d   d               	    E  @ Q  @  
-
- ,   $ Q  
-  T    
-  
-       + \   \                   E  8 V  @  
-
- $    V 
-  ^  
-  
-               Ԁ              m
-  x   x   :                	    E  T k  ?  
-
-      k                                                               w
-        Ԁ                x   x   :                    E  T g  @  
-
-       k                                                                       Ԁ                x   x   :               0	    E  T g  ?  
-
-       k                                                                       Ԁ              m
-  x   x   :               @	    E  T l  ?  
-
-      l                                                               w
-        Ԁ                x   x   :               0    E  T h  @  
-
-       l                                                                       Ԁ                x   x   :               P	    E  T h  ?  
-
-       l                                                               4- \   \               @    E  8 W  @  
-
- $    W 
-  _  
-  
-       z d   d               `	    E  @ R  @  
-
- ,   $ R  
-  U    
-  
-               Ԁ              m
-  x   x   :               p	    E  T m  ?  
-
-      m                                                               w
-        Ԁ                x   x   :               P    E  T i  @  
-
-       m                                                                       Ԁ              7  x   x   :               	    E  T i  ?  
-
-       m                                                                       Ԁ              m
-  x   x   :               	    E  T n  ?  
-
-      n                                                               w
-        Ԁ                x   x   :               `    E  T j  @  
-
-       n                                                                       Ԁ                x   x   :               	    E  T j  ?  
-
-       n                                                               E |   |               	    E  X S  @  
-
- D   < S 
-  V   
-
-  
-  W    
-  
-       _ \   \               p    E  8 X  @  
-
- $    X 
-  `  
-  
-               Ԁ              m
-  x   x   :               	    E  T o  ?  
-
-      o                                                               w
-        Ԁ                x   x   :                   E  T k  @  
-
-       o                                                                       Ԁ                x   x   :               	    E  T k  ?  
-
-       o                                                                       Ԁ              m
-  x   x   :               	    E  T p  ?  
-
-      p                                                               w
-        Ԁ                x   x   :                   E  T l  @  
-
-       p                                                                       Ԁ              c  x   x   :               	    E  T l  ?  
-
-       p                                                               E \   \                   E  8 Y  @  
-
- $    Y 
-  a  
-  
-       0 d   d                
-    E  @ T  @  
-
- ,   $ T  
-  X    
-  
-               Ԁ              m
-  x   x   :               
-    E  T q  ?  
-
-      q                                                               w
-        Ԁ                x   x   :                   E  T m  @  
-
-       q                                                                       Ԁ              w  x   x   :                
-    E  T m  ?  
-
-       q                                                                       Ԁ              m
-  x   x   :               0
-    E  T r  ?  
-
-      r                                                               w
-        Ԁ                x   x   :                   E  T n  @  
-
-       r                                                                       Ԁ                x   x   :               @
-    E  T n  ?  
-
-       r                                                                d   d               P
-    E  @ U  @  
-
- ,   $ U  
-  Y    
-  
-       Mg \   \                   E  8 Z  @  
-
- $    Z 
-  b  
-  
-               Ԁ              m
-  x   x   :               `
-    E  T s  ?  
-
-      s                                                               w
-        Ԁ                x   x   :                   E  T o  @  
-
-       s                                                                       Ԁ              _  x   x   :               p
-    E  T o  ?  
-
-       s                                                               f \   \               
-    E  8 V  @  
-
- $    V 
-  Z   
-
-               Ԁ              m
-  x   x   :               
-    E  T t  ?  
-
-      t                                                               w
-        Ԁ                x   x   :                   E  T p  @  
-
-       t                                                                       Ԁ              O  x   x   :               
-    E  T p  ?  
-
-       t                                                                \   \                    E  8 [  @  
-
- $    [ 
-  c  
-  
-       H4 d   d               
-    E  @ W  @  
-
- ,   $ W  
-  [    
-  
-               Ԁ              m
-  x   x   :               
-    E  T u  ?  
-
-      u                                                               w
-        Ԁ                x   x   :                   E  T q  @  
-
-       u                                                                       Ԁ                x   x   :               
-    E  T q  ?  
-
-       u                                                                       Ԁ              m
-  x   x   :               
-    E  T v  ?  
-
-      v                                                               w
-        Ԁ                x   x   :                    E  T r  @  
-
-       v                                                                       Ԁ                x   x   :               
-    E  T r  ?  
-
-       v                                                               L \   \               0    E  8 \  @  
-
- $    \ 
-  d  
-  
-        d   d                    E  @ X  @  
-
- ,   $ X  
-  \    
-  
-               Ԁ              m
-  x   x   :                   E  T w  ?  
-
-      w                                                               w
-        Ԁ                x   x   :               @    E  T s  @  
-
-       w                                                                       Ԁ              G  x   x   :                    E  T s  ?  
-
-       w                                                                       Ԁ              m
-  x   x   :               0    E  T x  ?  
-
-      x                                                               w
-        Ԁ                x   x   :               P    E  T t  @  
-
-       x                                                                       Ԁ                x   x   :               @    E  T t  ?  
-
-       x                                                               h=  |   |               P    E  X Y  @  
-
- D   < Y 
-  ]   
-
-  
-  ^    
-  
-        \   \               `    E  8 ]  @  
-
- $    ] 
-  e  
-  
-               Ԁ              m
-  x   x   :               `    E  T y  ?  
-
-      y                                                               w
-        Ԁ                x   x   :               p    E  T u  @  
-
-       y                                                                       Ԁ              K  x   x   :               p    E  T u  ?  
-
-       y                                                                       Ԁ              m
-  x   x   :                   E  T z  ?  
-
-      z                                                               w
-        Ԁ                x   x   :                   E  T v  @  
-
-       z                                                                       Ԁ                x   x   :                   E  T v  ?  
-
-       z                                                               UZ d   d                   E  @ Z  @  
-
- ,   $ Z  
-  _    
-  
-        \   \                   E  8 ^  @  
-
- $    ^ 
-  f  
-  
-               Ԁ              m
-  x   x   :                   E  T {  ?  
-
-      {                                                               w
-        Ԁ                x   x   :                   E  T w  @  
-
-       {                                                                       Ԁ                x   x   :                   E  T w  ?  
-
-       {                                                                       Ԁ                \   \                   E  8 _  @  
-
- $    _ 
-  g  
-  
-       +  x   x   :                   E  T |  ?  
-
-      |                                                               5        Ԁ                x   x   :                   E  T x  @  
-
-       |                                                               S        Ԁ              ]   x   x   :                   E  T x  ?  
-
-       |                                                               Y d   d                   E  @ [  @  
-
- ,   $ [  
-  `    
-  
-               Ԁ              m
-  x   x   :                    E  T }  ?  
-
-      }                                                               w
-        Ԁ                x   x   :                   E  T y  @  
-
-       }                                                                       Ԁ              #  x   x   :                   E  T y  ?  
-
-       }                                                                \   \                    E  8 \  @  
-
- $    \ 
-  a   
-
-               Ԁ              m
-  x   x   :               0    E  T ~  ?  
-
-      ~                                                               w
-        Ԁ                x   x   :                   E  T z  @  
-
-       ~                                                                       Ԁ                x   x   :               @    E  T z  ?  
-
-       ~                                                               y d   d               P    E  @ ]  @  
-
- ,   $ ]  
-  b    
-  
-       T \   \                   E  8 `  @  
-
- $    ` 
-  h  
-  
-               Ԁ              m
-  x   x   :               `    E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                    E  T {  @  
-
-                                                                              Ԁ                x   x   :               p    E  T {  ?  
-
-                                                                              Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T |  @  
-
-                                                                              Ԁ              G  x   x   :                   E  T |  ?  
-
-                                                                       d   d                   E  @ ^  @  
-
- ,   $ ^  
-  c    
-  
-       /6 \   \                    E  8 a  @  
-
- $    a 
-  i  
-  
-               Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :               0    E  T }  @  
-
-                                                                              Ԁ              _  x   x   :                   E  T }  ?  
-
-                                                                              Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :               @    E  T ~  @  
-
-                                                                              Ԁ              7  x   x   :                   E  T ~  ?  
-
-                                                                       |   |                   E  X _  @  
-
- D   < _ 
-  d   
-
-  
-  e    
-  
-        \   \               P    E  8 b  @  
-
- $    b 
-  j  
-  
-               Ԁ              m
-  x   x   :                    E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :               `    E  T   @  
-
-                                                                              Ԁ              s  x   x   :                   E  T   ?  
-
-                                                                              Ԁ              m
-  x   x   :                    E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :               p    E  T   @  
-
-                                                                              Ԁ                x   x   :               0    E  T   ?  
-
-                                                                       \   \                   E  8 c  @  
-
- $    c 
-  k  
-  
-       ɟ d   d               @    E  @ `  @  
-
- ,   $ `  
-  f    
-  
-               Ԁ              m
-  x   x   :               P    E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ              '  x   x   :               `    E  T   ?  
-
-                                                                              Ԁ              m
-  x   x   :               p    E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ                x   x   :                   E  T   ?  
-
-                                                                       d   d                   E  @ a  @  
-
- ,   $ a  
-  g    
-  
-        \   \                   E  8 d  @  
-
- $    d 
-  l  
-  
-               Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ              K  x   x   :                   E  T   ?  
-
-                                                                      aQ \   \                   E  8 b  @  
-
- $    b 
-  h   
-
-               Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ                x   x   :                   E  T   ?  
-
-                                                                      `  d   d                   E  @ c  @  
-
- ,   $ c  
-  i    
-  
-       ! \   \                   E  8 e  @  
-
- $    e 
-  m  
-  
-               Ԁ              m
-  x   x   :                    E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ              m
-  x   x   :                    E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                    E  T   @  
-
-                                                                              Ԁ              ;  x   x   :               0    E  T   ?  
-
-                                                                      f \   \                   E  8 f  @  
-
- $    f 
-  n  
-  
-       % d   d               @    E  @ d  @  
-
- ,   $ d  
-  j    
-  
-               Ԁ              m
-  x   x   :               P    E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                    E  T   @  
-
-                                                                              Ԁ              7  x   x   :               `    E  T   ?  
-
-                                                                              Ԁ              m
-  x   x   :               p    E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :               0    E  T   @  
-
-                                                                              Ԁ              #  x   x   :                   E  T   ?  
-
-                                                                       |   |                   E  X e  @  
-
- D   < e 
-  k   
-
-  
-  l    
-  
-        \   \               @    E  8 g  @  
-
- $    g 
-  o  
-  
-               Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :               P    E  T   @  
-
-                                                                              Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :               `    E  T   @  
-
-                                                                              Ԁ                x   x   :                   E  T   ?  
-
-                                                                      ? d   d                   E  @ f  @  
-
- ,   $ f  
-  m    
-  
-        \   \               p    E  8 h  @  
-
- $    h 
-  p  
-  
-               Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ                x   x   :                    E  T   ?  
-
-                                                                              Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ                x   x   :                    E  T   ?  
-
-                                                                       \   \                   E  8 i  @  
-
- $    i 
-  q  
-  
-       | d   d               0    E  @ g  @  
-
- ,   $ g  
-  n    
-  
-               Ԁ              m
-  x   x   :               @    E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ                x   x   :               P    E  T   ?  
-
-                                                                      4 \   \               `    E  8 h  @  
-
- $    h 
-  o   
-
-               Ԁ              m
-  x   x   :               p    E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ                x   x   :                   E  T   ?  
-
-                                                                      N d   d                   E  @ i  @  
-
- ,   $ i  
-  p    
-  
-        \   \                   E  8 j  @  
-
- $    j 
-  r  
-  
-               Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ              K  x   x   :                   E  T   ?  
-
-                                                                              Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ              _  x   x   :                   E  T   ?  
-
-                                                                       \   \                    E  8 k  @  
-
- $    k 
-  s  
-  
-       $ d   d                   E  @ j  @  
-
- ,   $ j  
-  q    
-  
-               Ԁ              m
-  x   x   :                   E  T   ?  
-
-                                                                     w
-        Ԁ                x   x   :                   E  T   @  
-
-                                                                              Ԁ                x   x   :                    E  T   ?  
-
-                                                                   
\ No newline at end of file
diff -Naur ns-3.23/src/olsr/test/bug780-2-0.pcap ns-3.24/src/olsr/test/bug780-2-0.pcap
--- ns-3.23/src/olsr/test/bug780-2-0.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/bug780-2-0.pcap	1969-12-31 16:00:00.000000000 -0800
@@ -1,2453 +0,0 @@
-ò            i       yv T   T                     E  0    @  
-
-       
-             eW T   T                     E  0    @  
-
-       
-             d   d                    E  @   @  
-
- ,   $   
-      
-  
-       # \   \                    E  8   @  
-
- $     
-      
-       B d   d                     E  @   @  
-
- ,   $   
-      
-  
-       m \   \                     E  8   @  
-
- $     
-      
-        d   d               0     E  @   @  
-
- ,   $   
-      
-  
-       V- \   \               0     E  8   @  
-
- $     
-    
-  
-       F d   d               @     E  @   @  
-
- ,   $   
-      
-  
-        \   \               @     E  8   @  
-
- $     
-    
-  
-    
-   B9 |   |               P     E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-    
-   ^ \   \               P     E  8   @  
-
- $     
-    
-  
-        \   \               `     E  8   @  
-
- $     
-    
-  
-        d   d               `     E  @   @  
-
- ,   $   
-      
-  
-       ێ \   \               p     E  8   @  
-
- $     
-    
-  
-       8c d   d               p     E  @   @  
-
- ,   $   
-      
-  
-        \   \                    E  8   @  
-
- $     
-  	   
-
-         \   \                    E  8   @  
-
- $     
-    
-  
-        d   d                    E  @ 	  @  
-
- ,   $ 	  
-  
-    
-  
-       { \   \                    E  8 	  @  
-
- $    	 
-  	  
-  
-       2 d   d                    E  @ 
-  @  
-
- ,   $ 
-  
-      
-  
-        \   \                    E  8 
-  @  
-
- $    
- 
-  
-  
-  
-        |   |                    E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-        \   \                    E  8   @  
-
- $     
-    
-  
-       O d   d                    E  @   @  
-
- ,   $   
-      
-  
-       p  d   d                    E  @   @  
-
- ,   $   
-      
-  
-        \   \                    E  8   @  
-
- $     
-    
-  
-       qI \   \                    E  8   @  
-
- $     
-     
-
-       ~ \   \                    E  8   @  
-
- $     
-    
-  
-        d   d                    E  @   @  
-
- ,   $   
-      
-  
-        \   \                    E  8   @  
-
- $     
-    
-  
-       S d   d                    E  @   @  
-
- ,   $   
-      
-  
-       a \   \                    E  8   @  
-
- $     
-    
-  
-       W |   |                   E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-        Qk d   d                    E  @   @  
-
- ,   $   
-      
-  
-        | \   \                    E  8   @  
-
- $     
-    
-  
-    "   #  d   d               0    E  @   @  
-
- ,   $   
-      
-  
-    "     \   \                   E  8   @  
-
- $     
-    
-  
-    #   * \   \               @    E  8   @  
-
- $     
-     
-
-    $   eq d   d               P    E  @   @  
-
- ,   $   
-      
-  
-    $    \   \                    E  8   @  
-
- $     
-    
-  
-    &     d   d               `    E  @   @  
-
- ,   $   
-      
-  
-    &    \   \               0    E  8   @  
-
- $     
-    
-  
-    (    \   \               @    E  8   @  
-
- $     
-    
-  
-    (   ˆ |   |               p    E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-    *    d   d                   E  @   @  
-
- ,   $   
-      
-  
-    *   -| \   \               P    E  8   @  
-
- $     
-    
-  
-    ,    \   \               `    E  8   @  
-
- $     
-    
-  
-    ,   b d   d                   E  @   @  
-
- ,   $   
-      
-  
-    -    \   \                   E  8   @  
-
- $     
-     
-
-    .   D  d   d                   E  @   @  
-
- ,   $   
-      
-  
-    .   Y \   \               p    E  8   @  
-
- $     
-    
-  
-    0   s d   d                   E  @   @  
-
- ,   $   
-       
-  
-    0    \   \                   E  8   @  
-
- $     
-    
-  
-    2   k  @   @   :                          
-     
-    2           Ԁ           2   0  @   @                          
-
-    2   :4        Ԁ           2   :  x   x   :                   E  T    @  
-
-                                                                    2   B |   |                    E  X   @  
-
- D   <  
-  !   
-
-  
-  "    
-  
-    2   . \   \                   E  8   @  
-
- $     
-    
-  
-    3           Ԁ           3   m
-  x   x   :                   E  T   @  
-
-                                                                   4           Ԁ           4   m
-  x   x   :                    E  T   @  
-
-                                                                   4    \   \                   E  8   @  
-
- $     
-    
-  
-    4   8 d   d               0    E  @   @  
-
- ,   $   
-  #    
-  
-    5           Ԁ           5   m
-  x   x   :               @    E  T   @  
-
-                                                                   6           Ԁ           6   m
-  x   x   :               P    E  T   @  
-
-                                                                   6   X` \   \                   E  8   @  
-
- $     
-    
-  
-    6   M7 d   d               `    E  @   @  
-
- ,   $   
-  $    
-  
-    7           Ԁ           7   m
-  x   x   :               p    E  T   @  
-
-                                                                   7    \   \                   E  8    @  
-
- $      
-  %   
-
-    8           Ԁ           8   m
-  x   x   :                   E  T   @  
-
-                                                                   8   { \   \                   E  8   @  
-
- $     
-    
-  
-    8    d   d                   E  @ !  @  
-
- ,   $ !  
-  &    
-  
-    9           Ԁ           9   m
-  x   x   :                   E  T   @  
-
-                                                                   :           Ԁ           :   m
-  x   x   :                   E  T   @  
-
-                                                                   :   x[ d   d                   E  @ "  @  
-
- ,   $ "  
-  '    
-  
-    :   B \   \                   E  8   @  
-
- $     
-    
-  
-    ;           Ԁ           ;   m
-  x   x   :                   E  T 	  @  
-
-       	                                                            <           Ԁ           <   m
-  x   x   :                   E  T 
-  @  
-
-       
-                                                            <     \   \                   E  8   @  
-
- $     
-    
-  
-    <   Ɖ |   |                    E  X #  @  
-
- D   < # 
-  (   
-
-  
-  )    
-  
-    =           Ԁ           =   m
-  x   x   :                   E  T   @  
-
-                                                                   >           Ԁ           >   m
-  x   x   :                    E  T   @  
-
-                                                                   >   q d   d               0    E  @ $  @  
-
- ,   $ $  
-  *    
-  
-    >    \   \                   E  8   @  
-
- $     
-    
-  
-    ?           Ԁ           ?   m
-  x   x   :               @    E  T   @  
-
-                                                                   @           Ԁ           @   m
-  x   x   :               P    E  T   @  
-
-                                                                   @    \   \                    E  8    @  
-
- $      
-     
-  
-    @   Y d   d               `    E  @ %  @  
-
- ,   $ %  
-  +    
-  
-    A           Ԁ           A   m
-  x   x   :               p    E  T   @  
-
-                                                                   A   b \   \                   E  8 &  @  
-
- $    & 
-  ,   
-
-    B           Ԁ           B   m
-  x   x   :                   E  T   @  
-
-                                                                   B   ! \   \                   E  8 !  @  
-
- $    ! 
-  !  
-  
-    B    d   d                   E  @ '  @  
-
- ,   $ '  
-  -    
-  
-    C           Ԁ           C   m
-  x   x   :                   E  T   @  
-
-                                                                   D           Ԁ           D   m
-  x   x   :                   E  T   @  
-
-                                                                   D     \   \                    E  8 "  @  
-
- $    " 
-  "  
-  
-    D   q d   d                   E  @ (  @  
-
- ,   $ (  
-  .    
-  
-    E           Ԁ           E   m
-  x   x   :                   E  T   @  
-
-                                                                   F           Ԁ           F   m
-  x   x   :                   E  T   @  
-
-                                                                   F   F \   \               0    E  8 #  @  
-
- $    # 
-  #  
-  
-    F   mi |   |                    E  X )  @  
-
- D   < ) 
-  /   
-
-  
-  0    
-  
-    G           Ԁ           G   m
-  x   x   :                   E  T   @  
-
-                                                                   H           Ԁ           H   m
-  x   x   :                    E  T   @  
-
-                                                                   H   j1 \   \               @    E  8 $  @  
-
- $    $ 
-  $  
-  
-    H   q d   d               0    E  @ *  @  
-
- ,   $ *  
-  1    
-  
-    I           Ԁ           I   m
-  x   x   :               @    E  T   @  
-
-                                                                   J           Ԁ           J   m
-  x   x   :               P    E  T   @  
-
-                                                                   J   < d   d               `    E  @ +  @  
-
- ,   $ +  
-  2    
-  
-    J   Z\ \   \               P    E  8 %  @  
-
- $    % 
-  %  
-  
-    K           Ԁ           K   m
-  x   x   :               p    E  T   @  
-
-                                                                   K    \   \                   E  8 ,  @  
-
- $    , 
-  3   
-
-    L           Ԁ           L   m
-  x   x   :                   E  T   @  
-
-                                                                   L    \   \               `    E  8 &  @  
-
- $    & 
-  &  
-  
-    L    d   d                   E  @ -  @  
-
- ,   $ -  
-  4    
-  
-    M           Ԁ           M   m
-  x   x   :                   E  T   @  
-
-                                                                   N     x   x   :               P    E  T   @  
-
-                                                                  N           Ԁ           N   m
-  x   x   :                   E  T   @  
-
-                                                                   N           Ԁ           N     d   d                   E  @ .  @  
-
- ,   $ .  
-  5    
-  
-    N   A \   \               p    E  8 '  @  
-
- $    ' 
-  '  
-  
-    N   . \   \               `    E  8 '  @  
-
- $    ' 
-  '  
-  
-    O     x   x   :               p    E  T   @  
-
-                                                                  O           Ԁ           O   m
-  x   x   :                   E  T   @  
-
-                                                                   O           Ԁ           P     x   x   :                   E  T   @  
-
-                                                                  P           Ԁ           P   m
-  x   x   :                   E  T   @  
-
-                                                                   P           Ԁ           P    d   d                   E  @ (  @  
-
- ,   $ (  
-  (  
-  
-  
-    P    d   d                   E  @ (  @  
-
- ,   $ (  
-  (  
-  
-  
-    P   N |   |                    E  X /  @  
-
- D   < / 
-  6   
-
-  
-  7    
-  
-    Q     x   x   :                   E  T   @  
-
-                                                                  Q           Ԁ           Q   m
-  x   x   :                   E  T   @  
-
-                                                                   Q           Ԁ           R     x   x   :                   E  T    @  
-
-                                                                   R           Ԁ           R   m
-  x   x   :                    E  T    @  
-
-                                                                    R           Ԁ           R   G d   d               0    E  @ 0  @  
-
- ,   $ 0  
-  8    
-  
-    R    d   d                   E  @ )  @  
-
- ,   $ )  
-  )    
-  
-    R    d   d                   E  @ )  @  
-
- ,   $ )  
-  )    
-  
-    S     x   x   :                   E  T !  @  
-
-      !                                                            S           Ԁ           S   m
-  x   x   :               @    E  T !  @  
-
-       !                                                            S           Ԁ           T     x   x   :                   E  T "  @  
-
-      "                                                            T           Ԁ           T   m
-  x   x   :               P    E  T "  @  
-
-       "                                                            T           Ԁ           T    d   d                   E  @ *  @  
-
- ,   $ *  
-  *    
-  
-    T   5 d   d                   E  @ *  @  
-
- ,   $ *  
-  *    
-  
-    T    d   d               `    E  @ 1  @  
-
- ,   $ 1  
-  9    
-  
-    U     x   x   :                    E  T #  @  
-
-      #                                                            U           Ԁ           U   m
-  x   x   :               p    E  T #  @  
-
-       #                                                            U           Ԁ           U   / \   \                   E  8 2  @  
-
- $    2 
-  :   
-
-    V     x   x   :                   E  T $  @  
-
-      $                                                            V           Ԁ           V   m
-  x   x   :                   E  T $  @  
-
-       $                                                            V           Ԁ           V   1 d   d                   E  @ 3  @  
-
- ,   $ 3  
-  ;    
-  
-    V   G d   d                    E  @ +  @  
-
- ,   $ +  
-  +    
-  
-    V   m d   d                   E  @ +  @  
-
- ,   $ +  
-  +    
-  
-    W     x   x   :               0    E  T %  @  
-
-      %                                                            W           Ԁ           W   m
-  x   x   :                   E  T %  @  
-
-       %                                                            W           Ԁ           X     x   x   :               @    E  T &  @  
-
-      &                                                            X           Ԁ           X   m
-  x   x   :                   E  T &  @  
-
-       &                                                            X           Ԁ           X    d   d                   E  @ ,  @  
-
- ,   $ ,  
-  ,    
-  
-    X   & d   d                   E  @ 4  @  
-
- ,   $ 4  
-  <    
-  
-    X   6 d   d               P    E  @ ,  @  
-
- ,   $ ,  
-  ,    
-  
-    Y     x   x   :               `    E  T '  @  
-
-      '                                                            Y           Ԁ           Y   m
-  x   x   :                   E  T '  @  
-
-       '                                                            Y           Ԁ           Z     x   x   :               p    E  T (  @  
-
-      (                                                            Z           Ԁ           Z   l
-  x   x   :                   E  T (  @  
-
-       (                                                            Z           Ԁ           Z   h  d   d                    E  @ 5  @  
-
- ,   $ 5  
-  =    
-  
-    Z   A d   d                   E  @ -  @  
-
- ,   $ -  
-  -    
-  
-    Z   j d   d                   E  @ -  @  
-
- ,   $ -  
-  -    
-  
-    [     x   x   :                   E  T )  @  
-
-      )                                                            [           Ԁ           [   l
-  x   x   :                   E  T )  @  
-
-       )                                                            [           Ԁ           \     x   x   :                   E  T *  @  
-
-      *                                                            \           Ԁ           \   l
-  x   x   :                    E  T *  @  
-
-       *                                                            \           Ԁ           \   M  d   d                   E  @ .  @  
-
- ,   $ .  
-  .    
-  
-    \     d   d                   E  @ .  @  
-
- ,   $ .  
-  .    
-  
-    \   U d   d               0    E  @ 6  @  
-
- ,   $ 6  
-  >    
-  
-    ]     x   x   :                   E  T +  @  
-
-      +                                                            ]           Ԁ           ]   l
-  x   x   :               @    E  T +  @  
-
-       +                                                            ]           Ԁ           ^     x   x   :                   E  T ,  @  
-
-      ,                                                            ^           Ԁ           ^   l
-  x   x   :               P    E  T ,  @  
-
-       ,                                                            ^           Ԁ           ^     d   d                   E  @ /  @  
-
- ,   $ /  
-  /    
-  
-    ^   M d   d               `    E  @ 7  @  
-
- ,   $ 7  
-  ?    
-  
-    ^    d   d                   E  @ /  @  
-
- ,   $ /  
-  /    
-  
-    _     x   x   :                   E  T -  @  
-
-      -                                                            _           Ԁ           _   l
-  x   x   :               p    E  T -  @  
-
-       -                                                            _           Ԁ           `     x   x   :                    E  T .  @  
-
-      .                                                            `           Ԁ           `   l
-  x   x   :                   E  T .  @  
-
-       .                                                            `           Ԁ           `   d  d   d                   E  @ 0  @  
-
- ,   $ 0  
-  0    
-  
-    `   &7 d   d                   E  @ 8  @  
-
- ,   $ 8  
-  @    
-  
-    `    d   d                    E  @ 0  @  
-
- ,   $ 0  
-  0    
-  
-    a     x   x   :                    E  T /  @  
-
-      /                                                            a           Ԁ           a   l
-  x   x   :                   E  T /  @  
-
-       /                                                            a           Ԁ           b     x   x   :               0    E  T 0  @  
-
-      0                                                            b           Ԁ           b   l
-  x   x   :                   E  T 0  @  
-
-       0                                                            b           Ԁ           b    d   d                   E  @ 1  @  
-
- ,   $ 1  
-  1    
-  
-    b   p! d   d               @    E  @ 1  @  
-
- ,   $ 1  
-  1    
-  
-    b   W d   d                   E  @ 9  @  
-
- ,   $ 9  
-  A    
-  
-    c     x   x   :               P    E  T 1  @  
-
-      1                                                            c           Ԁ           c   l
-  x   x   :                   E  T 1  @  
-
-       1                                                            c           Ԁ           d     x   x   :               `    E  T 2  @  
-
-      2                                                            d           Ԁ           d   l
-  x   x   :                   E  T 2  @  
-
-       2                                                            d           Ԁ           d   
- d   d               p    E  @ 2  @  
-
- ,   $ 2  
-  2    
-  
-    d   s d   d                    E  @ 2  @  
-
- ,   $ 2  
-  2    
-  
-    d   l d   d                   E  @ :  @  
-
- ,   $ :  
-  B    
-  
-    e     x   x   :                   E  T 3  @  
-
-      3                                                            e           Ԁ           e   l
-  x   x   :                    E  T 3  @  
-
-       3                                                            e           Ԁ           f     x   x   :                   E  T 4  @  
-
-      4                                                            f           Ԁ           f   l
-  x   x   :                   E  T 4  @  
-
-       4                                                            f           Ԁ           f   * d   d                   E  @ 3  @  
-
- ,   $ 3  
-  3    
-  
-    f    d   d               0    E  @ 3  @  
-
- ,   $ 3  
-  3    
-  
-    f    d   d                    E  @ ;  @  
-
- ,   $ ;  
-  C    
-  
-    g     x   x   :                   E  T 5  @  
-
-      5                                                            g           Ԁ           g   l
-  x   x   :               0    E  T 5  @  
-
-       5                                                            g           Ԁ           h     x   x   :                   E  T 6  @  
-
-      6                                                            h           Ԁ           h   l
-  x   x   :               @    E  T 6  @  
-
-       6                                                            h           Ԁ           h     d   d               @    E  @ 4  @  
-
- ,   $ 4  
-  4    
-  
-    h    d   d               P    E  @ <  @  
-
- ,   $ <  
-  D    
-  
-    h   	 d   d                   E  @ 4  @  
-
- ,   $ 4  
-  4    
-  
-    i     x   x   :                   E  T 7  @  
-
-      7                                                            i           Ԁ           i   m
-  x   x   :               `    E  T 7  @  
-
-       7                                                            i           Ԁ           j     x   x   :                   E  T 8  @  
-
-      8                                                            j           Ԁ           j   m
-  x   x   :               p    E  T 8  @  
-
-       8                                                            j           Ԁ           j    d   d               P    E  @ 5  @  
-
- ,   $ 5  
-  5    
-  
-    j   =j d   d                    E  @ 5  @  
-
- ,   $ 5  
-  5    
-  
-    j    d   d                   E  @ =  @  
-
- ,   $ =  
-  E    
-  
-    k     x   x   :                   E  T 9  @  
-
-      9                                                            k           Ԁ           k   m
-  x   x   :                   E  T 9  @  
-
-       9                                                            k           Ԁ           l     x   x   :                    E  T :  @  
-
-      :                                                            l           Ԁ           l   m
-  x   x   :                   E  T :  @  
-
-       :                                                            l           Ԁ           l    d   d               0    E  @ 6  @  
-
- ,   $ 6  
-  6    
-  
-    l   * d   d               `    E  @ 6  @  
-
- ,   $ 6  
-  6    
-  
-    l   4 d   d                   E  @ >  @  
-
- ,   $ >  
-  F    
-  
-    m     x   x   :               @    E  T ;  @  
-
-      ;                                                            m           Ԁ           m   m
-  x   x   :                   E  T ;  @  
-
-       ;                                                            m           Ԁ           n     x   x   :               P    E  T <  @  
-
-      <                                                            n           Ԁ           n   m
-  x   x   :                   E  T <  @  
-
-       <                                                            n           Ԁ           n   Q  d   d                   E  @ ?  @  
-
- ,   $ ?  
-  G    
-  
-    n   X d   d               `    E  @ 7  @  
-
- ,   $ 7  
-  7    
-  
-    n   N d   d               p    E  @ 7  @  
-
- ,   $ 7  
-  7    
-  
-    o     x   x   :               p    E  T =  @  
-
-      =                                                            o           Ԁ           o   m
-  x   x   :                   E  T =  @  
-
-       =                                                            o           Ԁ           p     x   x   :                   E  T >  @  
-
-      >                                                            p           Ԁ           p   m
-  x   x   :                    E  T >  @  
-
-       >                                                            p           Ԁ           p     d   d                   E  @ 8  @  
-
- ,   $ 8  
-  8    
-  
-    p    d   d                   E  @ @  @  
-
- ,   $ @  
-  H    
-  
-    p   D d   d                   E  @ 8  @  
-
- ,   $ 8  
-  8    
-  
-    q     x   x   :                   E  T ?  @  
-
-      ?                                                            q           Ԁ           q   m
-  x   x   :                    E  T ?  @  
-
-       ?                                                            q           Ԁ           r     x   x   :                   E  T @  @  
-
-      @                                                            r           Ԁ           r   m
-  x   x   :               0    E  T @  @  
-
-       @                                                            r           Ԁ           r   $ d   d               @    E  @ A  @  
-
- ,   $ A  
-  I    
-  
-    r    d   d                   E  @ 9  @  
-
- ,   $ 9  
-  9    
-  
-    r   * d   d                   E  @ 9  @  
-
- ,   $ 9  
-  9    
-  
-    s     x   x   :                   E  T A  @  
-
-      A                                                            s           Ԁ           s   m
-  x   x   :               P    E  T A  @  
-
-       A                                                            s           Ԁ           t     x   x   :                   E  T B  @  
-
-      B                                                            t           Ԁ           t   m
-  x   x   :               `    E  T B  @  
-
-       B                                                            t           Ԁ           t    d   d               p    E  @ B  @  
-
- ,   $ B  
-  J    
-  
-    t    d   d                   E  @ :  @  
-
- ,   $ :  
-  :    
-  
-    t   :S d   d                   E  @ :  @  
-
- ,   $ :  
-  :    
-  
-    u     x   x   :                    E  T C  @  
-
-      C                                                            u           Ԁ           u   m
-  x   x   :                   E  T C  @  
-
-       C                                                            u           Ԁ           v     x   x   :                   E  T D  @  
-
-      D                                                            v           Ԁ           v   m
-  x   x   :                   E  T D  @  
-
-       D                                                            v           Ԁ           v   ף d   d                    E  @ ;  @  
-
- ,   $ ;  
-  ;    
-  
-    v   R d   d                   E  @ C  @  
-
- ,   $ C  
-  K    
-  
-    v   M d   d                   E  @ ;  @  
-
- ,   $ ;  
-  ;    
-  
-    w     x   x   :               0    E  T E  @  
-
-      E                                                            w           Ԁ           w   m
-  x   x   :                   E  T E  @  
-
-       E                                                            w           Ԁ           x     x   x   :               @    E  T F  @  
-
-      F                                                            x           Ԁ           x   m
-  x   x   :                   E  T F  @  
-
-       F                                                            x           Ԁ           x   Z d   d                   E  @ <  @  
-
- ,   $ <  
-  <    
-  
-    x   3 d   d               P    E  @ <  @  
-
- ,   $ <  
-  <    
-  
-    x   O. d   d                   E  @ D  @  
-
- ,   $ D  
-  L    
-  
-    y     x   x   :               `    E  T G  @  
-
-      G                                                            y           Ԁ           y   m
-  x   x   :                   E  T G  @  
-
-       G                                                            y           Ԁ           z     x   x   :               p    E  T H  @  
-
-      H                                                            z           Ԁ           z   m
-  x   x   :                   E  T H  @  
-
-       H                                                            z           Ԁ           z   # d   d                   E  @ =  @  
-
- ,   $ =  
-  =    
-  
-    z   I d   d                   E  @ =  @  
-
- ,   $ =  
-  =    
-  
-    z   P d   d                	    E  @ E  @  
-
- ,   $ E  
-  M    
-  
-    {     x   x   :                   E  T I  @  
-
-      I                                                            {   "  x   x   :                   E  T I  @  
-
-      I                                                            {     x   x   :                   E  T I  @  
-
-      I                                                            {   &  x   x   :                   E  T I  @  
-
-      I                                                            {   8  x   x   :                   E  T I  @  
-
-      I                                                            {   ]  x   x   :                   E  T I  @  
-
-      I                                                            {   }  x   x   :                   E  T I  @  
-
-      I                                                            |     x   x   :                   E  T J  @  
-
-      J                                                            |     x   x   :                   E  T J  @  
-
-      J                                                            |     x   x   :                   E  T J  @  
-
-      J                                                            |   b#  x   x   :                   E  T J  @  
-
-      J                                                            |   M  x   x   :                   E  T J  @  
-
-      J                                                            |   j  x   x   :                   E  T J  @  
-
-      J                                                            |     x   x   :                   E  T J  @  
-
-      J                                                            |   P  d   d                   E  @ >  @  
-
- ,   $ >  
-  >    
-  
-    |   8 d   d               	    E  @ F  @  
-
- ,   $ F  
-  N    
-  
-    |   w d   d                   E  @ >  @  
-
- ,   $ >  
-  >    
-  
-    }     x   x   :                   E  T K  @  
-
-      K                                                            }   :  x   x   :                   E  T K  @  
-
-      K                                                            }   X  x   x   :                   E  T K  @  
-
-      K                                                            }   N-  x   x   :                   E  T K  @  
-
-      K                                                            }   hG  x   x   :                   E  T K  @  
-
-      K                                                            }   S  x   x   :                   E  T K  @  
-
-      K                                                            }   t  x   x   :                   E  T K  @  
-
-      K                                                            ~     x   x   :                   E  T L  @  
-
-      L                                                            ~     x   x   :                   E  T L  @  
-
-      L                                                            ~   \  x   x   :                   E  T L  @  
-
-      L                                                            ~   1  x   x   :                   E  T L  @  
-
-      L                                                            ~   K  x   x   :                   E  T L  @  
-
-      L                                                            ~     x   x   :                   E  T L  @  
-
-      L                                                            ~   `  d   d                   E  @ ?  @  
-
- ,   $ ?  
-  ?    
-  
-    ~     x   x   :                   E  T L  @  
-
-      L                                                            ~     d   d                   E  @ ?  @  
-
- ,   $ ?  
-  ?    
-  
-    ~   KB d   d                	    E  @ G  @  
-
- ,   $ G  
-  O    
-  
-       x  @   @                          
-
-         @   @   :                           
-     
-               Ԁ                x   x   :                	    E  T M  @  
-
-      M                                                                       Ԁ              ;  @   @                          
-
-       sA  @   @   :               0	           
-     
-       }A        Ԁ              C  x   x   :                    E  T M  ?  
-
-      M                                                               I        Ԁ              Ln  @   @               @	           
-
-       ~n  @   @   :               0           
-     
-       yr        Ԁ              y  x   x   :               P	    E  T I  @  
-
-       M                                                               y        Ԁ              ۔  @   @               @           
-
-         @   @   :               	           
-     
-               Ԁ              ^  x   x   :               P    E  T I  ?  
-
-       M                                                                       Ԁ                x   x   :                	    E  T N  @  
-
-      N                                                                       Ԁ                x   x   :               `    E  T N  ?  
-
-      N                                                                       Ԁ              Y  x   x   :               `	    E  T J  @  
-
-       N                                                               c        Ԁ                x   x   :               p    E  T J  ?  
-
-       N                                                               M        Ԁ               d   d               0	    E  @ @  @  
-
- ,   $ @  
-  @    
-
-  
-        d   d                   E  @ @  @  
-
- ,   $ @  
-  @    
-  
-       < d   d               p	    E  @ H  @  
-
- ,   $ H  
-  P  
-  
-  
-         x   x   :               @	    E  T O  @  
-
-      O                                                                       Ԁ                x   x   :                   E  T O  ?  
-
-      O                                                                       Ԁ              Y  x   x   :               	    E  T K  @  
-
-       O                                                               c        Ԁ                x   x   :                   E  T K  ?  
-
-       O                                                               ]        Ԁ                x   x   :               P	    E  T P  @  
-
-      P                                                                       Ԁ                x   x   :                   E  T P  ?  
-
-      P                                                                       Ԁ              Y  x   x   :               	    E  T L  @  
-
-       P                                                               c        Ԁ                x   x   :                   E  T L  ?  
-
-       P                                                                       Ԁ              2 d   d               	    E  @ I  @  
-
- ,   $ I  
-  Q  
-  
-  
-        d   d               `	    E  @ A  @  
-
- ,   $ A  
-  A    
-
-  
-       !v |   |                   E  X A  @  
-
- D   < A 
-  A   
-
-  
-  B    
-  
-         x   x   :               p	    E  T Q  @  
-
-      Q                                                                       Ԁ                x   x   :                   E  T Q  ?  
-
-      Q                                                                       Ԁ              Y  x   x   :               	    E  T M  @  
-
-       Q                                                               c        Ԁ              1  x   x   :                   E  T M  ?  
-
-       Q                                                                       Ԁ                x   x   :               	    E  T R  @  
-
-      R                                                                       Ԁ                x   x   :                    E  T R  ?  
-
-      R                                                                       Ԁ              Y  x   x   :               	    E  T N  @  
-
-       R                                                               c        Ԁ                x   x   :                   E  T N  ?  
-
-       R                                                                       Ԁ               d   d               	    E  @ J  @  
-
- ,   $ J  
-  R  
-  
-  
-       ^x d   d                    E  @ B  @  
-
- ,   $ B  
-  C    
-  
-       / d   d               	    E  @ B  @  
-
- ,   $ B  
-  B    
-
-  
-         x   x   :               	    E  T S  @  
-
-      S                                                                       Ԁ                x   x   :               0    E  T S  ?  
-
-      S                                                                       Ԁ              Y  x   x   :               	    E  T O  @  
-
-       S                                                               c        Ԁ              y  x   x   :               @    E  T O  ?  
-
-       S                                                               5        Ԁ                x   x   :               	    E  T T  @  
-
-      T                                                                       Ԁ                x   x   :               P    E  T T  ?  
-
-      T                                                                       Ԁ              Y  x   x   :               	    E  T P  @  
-
-       T                                                               c        Ԁ                x   x   :               `    E  T P  ?  
-
-       T                                                               q        Ԁ               d   d               p    E  @ C  @  
-
- ,   $ C  
-  D    
-  
-       G \   \               	    E  8 C  @  
-
- $    C 
-  C  
-  
-        \   \                
-    E  8 K  @  
-
- $    K 
-  S  
-  
-         x   x   :               	    E  T U  @  
-
-      U                                                                       Ԁ                x   x   :                   E  T U  ?  
-
-      U                                                                       Ԁ              Y  x   x   :               
-    E  T Q  @  
-
-       U                                                               c        Ԁ                x   x   :                   E  T Q  ?  
-
-       U                                                                       Ԁ              P  \   \                   E  8 D  @  
-
- $    D 
-  E   
-
-         x   x   :               	    E  T V  @  
-
-      V                                                                       Ԁ                x   x   :                   E  T V  ?  
-
-      V                                                               B  x   x   :                   E  T V  ?  
-
-      V                                                                       Ԁ                x   x   :               0
-    E  T R  @  
-
-       V                                                                       Ԁ                x   x   :                   E  T R  ?  
-
-       V                                                                       Ԁ                \   \               	    E  8 D  @  
-
- $    D 
-  D  
-  
-       C d   d                   E  @ E  @  
-
- ,   $ E  
-  F    
-  
-         x   x   :                
-    E  T W  @  
-
-      W                                                                       Ԁ                x   x   :                   E  T W  ?  
-
-      W                                                                       Ԁ              Z  x   x   :               @
-    E  T S  @  
-
-       W                                                               d        Ԁ                x   x   :                   E  T S  ?  
-
-       W                                                                       Ԁ                x   x   :               
-    E  T X  @  
-
-      X                                                                       Ԁ                x   x   :                    E  T X  ?  
-
-      X                                                                       Ԁ              Z  x   x   :               P
-    E  T T  @  
-
-       X                                                               d        Ԁ                x   x   :                   E  T T  ?  
-
-       X                                                               q        Ԁ                \   \                
-    E  8 E  @  
-
- $    E 
-  E  
-  
-        d   d                    E  @ F  @  
-
- ,   $ F  
-  G    
-  
-        \   \               `
-    E  8 M  @  
-
- $    M 
-  U  
-  
-         x   x   :               0
-    E  T Y  @  
-
-      Y                                                                       Ԁ                x   x   :               0    E  T Y  ?  
-
-      Y                                                                       Ԁ              Z  x   x   :               p
-    E  T U  @  
-
-       Y                                                               d        Ԁ                x   x   :               @    E  T U  ?  
-
-       Y                                                                       Ԁ                x   x   :               @
-    E  T Z  @  
-
-      Z                                                                       Ԁ                x   x   :               P    E  T Z  ?  
-
-      Z                                                                       Ԁ              Z  x   x   :               
-    E  T V  @  
-
-       Z                                                               d        Ԁ                x   x   :               `    E  T V  ?  
-
-       Z                                                                       Ԁ              u  \   \               P
-    E  8 F  @  
-
- $    F 
-  F  
-  
-         \   \               
-    E  8 N  @  
-
- $    N 
-  V  
-  
-       Ȱ |   |               p    E  X G  @  
-
- D   < G 
-  H   
-
-  
-  I    
-  
-         x   x   :               `
-    E  T [  @  
-
-      [                                                                       Ԁ                x   x   :                   E  T [  ?  
-
-      [                                                                       Ԁ              Z  x   x   :               
-    E  T W  @  
-
-       [                                                               d        Ԁ                x   x   :                   E  T W  ?  
-
-       [                                                                       Ԁ                x   x   :               p
-    E  T \  @  
-
-      \                                                                       Ԁ                x   x   :                   E  T \  ?  
-
-      \                                                                       Ԁ              Z  x   x   :               
-    E  T X  @  
-
-       \                                                               d        Ԁ              
-  x   x   :                   E  T X  ?  
-
-       \                                                                       Ԁ              g  \   \               
-    E  8 O  @  
-
- $    O 
-  W  
-  
-       ) \   \               
-    E  8 G  @  
-
- $    G 
-  G  
-  
-       ~3 d   d                   E  @ H  @  
-
- ,   $ H  
-  J    
-  
-         x   x   :               
-    E  T ]  @  
-
-      ]                                                                       Ԁ                x   x   :                   E  T ]  ?  
-
-      ]                                                                       Ԁ              Z  x   x   :               
-    E  T Y  @  
-
-       ]                                                               d        Ԁ                x   x   :                   E  T Y  ?  
-
-       ]                                                               a        Ԁ                x   x   :               
-    E  T ^  @  
-
-      ^                                                                       Ԁ                x   x   :                   E  T ^  ?  
-
-      ^                                                                       Ԁ              Z  x   x   :               
-    E  T Z  @  
-
-       ^                                                               d        Ԁ              *  x   x   :                    E  T Z  ?  
-
-       ^                                                                       Ԁ              E  d   d                   E  @ I  @  
-
- ,   $ I  
-  K    
-  
-       ݁ \   \               
-    E  8 H  @  
-
- $    H 
-  H  
-  
-        \   \               
-    E  8 P  @  
-
- $    P 
-  X  
-  
-         x   x   :               
-    E  T _  @  
-
-      _                                                                       Ԁ                x   x   :                    E  T _  ?  
-
-      _                                                                       Ԁ              Z  x   x   :                    E  T [  @  
-
-       _                                                               d        Ԁ              
-  x   x   :               0    E  T [  ?  
-
-       _                                                                       Ԁ               \   \               @    E  8 J  @  
-
- $    J 
-  L   
-
-         x   x   :               
-    E  T `  @  
-
-      `                                                                       Ԁ                x   x   :               P    E  T `  ?  
-
-      `                                                                       Ԁ              Z  x   x   :                   E  T \  @  
-
-       `                                                               d        Ԁ                x   x   :               `    E  T \  ?  
-
-       `                                                               N        Ԁ              (n \   \                    E  8 Q  @  
-
- $    Q 
-  Y  
-  
-       L d   d               p    E  @ K  @  
-
- ,   $ K  
-  M    
-  
-       > \   \               
-    E  8 I  @  
-
- $    I 
-  I  
-  
-         x   x   :               
-    E  T a  @  
-
-      a                                                                       Ԁ                x   x   :                   E  T a  ?  
-
-      a                                                                       Ԁ              Z  x   x   :               0    E  T ]  @  
-
-       a                                                               d        Ԁ                x   x   :                   E  T ]  ?  
-
-       a                                                                       Ԁ                x   x   :                    E  T b  @  
-
-      b                                                                       Ԁ                x   x   :                   E  T b  ?  
-
-      b                                                                       Ԁ              Z  x   x   :               @    E  T ^  @  
-
-       b                                                               d        Ԁ              ~  x   x   :                   E  T ^  ?  
-
-       b                                                               :        Ԁ              3 d   d                   E  @ L  @  
-
- ,   $ L  
-  N    
-  
-        \   \               P    E  8 R  @  
-
- $    R 
-  Z  
-  
-        \   \                   E  8 J  @  
-
- $    J 
-  J  
-  
-         x   x   :                    E  T c  @  
-
-      c                                                                       Ԁ                x   x   :                   E  T c  ?  
-
-      c                                                                       Ԁ              Z  x   x   :               `    E  T _  @  
-
-       c                                                               d        Ԁ                x   x   :                   E  T _  ?  
-
-       c                                                               r        Ԁ                x   x   :               0    E  T d  @  
-
-      d                                                                       Ԁ                x   x   :                   E  T d  ?  
-
-      d                                                                       Ԁ              Z  x   x   :               p    E  T `  @  
-
-       d                                                               d        Ԁ                x   x   :                    E  T `  ?  
-
-       d                                                                       Ԁ              " |   |                   E  X M  @  
-
- D   < M 
-  O   
-
-  
-  P    
-  
-       t \   \                   E  8 S  @  
-
- $    S 
-  [  
-  
-       j@ \   \               @    E  8 K  @  
-
- $    K 
-  K  
-  
-         x   x   :               P    E  T e  @  
-
-      e                                                                       Ԁ                x   x   :                    E  T e  ?  
-
-      e                                                                       Ԁ              Z  x   x   :                   E  T a  @  
-
-       e                                                               d        Ԁ                x   x   :               0    E  T a  ?  
-
-       e                                                                       Ԁ                x   x   :               `    E  T f  @  
-
-      f                                                                       Ԁ                x   x   :               @    E  T f  ?  
-
-      f                                                                       Ԁ              Z  x   x   :                   E  T b  @  
-
-       f                                                               d        Ԁ                x   x   :               P    E  T b  ?  
-
-       f                                                               ^        Ԁ                \   \                   E  8 T  @  
-
- $    T 
-  \  
-  
-       > \   \               p    E  8 L  @  
-
- $    L 
-  L  
-  
-        d   d               `    E  @ N  @  
-
- ,   $ N  
-  Q    
-  
-         x   x   :                   E  T g  @  
-
-      g                                                                       Ԁ                x   x   :               p    E  T g  ?  
-
-      g                                                                       Ԁ              Z  x   x   :                   E  T c  @  
-
-       g                                                               d        Ԁ                x   x   :                   E  T c  ?  
-
-       g                                                                       Ԁ                x   x   :                   E  T h  @  
-
-      h                                                                       Ԁ                x   x   :                   E  T h  ?  
-
-      h                                                                       Ԁ              Z  x   x   :                   E  T d  @  
-
-       h                                                               d        Ԁ                x   x   :                   E  T d  ?  
-
-       h                                                                       Ԁ              8  d   d                   E  @ O  @  
-
- ,   $ O  
-  R    
-  
-       Q \   \                   E  8 M  @  
-
- $    M 
-  M  
-  
-       v \   \                   E  8 U  @  
-
- $    U 
-  ]  
-  
-         x   x   :                   E  T i  @  
-
-      i                                                                       Ԁ                x   x   :                   E  T i  ?  
-
-      i                                                                       Ԁ              Z  x   x   :                   E  T e  @  
-
-       i                                                               d        Ԁ              V  x   x   :                   E  T e  ?  
-
-       i                                                                       Ԁ              ' \   \                   E  8 P  @  
-
- $    P 
-  S   
-
-         x   x   :                   E  T j  @  
-
-      j                                                                       Ԁ                x   x   :                   E  T j  ?  
-
-      j                                                                       Ԁ              Z  x   x   :                    E  T f  @  
-
-       j                                                               d        Ԁ                x   x   :                	    E  T f  ?  
-
-       j                                                               r        Ԁ              & d   d               	    E  @ Q  @  
-
- ,   $ Q  
-  T    
-  
-       o/ \   \                   E  8 V  @  
-
- $    V 
-  ^  
-  
-       L \   \                   E  8 N  @  
-
- $    N 
-  N  
-  
-         x   x   :                   E  T k  @  
-
-      k                                                                       Ԁ                x   x   :                	    E  T k  ?  
-
-      k                                                                       Ԁ              Z  x   x   :                    E  T g  @  
-
-       k                                                               d        Ԁ              >  x   x   :               0	    E  T g  ?  
-
-       k                                                                       Ԁ                x   x   :                   E  T l  @  
-
-      l                                                                       Ԁ                x   x   :               @	    E  T l  ?  
-
-      l                                                                       Ԁ              Z  x   x   :               0    E  T h  @  
-
-       l                                                               d        Ԁ                x   x   :               P	    E  T h  ?  
-
-       l                                                                       Ԁ              - \   \                    E  8 O  @  
-
- $    O 
-  O  
-  
-       0 \   \               @    E  8 W  @  
-
- $    W 
-  _  
-  
-       v d   d               `	    E  @ R  @  
-
- ,   $ R  
-  U    
-  
-         x   x   :                   E  T m  @  
-
-      m                                                                       Ԁ                x   x   :               p	    E  T m  ?  
-
-      m                                                                       Ԁ              Z  x   x   :               P    E  T i  @  
-
-       m                                                               d        Ԁ                x   x   :               	    E  T i  ?  
-
-       m                                                               r        Ԁ                x   x   :                    E  T n  @  
-
-      n                                                                       Ԁ                x   x   :               	    E  T n  ?  
-
-      n                                                                       Ԁ              Z  x   x   :               `    E  T j  @  
-
-       n                                                               d        Ԁ                x   x   :               	    E  T j  ?  
-
-       n                                                                       Ԁ              '5 \   \               0    E  8 P  @  
-
- $    P 
-  P  
-  
-       %A |   |               	    E  X S  @  
-
- D   < S 
-  V   
-
-  
-  W    
-  
-        \   \               p    E  8 X  @  
-
- $    X 
-  `  
-  
-         x   x   :               @    E  T o  @  
-
-      o                                                                       Ԁ                x   x   :               	    E  T o  ?  
-
-      o                                                                       Ԁ              Z  x   x   :                   E  T k  @  
-
-       o                                                               d        Ԁ                x   x   :               	    E  T k  ?  
-
-       o                                                               N        Ԁ                x   x   :               P    E  T p  @  
-
-      p                                                                       Ԁ                x   x   :               	    E  T p  ?  
-
-      p                                                                       Ԁ              Z  x   x   :                   E  T l  @  
-
-       p                                                               d        Ԁ                x   x   :               	    E  T l  ?  
-
-       p                                                                       Ԁ              I \   \                   E  8 Y  @  
-
- $    Y 
-  a  
-  
-       P d   d                
-    E  @ T  @  
-
- ,   $ T  
-  X    
-  
-       b \   \               `    E  8 Q  @  
-
- $    Q 
-  Q  
-  
-         x   x   :               p    E  T q  @  
-
-      q                                                                       Ԁ                x   x   :               
-    E  T q  ?  
-
-      q                                                                       Ԁ              Z  x   x   :                   E  T m  @  
-
-       q                                                               d        Ԁ                x   x   :                
-    E  T m  ?  
-
-       q                                                                       Ԁ                x   x   :                   E  T r  @  
-
-      r                                                                       Ԁ                x   x   :               0
-    E  T r  ?  
-
-      r                                                                       Ԁ              Z  x   x   :                   E  T n  @  
-
-       r                                                               d        Ԁ                x   x   :               @
-    E  T n  ?  
-
-       r                                                                       Ԁ               d   d               P
-    E  @ U  @  
-
- ,   $ U  
-  Y    
-  
-       j \   \                   E  8 Z  @  
-
- $    Z 
-  b  
-  
-       ܮ \   \                   E  8 R  @  
-
- $    R 
-  R  
-  
-         x   x   :                   E  T s  @  
-
-      s                                                                       Ԁ                x   x   :               `
-    E  T s  ?  
-
-      s                                                                       Ԁ              Z  x   x   :                   E  T o  @  
-
-       s                                                               d        Ԁ                x   x   :               p
-    E  T o  ?  
-
-       s                                                                       Ԁ               \   \               
-    E  8 V  @  
-
- $    V 
-  Z   
-
-         x   x   :                   E  T t  @  
-
-      t                                                                       Ԁ                x   x   :               
-    E  T t  ?  
-
-      t                                                                       Ԁ              Z  x   x   :                   E  T p  @  
-
-       t                                                               d        Ԁ                x   x   :               
-    E  T p  ?  
-
-       t                                                                       Ԁ               \   \                   E  8 S  @  
-
- $    S 
-  S  
-  
-       @ \   \                    E  8 [  @  
-
- $    [ 
-  c  
-  
-       g0 d   d               
-    E  @ W  @  
-
- ,   $ W  
-  [    
-  
-         x   x   :                   E  T u  @  
-
-      u                                                                       Ԁ                x   x   :               
-    E  T u  ?  
-
-      u                                                                       Ԁ              Z  x   x   :                   E  T q  @  
-
-       u                                                               d        Ԁ              ~  x   x   :               
-    E  T q  ?  
-
-       u                                                               :        Ԁ                x   x   :                   E  T v  @  
-
-      v                                                                       Ԁ                x   x   :               
-    E  T v  ?  
-
-      v                                                                       Ԁ              Z  x   x   :                    E  T r  @  
-
-       v                                                               d        Ԁ                x   x   :               
-    E  T r  ?  
-
-       v                                                               J        Ԁ               \   \                   E  8 T  @  
-
- $    T 
-  T  
-  
-        \   \               0    E  8 \  @  
-
- $    \ 
-  d  
-  
-       ~ d   d                    E  @ X  @  
-
- ,   $ X  
-  \    
-  
-         x   x   :                    E  T w  @  
-
-      w                                                                       Ԁ                x   x   :                   E  T w  ?  
-
-      w                                                                       Ԁ              Z  x   x   :               @    E  T s  @  
-
-       w                                                               d        Ԁ                x   x   :                    E  T s  ?  
-
-       w                                                                       Ԁ                x   x   :                   E  T x  @  
-
-      x                                                                       Ԁ                x   x   :               0    E  T x  ?  
-
-      x                                                                       Ԁ              Z  x   x   :               P    E  T t  @  
-
-       x                                                               d        Ԁ              V  x   x   :               @    E  T t  ?  
-
-       x                                                                       Ԁ              8  |   |               P    E  X Y  @  
-
- D   < Y 
-  ]   
-
-  
-  ^    
-  
-       j \   \               `    E  8 ]  @  
-
- $    ] 
-  e  
-  
-       <z \   \                    E  8 U  @  
-
- $    U 
-  U  
-  
-         x   x   :               0    E  T y  @  
-
-      y                                                                       Ԁ                x   x   :               `    E  T y  ?  
-
-      y                                                                       Ԁ              Z  x   x   :               p    E  T u  @  
-
-       y                                                               d        Ԁ                x   x   :               p    E  T u  ?  
-
-       y                                                                       Ԁ                x   x   :               @    E  T z  @  
-
-      z                                                                       Ԁ                x   x   :                   E  T z  ?  
-
-      z                                                                       Ԁ              Z  x   x   :                   E  T v  @  
-
-       z                                                               d        Ԁ              >  x   x   :                   E  T v  ?  
-
-       z                                                                       Ԁ              P \   \               P    E  8 V  @  
-
- $    V 
-  V  
-  
-       uV d   d                   E  @ Z  @  
-
- ,   $ Z  
-  _    
-  
-       " \   \                   E  8 ^  @  
-
- $    ^ 
-  f  
-  
-         x   x   :               `    E  T {  @  
-
-      {                                                                       Ԁ                x   x   :                   E  T {  ?  
-
-      {                                                                       Ԁ              Z  x   x   :                   E  T w  @  
-
-       {                                                               d        Ԁ              B  x   x   :                   E  T w  ?  
-
-       {                                                                       Ԁ                x   x   :               p    E  T |  @  
-
-      |                                                                       Ԁ                x   x   :                   E  T |  ?  
-
-      |                                                                 x   x   :                   E  T |  ?  
-
-      |                                                               f        Ԁ                x   x   :                   E  T x  @  
-
-       |                                                               "        Ԁ                x   x   :                   E  T x  ?  
-
-       |                                                               !        Ԁ              .  \   \                   E  8 W  @  
-
- $    W 
-  W  
-  
-       x{ d   d                   E  @ [  @  
-
- ,   $ [  
-  `    
-  
-         x   x   :                   E  T }  @  
-
-      }                                                                       Ԁ                x   x   :                    E  T }  ?  
-
-      }                                                                       Ԁ              Z  x   x   :                   E  T y  @  
-
-       }                                                               d        Ԁ                x   x   :                   E  T y  ?  
-
-       }                                                               ^        Ԁ              V \   \                    E  8 \  @  
-
- $    \ 
-  a   
-
-         x   x   :                   E  T ~  @  
-
-      ~                                                                       Ԁ                x   x   :               0    E  T ~  ?  
-
-      ~                                                                       Ԁ              Z  x   x   :                   E  T z  @  
-
-       ~                                                               d        Ԁ                x   x   :               @    E  T z  ?  
-
-       ~                                                                       Ԁ              u d   d               P    E  @ ]  @  
-
- ,   $ ]  
-  b    
-  
-       = \   \                   E  8 X  @  
-
- $    X 
-  X  
-  
-        \   \                   E  8 `  @  
-
- $    ` 
-  h  
-  
-         x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :               `    E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                    E  T {  @  
-
-                                                                      d        Ԁ              
-  x   x   :               p    E  T {  ?  
-
-                                                                              Ԁ                x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T |  @  
-
-                                                                      d        Ԁ                x   x   :                   E  T |  ?  
-
-                                                                              Ԁ              ( \   \                   E  8 Y  @  
-
- $    Y 
-  Y  
-  
-       > d   d                   E  @ ^  @  
-
- ,   $ ^  
-  c    
-  
-       9 \   \                    E  8 a  @  
-
- $    a 
-  i  
-  
-         x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :               0    E  T }  @  
-
-                                                                      d        Ԁ                x   x   :                   E  T }  ?  
-
-                                                                              Ԁ                x   x   :                    E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :               @    E  T ~  @  
-
-                                                                      d        Ԁ                x   x   :                   E  T ~  ?  
-
-                                                                      r        Ԁ                 \   \                   E  8 Z  @  
-
- $    Z 
-  Z  
-  
-       { |   |                   E  X _  @  
-
- D   < _ 
-  d   
-
-  
-  e    
-  
-       > \   \               P    E  8 b  @  
-
- $    b 
-  j  
-  
-         x   x   :                    E  T   @  
-
-                                                                             Ԁ                x   x   :                    E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :               `    E  T   @  
-
-                                                                      d        Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ                x   x   :               0    E  T   @  
-
-                                                                             Ԁ                x   x   :                    E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :               p    E  T   @  
-
-                                                                      d        Ԁ                x   x   :               0    E  T   ?  
-
-                                                                              Ԁ               \   \                   E  8 c  @  
-
- $    c 
-  k  
-  
-        \   \               @    E  8 [  @  
-
- $    [ 
-  [  
-  
-        d   d               @    E  @ `  @  
-
- ,   $ `  
-  f    
-  
-         x   x   :               P    E  T   @  
-
-                                                                             Ԁ                x   x   :               P    E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ                x   x   :               `    E  T   ?  
-
-                                                                      b        Ԁ                x   x   :               `    E  T   @  
-
-                                                                             Ԁ                x   x   :               p    E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ              4 d   d                   E  @ a  @  
-
- ,   $ a  
-  g    
-  
-       & \   \                   E  8 d  @  
-
- $    d 
-  l  
-  
-         \   \               p    E  8 \  @  
-
- $    \ 
-  \  
-  
-         x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ              M \   \                   E  8 b  @  
-
- $    b 
-  h   
-
-         x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ              2  x   x   :                   E  T   ?  
-
-                                                                              Ԁ              ;\  d   d                   E  @ c  @  
-
- ,   $ c  
-  i    
-  
-       ¢ \   \                   E  8 e  @  
-
- $    e 
-  m  
-  
-       ^ \   \                   E  8 ]  @  
-
- $    ] 
-  ]  
-  
-         x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :                    E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ                x   x   :                   E  T   ?  
-
-                                                                      J        Ԁ                x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :                    E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                    E  T   @  
-
-                                                                      d        Ԁ                x   x   :               0    E  T   ?  
-
-                                                                      v        Ԁ              i \   \                   E  8 f  @  
-
- $    f 
-  n  
-  
-       
-" d   d               @    E  @ d  @  
-
- ,   $ d  
-  j    
-  
-        \   \                   E  8 ^  @  
-
- $    ^ 
-  ^  
-  
-         x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :               P    E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                    E  T   @  
-
-                                                                      d        Ԁ                x   x   :               `    E  T   ?  
-
-                                                                      r        Ԁ                x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :               p    E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :               0    E  T   @  
-
-                                                                      d        Ԁ                x   x   :                   E  T   ?  
-
-                                                                      ^        Ԁ               \   \                    E  8 _  @  
-
- $    _ 
-  _  
-  
-         |   |                   E  X e  @  
-
- D   < e 
-  k   
-
-  
-  l    
-  
-       / \   \               @    E  8 g  @  
-
- $    g 
-  o  
-  
-         x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :               P    E  T   @  
-
-                                                                      d        Ԁ              ~  x   x   :                   E  T   ?  
-
-                                                                      :        Ԁ                x   x   :                    E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :               `    E  T   @  
-
-                                                                      d        Ԁ              
-  x   x   :                   E  T   ?  
-
-                                                                              Ԁ              " \   \               0    E  8 `  @  
-
- $    ` 
-  `  
-  
-       < d   d                   E  @ f  @  
-
- ,   $ f  
-  m    
-  
-       ! \   \               p    E  8 h  @  
-
- $    h 
-  p  
-  
-         x   x   :               @    E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ                x   x   :                    E  T   ?  
-
-                                                                              Ԁ                x   x   :               P    E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ              2  x   x   :                    E  T   ?  
-
-                                                                              Ԁ              ?R  \   \               `    E  8 a  @  
-
- $    a 
-  a  
-  
-        \   \                   E  8 i  @  
-
- $    i 
-  q  
-  
-        y d   d               0    E  @ g  @  
-
- ,   $ g  
-  n    
-  
-         x   x   :               p    E  T   @  
-
-                                                                             Ԁ                x   x   :               @    E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ                x   x   :               P    E  T   ?  
-
-                                                                              Ԁ               \   \               `    E  8 h  @  
-
- $    h 
-  o   
-
-         x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :               p    E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ              f  x   x   :                   E  T   ?  
-
-                                                                      "        Ԁ               \   \                   E  8 b  @  
-
- $    b 
-  b  
-  
-       J d   d                   E  @ i  @  
-
- ,   $ i  
-  p    
-  
-       \ \   \                   E  8 j  @  
-
- $    j 
-  r  
-  
-         x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ                x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ                x   x   :                   E  T   ?  
-
-                                                                              Ԁ              X \   \                    E  8 k  @  
-
- $    k 
-  s  
-  
-       &9 \   \                   E  8 c  @  
-
- $    c 
-  c  
-  
-       C d   d                   E  @ j  @  
-
- ,   $ j  
-  q    
-  
-         x   x   :                   E  T   @  
-
-                                                                             Ԁ                x   x   :                   E  T   ?  
-
-                                                                             Ԁ              Z  x   x   :                   E  T   @  
-
-                                                                      d        Ԁ                x   x   :                    E  T   ?  
-
-                                                                              Ԁ           
\ No newline at end of file
diff -Naur ns-3.23/src/olsr/test/bug780-test.cc ns-3.24/src/olsr/test/bug780-test.cc
--- ns-3.23/src/olsr/test/bug780-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/bug780-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -21,32 +21,23 @@
 // should show about 395 packets; there is a ping outage from time
 // 123-127 due to the mobility.
 
-#include <fstream>
-#include <iostream>
-
 #include "ns3/test.h"
 #include "ns3/olsr-helper.h"
 #include "ns3/ipv4-list-routing-helper.h"
-#include "ns3/wifi-helper.h"
-#include "ns3/yans-wifi-helper.h"
-#include "ns3/nqos-wifi-mac-helper.h"
-#include "ns3/constant-velocity-mobility-model.h"
-#include "ns3/mobility-helper.h"
 #include "ns3/olsr-routing-protocol.h"
 #include "ns3/internet-stack-helper.h"
 #include "ns3/log.h"
-#include "ns3/config.h"
 #include "ns3/double.h"
+#include "ns3/uinteger.h"
 #include "ns3/string.h"
 #include "ns3/boolean.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/ipv4-interface-container.h"
 #include "ns3/internet-stack-helper.h"
-#include "ns3/v4ping-helper.h"
-#include "ns3/pcap-file.h"
-#include "ns3/pcap-test.h"
 #include "ns3/rng-seed-manager.h"
-
+#include "ns3/simple-net-device-helper.h"
+#include "ns3/simple-net-device.h"
+#include "ns3/icmpv4.h"
 #include "bug780-test.h"
 
 namespace ns3
@@ -54,20 +45,9 @@
 namespace olsr
 {
 
-const char * const Bug780Test::PREFIX = "bug780";
-
-static void
-SetVelocity (Ptr<Node> node, Vector vel)
-{
-  Ptr<ConstantVelocityMobilityModel> mobility =
-    node->GetObject<ConstantVelocityMobilityModel> ();
-  mobility->SetVelocity (vel);
-}
-
-
 Bug780Test::Bug780Test() : 
   TestCase ("Test OLSR bug 780"),
-  m_time (Seconds (200.0))
+  m_time (Seconds (200.0)), m_seq (0), m_recvCount (0)
 {
 }
 
@@ -84,118 +64,106 @@
 
   Simulator::Stop (m_time);
   Simulator::Run ();
-  Simulator::Destroy ();
 
-  CheckResults ();  
+  NS_TEST_EXPECT_MSG_EQ (m_recvCount, 192, "192 out of 200 ping received.");
+
+  Simulator::Destroy ();
 }
 
 void
 Bug780Test::CreateNodes (void)
 {
-  int nWifis = 3;
-  double SimTime = 200.0;
-  std::string phyMode ("DsssRate1Mbps");
-  int64_t streamsUsed = 0;
-
-  //sending one packets per sec
-  // Fix non-unicast data rate to be the same as that of unicast
-  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold",
-                      StringValue ("400"));
-
-  NodeContainer adhocNodes;
-  adhocNodes.Create (nWifis);
-
-  WifiHelper wifi;
-  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
-  YansWifiChannelHelper wifiChannel;
-  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
-  wifiChannel.AddPropagationLoss ("ns3::FriisPropagationLossModel");
-  Ptr<YansWifiChannel> chan = wifiChannel.Create ();
-  wifiPhy.SetChannel (chan);
-
-  // Add a non-QoS upper mac, and disable rate control
-  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
-  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
-                                "DataMode",StringValue (phyMode),
-                                "ControlMode",StringValue (phyMode));
-
-  //set the tx range to 300
-  wifiPhy.Set ("TxPowerStart",DoubleValue (-0.1615));
-  wifiPhy.Set ("TxPowerEnd", DoubleValue (-0.1615));
-
-  // Set it to adhoc mode
-  wifiMac.SetType ("ns3::AdhocWifiMac");
-  NetDeviceContainer adhocDevices = wifi.Install (wifiPhy, wifiMac, adhocNodes);
-
-  // Assign fixed stream numbers to wifi and channel random variables
-  streamsUsed += wifi.AssignStreams (adhocDevices, streamsUsed);
-  // Assign 6 streams per Wifi device
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (adhocDevices.GetN () * 6), "Stream assignment mismatch");
-  streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
-  // Assign 0 additional streams per channel for this configuration 
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (adhocDevices.GetN () * 6), "Stream assignment mismatch");
+  NodeContainer c;
+  c.Create (3);
 
+  // install TCP/IP & OLSR
   OlsrHelper olsr;
-
   InternetStackHelper internet;
   internet.SetRoutingHelper (olsr);
-  internet.Install (adhocNodes);
-  // Assign 3 streams per node to internet stack for this configuration
-  streamsUsed += internet.AssignStreams (adhocNodes, streamsUsed);
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (adhocDevices.GetN () * 6) + (adhocNodes.GetN () * 3), "Stream assignment mismatch");
-  // Olsr uses one additional stream per wifi device for this configuration
-  streamsUsed += olsr.AssignStreams (adhocNodes, 0);
-  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((adhocDevices.GetN () * 6) + (adhocDevices.GetN () * 3) + nWifis), "Should have assigned 3 streams");
+  internet.Install (c);
+  int64_t streamsUsed = olsr.AssignStreams (c, 0);
+  NS_TEST_EXPECT_MSG_EQ (streamsUsed, 3, "Should have assigned 3 streams");
+
+  // create channel & devices
+  SimpleNetDeviceHelper simpleNetHelper;
+  simpleNetHelper.SetDeviceAttribute ("DataRate", StringValue ("10Mbps"));
+  simpleNetHelper.SetChannelAttribute ("Delay", StringValue ("2ms"));
+  NetDeviceContainer nd = simpleNetHelper.Install (c);
 
   Ipv4AddressHelper addressAdhoc;
   addressAdhoc.SetBase ("10.1.1.0", "255.255.255.0");
   Ipv4InterfaceContainer adhocInterfaces;
-  adhocInterfaces = addressAdhoc.Assign (adhocDevices);
+  adhocInterfaces = addressAdhoc.Assign (nd);
+
+  // Blacklist some devices (equivalent to Wireless out of range)
+  Ptr<SimpleNetDevice> nd0 = DynamicCast<SimpleNetDevice> (nd.Get (0));
+  Ptr<SimpleNetDevice> nd2 = DynamicCast<SimpleNetDevice> (nd.Get (2));
+  Ptr<SimpleChannel> ch = DynamicCast<SimpleChannel> (nd.Get (0)->GetChannel ());
+
+  Simulator::Schedule (Seconds (100.0), &SimpleChannel::BlackList, ch, nd0, nd2);
+  Simulator::Schedule (Seconds (100.0), &SimpleChannel::BlackList, ch, nd2, nd0);
+
+  // 3. Setup ping
+  m_socket = Socket::CreateSocket (c.Get (0), TypeId::LookupByName ("ns3::Ipv4RawSocketFactory"));
+  m_socket->SetAttribute ("Protocol", UintegerValue (1)); // icmp
+  m_socket->SetRecvCallback (MakeCallback (&Bug780Test::Receive, this));
+  InetSocketAddress src = InetSocketAddress (Ipv4Address::GetAny (), 0);
+  m_socket->Bind (src);
+  InetSocketAddress dst = InetSocketAddress (adhocInterfaces.GetAddress (2), 0);
+  m_socket->Connect (dst);
 
-  MobilityHelper mobilityAdhoc;
+  SendPing ();
+}
 
-  Ptr<ListPositionAllocator> positionAlloc_Adhoc =
-    CreateObject<ListPositionAllocator>();
-  double distance = 0.0;
-  for (uint32_t i = 0; i <= adhocNodes.GetN (); i++)
+void
+Bug780Test::SendPing ()
+{
+  if (Simulator::Now () >= m_time)
     {
-      positionAlloc_Adhoc->Add (Vector (distance,0.0,0.0));
-      distance += 250.0;
+      return;
     }
 
-  mobilityAdhoc.SetMobilityModel ("ns3::ConstantVelocityMobilityModel");
-  mobilityAdhoc.SetPositionAllocator (positionAlloc_Adhoc);
-  mobilityAdhoc.Install (adhocNodes);
-
-  //At 50 sec node 3 moves towards node 2
-  Simulator::Schedule (Seconds (50.0), &SetVelocity, adhocNodes.Get (2),Vector (-5.0,0.0,0.0));
-  //AT 100 sec set node 3 with zero velocity
-  Simulator::Schedule (Seconds (100.0), &SetVelocity, adhocNodes.Get (2),Vector (0.0,0.0,0.0));
-  //Move node2 away from node 3
-  Simulator::Schedule (Seconds (100.0), &SetVelocity, adhocNodes.Get (1),Vector (5.0,0.0,0.0));
-  //AT 150 sec set node 2 with zero velocity
-  Simulator::Schedule (Seconds (150.0), &SetVelocity, adhocNodes.Get (1), Vector (0.0,0.0,0.0));
-
-
-  // Ping 10.1.1.1 -> 10.1.1.2
-  V4PingHelper ping (adhocInterfaces.GetAddress (1));
-  ping.SetAttribute ("Verbose", BooleanValue (true));
-
-  ApplicationContainer p = ping.Install (adhocNodes.Get (0));
-  p.Start (Seconds (50));
-  p.Stop (Seconds (SimTime) - Seconds (0.001));
-
-  // pcap
-  wifiPhy.EnablePcapAll (CreateTempDirFilename (PREFIX));
+  Ptr<Packet> p = Create<Packet> ();
+  Icmpv4Echo echo;
+  echo.SetSequenceNumber (m_seq);
+  m_seq++;
+  echo.SetIdentifier (0);
+
+  Ptr<Packet> dataPacket = Create<Packet> (56);
+  echo.SetData (dataPacket);
+  p->AddHeader (echo);
+  Icmpv4Header header;
+  header.SetType (Icmpv4Header::ECHO);
+  header.SetCode (0);
+  if (Node::ChecksumEnabled ())
+    {
+      header.EnableChecksum ();
+    }
+  p->AddHeader (header);
+  m_socket->Send (p, 0);
+  Simulator::Schedule (Seconds (1), &Bug780Test::SendPing, this);
 }
 
 void
-Bug780Test::CheckResults ()
+Bug780Test::Receive (Ptr<Socket> socket)
 {
-  for (uint32_t i = 0; i < 2; ++i)
+  while (m_socket->GetRxAvailable () > 0)
     {
-      NS_PCAP_TEST_EXPECT_EQ (PREFIX << "-" << i << "-0.pcap");
+      Address from;
+      Ptr<Packet> p = m_socket->RecvFrom (0xffffffff, 0, from);
+
+      NS_ASSERT (InetSocketAddress::IsMatchingType (from));
+      InetSocketAddress realFrom = InetSocketAddress::ConvertFrom (from);
+      NS_ASSERT (realFrom.GetPort () == 1); // protocol should be icmp.
+      Ipv4Header ipv4;
+      p->RemoveHeader (ipv4);
+      NS_ASSERT (ipv4.GetProtocol () == 1); // protocol should be icmp.
+      Icmpv4Header icmp;
+      p->RemoveHeader (icmp);
+      if (icmp.GetType () == Icmpv4Header::ECHO_REPLY)
+        {
+          m_recvCount ++;
+        }
     }
 }
 
diff -Naur ns-3.23/src/olsr/test/bug780-test.h ns-3.24/src/olsr/test/bug780-test.h
--- ns-3.23/src/olsr/test/bug780-test.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/bug780-test.h	2015-09-15 11:18:44.000000000 -0700
@@ -34,16 +34,23 @@
   Bug780Test (); 
   ~Bug780Test ();
 private:
-  /// Unique PCAP files prefix for this test
-  static const char * const PREFIX;
   /// Total simulation time
   const Time m_time;
   /// Create & configure test network
   void CreateNodes ();
-  /// Compare traces with reference ones
-  void CheckResults ();
   /// Go
   void DoRun ();
+  /// Send one ping
+  void SendPing ();
+  /// Receive echo reply
+  /// \param socket the socket
+  void Receive (Ptr<Socket> socket);
+  /// Socket
+  Ptr<Socket> m_socket;
+  /// Sequence number
+  uint16_t m_seq;
+  /// Received ECHO Reply counter
+  uint16_t m_recvCount;
 };
 
 }
diff -Naur ns-3.23/src/olsr/test/hello-regression-test.cc ns-3.24/src/olsr/test/hello-regression-test.cc
--- ns-3.23/src/olsr/test/hello-regression-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/hello-regression-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -18,6 +18,7 @@
  * Authors: Pavel Boyko <boyko@iitp.ru>
  */
 
+#include <vector>
 #include "hello-regression-test.h"
 #include "ns3/simulator.h"
 #include "ns3/random-variable-stream.h"
@@ -25,24 +26,25 @@
 #include "ns3/double.h"
 #include "ns3/uinteger.h"
 #include "ns3/string.h"
-#include "ns3/pcap-file.h"
 #include "ns3/olsr-helper.h"
 #include "ns3/internet-stack-helper.h"
-#include "ns3/point-to-point-helper.h"
+#include "ns3/simple-net-device-helper.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/abort.h"
-#include "ns3/pcap-test.h"
+#include "ns3/socket-factory.h"
+#include "ns3/ipv4-raw-socket-factory.h"
+#include "ns3/udp-l4-protocol.h"
+#include "ns3/udp-header.h"
+#include "ns3/olsr-header.h"
 
 namespace ns3
 {
 namespace olsr
 {
 
-const char * const HelloRegressionTest::PREFIX = "olsr-hello-regression-test";
-
 HelloRegressionTest::HelloRegressionTest() : 
   TestCase ("Test OLSR Hello messages generation"),
-  m_time (Seconds (5))
+  m_time (Seconds (5)), m_countA (0), m_countB (0)
 {
 }
 
@@ -59,9 +61,10 @@
 
   Simulator::Stop (m_time);
   Simulator::Run ();
-  Simulator::Destroy ();
 
-  CheckResults ();
+  m_rxSocketA = 0;
+  m_rxSocketB = 0;
+  Simulator::Destroy ();
 }
 
 void
@@ -78,26 +81,122 @@
   // Assign OLSR RVs to specific streams
   int64_t streamsUsed = olsr.AssignStreams (c, 0);
   NS_TEST_ASSERT_MSG_EQ (streamsUsed, 2, "Should have assigned 2 streams");
-  // create p2p channel & devices
-  PointToPointHelper p2p;
-  p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-  p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
-  NetDeviceContainer nd = p2p.Install (c);
+  // create channel & devices
+  SimpleNetDeviceHelper simpleNetHelper;
+  simpleNetHelper.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
+  simpleNetHelper.SetChannelAttribute ("Delay", StringValue ("2ms"));
+  NetDeviceContainer nd = simpleNetHelper.Install (c);
   // setup IP addresses
   Ipv4AddressHelper ipv4;
   ipv4.SetBase ("10.1.1.0", "255.255.255.0");
   ipv4.Assign (nd);
-  // setup PCAP traces
-  p2p.EnablePcapAll (CreateTempDirFilename (PREFIX));
+
+  // Create the sockets
+  Ptr<SocketFactory> rxSocketFactoryA = c.Get (0)->GetObject<Ipv4RawSocketFactory> ();
+  m_rxSocketA = DynamicCast<Ipv4RawSocketImpl> (rxSocketFactoryA->CreateSocket ());
+  m_rxSocketA->SetProtocol (UdpL4Protocol::PROT_NUMBER);
+  m_rxSocketA->SetRecvCallback (MakeCallback (&HelloRegressionTest::ReceivePktProbeA, this));
+
+  Ptr<SocketFactory> rxSocketFactoryB = c.Get (1)->GetObject<Ipv4RawSocketFactory> ();
+  m_rxSocketB = DynamicCast<Ipv4RawSocketImpl> (rxSocketFactoryB->CreateSocket ());
+  m_rxSocketB->SetProtocol (UdpL4Protocol::PROT_NUMBER);
+  m_rxSocketB->SetRecvCallback (MakeCallback (&HelloRegressionTest::ReceivePktProbeB, this));
+}
+
+void
+HelloRegressionTest::ReceivePktProbeA (Ptr<Socket> socket)
+{
+  uint32_t availableData;
+  availableData = socket->GetRxAvailable ();
+  Ptr<Packet> receivedPacketProbe = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
+  NS_ASSERT (availableData == receivedPacketProbe->GetSize ());
+
+  Ipv4Header ipHdr;
+  receivedPacketProbe->RemoveHeader (ipHdr);
+  UdpHeader udpHdr;
+  receivedPacketProbe->RemoveHeader (udpHdr);
+  PacketHeader pktHdr;
+  receivedPacketProbe->RemoveHeader (pktHdr);
+  MessageHeader msgHdr;
+  receivedPacketProbe->RemoveHeader (msgHdr);
+
+  const olsr::MessageHeader::Hello &hello = msgHdr.GetHello ();
+  NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address.");
+
+  if (m_countA == 0)
+    {
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, "No Link messages on the first Hello.");
+    }
+  else
+    {
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 1, "One Link message on the second and third Hello.");
+    }
+
+  std::vector<olsr::MessageHeader::Hello::LinkMessage>::const_iterator iter;
+  for (iter = hello.linkMessages.begin (); iter != hello.linkMessages.end (); iter ++)
+    {
+      if (m_countA == 1)
+        {
+          NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 1, "Asymmetric link on second Hello.");
+        }
+      else
+        {
+          NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 6, "Symmetric link on second Hello.");
+        }
+
+      NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses.size (), 1, "Only one neighbor.");
+      NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.1"), "Only one neighbor.");
+    }
+
+  m_countA ++;
 }
 
 void
-HelloRegressionTest::CheckResults ()
+HelloRegressionTest::ReceivePktProbeB (Ptr<Socket> socket)
 {
-  for (uint32_t i = 0; i < 2; ++i)
+  uint32_t availableData;
+  availableData = socket->GetRxAvailable ();
+  Ptr<Packet> receivedPacketProbe = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
+  NS_ASSERT (availableData == receivedPacketProbe->GetSize ());
+
+  Ipv4Header ipHdr;
+  receivedPacketProbe->RemoveHeader (ipHdr);
+  UdpHeader udpHdr;
+  receivedPacketProbe->RemoveHeader (udpHdr);
+  PacketHeader pktHdr;
+  receivedPacketProbe->RemoveHeader (pktHdr);
+  MessageHeader msgHdr;
+  receivedPacketProbe->RemoveHeader (msgHdr);
+
+  const olsr::MessageHeader::Hello &hello = msgHdr.GetHello ();
+  NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.1"), "Originator address.");
+
+  if (m_countA == 0)
     {
-      NS_PCAP_TEST_EXPECT_EQ (PREFIX << "-" << i << "-1.pcap");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, "No Link messages on the first Hello.");
     }
+  else
+    {
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 1, "One Link message on the second and third Hello.");
+    }
+
+  std::vector<olsr::MessageHeader::Hello::LinkMessage>::const_iterator iter;
+  for (iter = hello.linkMessages.begin (); iter != hello.linkMessages.end (); iter ++)
+    {
+      if (m_countA == 1)
+        {
+          NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 1, "Asymmetric link on second Hello.");
+        }
+      else
+        {
+          NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 6, "Symmetric link on second Hello.");
+        }
+
+      NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses.size (), 1, "Only one neighbor.");
+      NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.2"), "Only one neighbor.");
+    }
+
+  m_countB ++;
 }
 
 }
diff -Naur ns-3.23/src/olsr/test/hello-regression-test.h ns-3.24/src/olsr/test/hello-regression-test.h
--- ns-3.23/src/olsr/test/hello-regression-test.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/hello-regression-test.h	2015-09-15 11:18:44.000000000 -0700
@@ -23,6 +23,8 @@
 
 #include "ns3/test.h"
 #include "ns3/nstime.h"
+#include "ns3/socket.h"
+#include "ns3/ipv4-raw-socket-impl.h"
 #include "ns3/node-container.h"
 
 namespace ns3
@@ -53,16 +55,25 @@
   HelloRegressionTest (); 
   ~HelloRegressionTest ();
 private:
-  /// Unique PCAP files prefix for this test
-  static const char * const PREFIX;
   /// Total simulation time
   const Time m_time;
   /// Create & configure test network
   void CreateNodes ();
-  /// Compare traces with reference ones
-  void CheckResults ();
   /// Go
   void DoRun ();
+
+  /// Receive raw data on node A
+  void ReceivePktProbeA (Ptr<Socket> socket);
+  /// Packet counter on node A
+  uint8_t m_countA;
+  /// Receiving socket on node A
+  Ptr<Ipv4RawSocketImpl> m_rxSocketA;
+  /// Receive raw data on node B
+  void ReceivePktProbeB (Ptr<Socket> socket);
+  /// Packet counter on node B
+  uint8_t m_countB;
+  /// Receiving socket on node B
+  Ptr<Ipv4RawSocketImpl> m_rxSocketB;
 };
 
 }
diff -Naur ns-3.23/src/olsr/test/olsr-hello-regression-test-0-1.pcap ns-3.24/src/olsr/test/olsr-hello-regression-test-0-1.pcap
--- ns-3.23/src/olsr/test/olsr-hello-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/olsr-hello-regression-test-0-1.pcap	1969-12-31 16:00:00.000000000 -0800
@@ -1,23 +0,0 @@
-ò            	        2   2    !E  0    @  
-
-       
-          2   2    !E  0    @  
-
-       
-         :   :    !E  8   @  
-
- $     
-      
-   wS :   :    !E  8   @  
-
- $     
-      
-   /  :   :    !E  8   @  
-
- $     
-      
-     :   :    !E  8   @  
-
- $     
-      
-
\ No newline at end of file
diff -Naur ns-3.23/src/olsr/test/olsr-hello-regression-test-1-1.pcap ns-3.24/src/olsr/test/olsr-hello-regression-test-1-1.pcap
--- ns-3.23/src/olsr/test/olsr-hello-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/olsr-hello-regression-test-1-1.pcap	1969-12-31 16:00:00.000000000 -0800
@@ -1,23 +0,0 @@
-ò            	        2   2    !E  0    @  
-
-       
-         v 2   2    !E  0    @  
-
-       
-         :   :    !E  8   @  
-
- $     
-      
-   JK :   :    !E  8   @  
-
- $     
-      
-     :   :    !E  8   @  
-
- $     
-      
-   \  :   :    !E  8   @  
-
- $     
-      
-
\ No newline at end of file
diff -Naur ns-3.23/src/olsr/test/olsr-tc-regression-test-0-1.pcap ns-3.24/src/olsr/test/olsr-tc-regression-test-0-1.pcap
--- ns-3.23/src/olsr/test/olsr-tc-regression-test-0-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/olsr-tc-regression-test-0-1.pcap	1969-12-31 16:00:00.000000000 -0800
@@ -1,108 +0,0 @@
-ò            i        T   T                     E  0    @  
-
-       
-              T   T                     E  0    @  
-
-       
-             \   \                    E  8   @  
-
- $     
-      
-       K d   d                    E  @   @  
-
- ,   $   
-      
-  
-       /  \   \                     E  8   @  
-
- $     
-      
-       S  d   d                     E  @   @  
-
- ,   $   
-      
-  
-       0 d   d               0     E  @   @  
-
- ,   $   
-      
-  
-       G \   \               0     E  8   @  
-
- $     
-    
-  
-         d   d               @     E  @   @  
-
- ,   $   
-      
-  
-       6 \   \               @     E  8   @  
-
- $     
-    
-  
-    
-     |   |               P     E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-    
-   " \   \               P     E  8   @  
-
- $     
-    
-  
-       B \   \               `     E  8   @  
-
- $     
-    
-  
-       y  d   d               `     E  @   @  
-
- ,   $   
-      
-  
-        \   \               p     E  8   @  
-
- $     
-    
-  
-       Y d   d               p     E  @   @  
-
- ,   $   
-      
-  
-       Gu \   \                    E  8   @  
-
- $     
-  	   
-
-       8 \   \                    E  8   @  
-
- $     
-    
-  
-       4 d   d                    E  @ 	  @  
-
- ,   $ 	  
-  
-    
-  
-       U  d   d                    E  @ 
-  @  
-
- ,   $ 
-  
-      
-  
-       C \   \                    E  8 	  @  
-
- $    	 
-  	  
-  
-    
\ No newline at end of file
diff -Naur ns-3.23/src/olsr/test/olsr-tc-regression-test-1-1.pcap ns-3.24/src/olsr/test/olsr-tc-regression-test-1-1.pcap
--- ns-3.23/src/olsr/test/olsr-tc-regression-test-1-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/olsr-tc-regression-test-1-1.pcap	1969-12-31 16:00:00.000000000 -0800
@@ -1,155 +0,0 @@
-ò            i        T   T                     E  0    @  
-
-       
-              T   T                     E  0    @  
-
-       
-             v T   T                     E  0    @  
-
-       
-             \   \                    E  8   @  
-
- $     
-      
-       o \   \                    E  8   @  
-
- $     
-      
-       JK d   d                    E  @   @  
-
- ,   $   
-      
-  
-         \   \                     E  8   @  
-
- $     
-      
-         d   d                     E  @   @  
-
- ,   $   
-      
-  
-        \   \                     E  8   @  
-
- $     
-      
-       , \   \               0     E  8   @  
-
- $     
-    
-  
-        d   d               0     E  @   @  
-
- ,   $   
-      
-  
-       uH \   \               0     E  8   @  
-
- $     
-    
-  
-       T  d   d               @     E  @   @  
-
- ,   $   
-      
-  
-       N \   \               @     E  8   @  
-
- $     
-    
-  
-       E7 \   \               @     E  8   @  
-
- $     
-    
-  
-    
-   8  \   \               P     E  8   @  
-
- $     
-    
-  
-    
-   B  |   |               P     E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-    
-    \   \               P     E  8   @  
-
- $     
-    
-  
-       AC \   \               `     E  8   @  
-
- $     
-    
-  
-       N+ \   \               `     E  8   @  
-
- $     
-    
-  
-        d   d               `     E  @   @  
-
- ,   $   
-      
-  
-        \   \               p     E  8   @  
-
- $     
-    
-  
-       C \   \               p     E  8   @  
-
- $     
-    
-  
-        d   d               p     E  @   @  
-
- ,   $   
-      
-  
-       t \   \                    E  8   @  
-
- $     
-  	   
-
-       9 \   \                    E  8   @  
-
- $     
-    
-  
-        \   \                    E  8   @  
-
- $     
-    
-  
-        d   d                    E  @ 	  @  
-
- ,   $ 	  
-  
-    
-  
-         d   d                    E  @ 
-  @  
-
- ,   $ 
-  
-      
-  
-       D \   \                    E  8 	  @  
-
- $    	 
-  	  
-  
-       m \   \                    E  8 	  @  
-
- $    	 
-  	  
-  
-    
\ No newline at end of file
diff -Naur ns-3.23/src/olsr/test/olsr-tc-regression-test-2-1.pcap ns-3.24/src/olsr/test/olsr-tc-regression-test-2-1.pcap
--- ns-3.23/src/olsr/test/olsr-tc-regression-test-2-1.pcap	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/olsr-tc-regression-test-2-1.pcap	1969-12-31 16:00:00.000000000 -0800
@@ -1,108 +0,0 @@
-ò            i       f T   T                     E  0    @  
-
-       
-              T   T                     E  0    @  
-
-       
-            p \   \                    E  8   @  
-
- $     
-      
-       K d   d                    E  @   @  
-
- ,   $   
-      
-  
-       S  d   d                     E  @   @  
-
- ,   $   
-      
-  
-       q \   \                     E  8   @  
-
- $     
-      
-        \   \               0     E  8   @  
-
- $     
-    
-  
-       0 d   d               0     E  @   @  
-
- ,   $   
-      
-  
-         d   d               @     E  @   @  
-
- ,   $   
-      
-  
-       IN \   \               @     E  8   @  
-
- $     
-    
-  
-    
-   [8  \   \               P     E  8   @  
-
- $     
-    
-  
-    
-     |   |               P     E  X   @  
-
- D   <  
-     
-
-  
-      
-  
-       * \   \               `     E  8   @  
-
- $     
-    
-  
-       y  d   d               `     E  @   @  
-
- ,   $   
-      
-  
-       =C \   \               p     E  8   @  
-
- $     
-    
-  
-       Y d   d               p     E  @   @  
-
- ,   $   
-      
-  
-       Gu \   \                    E  8   @  
-
- $     
-  	   
-
-        \   \                    E  8   @  
-
- $     
-    
-  
-       4 d   d                    E  @ 	  @  
-
- ,   $ 	  
-  
-    
-  
-       U  d   d                    E  @ 
-  @  
-
- ,   $ 
-  
-      
-  
-       m \   \                    E  8 	  @  
-
- $    	 
-  	  
-  
-    
\ No newline at end of file
diff -Naur ns-3.23/src/olsr/test/tc-regression-test.cc ns-3.24/src/olsr/test/tc-regression-test.cc
--- ns-3.23/src/olsr/test/tc-regression-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/tc-regression-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -26,28 +26,27 @@
 #include "ns3/double.h"
 #include "ns3/uinteger.h"
 #include "ns3/string.h"
-#include "ns3/pcap-test.h"
-#include "ns3/pcap-file.h"
 #include "ns3/olsr-helper.h"
 #include "ns3/internet-stack-helper.h"
-#include "ns3/point-to-point-helper.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/abort.h"
-#include "ns3/yans-wifi-helper.h"
-#include "ns3/mobility-helper.h"
-#include "ns3/nqos-wifi-mac-helper.h"
+#include "ns3/socket-factory.h"
+#include "ns3/ipv4-raw-socket-factory.h"
+#include "ns3/udp-l4-protocol.h"
+#include "ns3/udp-header.h"
+#include "ns3/olsr-header.h"
+#include "ns3/simple-net-device-helper.h"
+#include "ns3/simple-net-device.h"
 
 namespace ns3
 {
 namespace olsr
 {
 
-const char * const TcRegressionTest::PREFIX = "olsr-tc-regression-test";
-
 TcRegressionTest::TcRegressionTest() : 
   TestCase ("Test OLSR Topology Control message generation"),
   m_time (Seconds (20)),
-  m_step (120)
+  m_countA (0), m_countB (0), m_countC (0)
 {
 }
 
@@ -64,9 +63,11 @@
 
   Simulator::Stop (m_time);
   Simulator::Run ();
-  Simulator::Destroy ();
 
-  CheckResults ();
+  m_rxSocketA = 0;
+  m_rxSocketB = 0;
+  m_rxSocketC = 0;
+  Simulator::Destroy ();
 }
 
 void
@@ -76,55 +77,238 @@
   NodeContainer c;
   c.Create (3);
 
-  // place nodes in the chain
-  MobilityHelper mobility;
-  mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
-                                 "MinX", DoubleValue (0.0),
-                                 "MinY", DoubleValue (0.0),
-                                 "DeltaX", DoubleValue (m_step),
-                                 "DeltaY", DoubleValue (0),
-                                 "GridWidth", UintegerValue (3),
-                                 "LayoutType", StringValue ("RowFirst"));
-  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
-  mobility.Install (c);
-
   // install TCP/IP & OLSR
   OlsrHelper olsr;
   InternetStackHelper internet;
   internet.SetRoutingHelper (olsr);
   internet.Install (c);
   int64_t streamsUsed = olsr.AssignStreams (c, 0);
-  NS_TEST_EXPECT_MSG_EQ (streamsUsed, 3, "Should have assigned 2 streams");
+  NS_TEST_EXPECT_MSG_EQ (streamsUsed, 3, "Should have assigned 3 streams");
 
-  // create wifi channel & devices
-  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
-  wifiMac.SetType ("ns3::AdhocWifiMac");
-  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
-  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
-  wifiPhy.SetChannel (wifiChannel.Create ());
-  // This test suite output was originally based on YansErrorRateModel 
-  wifiPhy.SetErrorRateModel ("ns3::YansErrorRateModel");
-  WifiHelper wifi = WifiHelper::Default ();
-  wifi.SetStandard (WIFI_PHY_STANDARD_80211a);
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"));
-  NetDeviceContainer nd = wifi.Install (wifiPhy, wifiMac, c); 
+  // create channel & devices
+  SimpleNetDeviceHelper simpleNetHelper;
+  simpleNetHelper.SetDeviceAttribute ("DataRate", StringValue ("10Mbps"));
+  simpleNetHelper.SetChannelAttribute ("Delay", StringValue ("2ms"));
+  NetDeviceContainer nd = simpleNetHelper.Install (c);
+
+  // Blacklist some devices (equivalent to Wireless out of range)
+  Ptr<SimpleNetDevice> nd0 = DynamicCast<SimpleNetDevice> (nd.Get (0));
+  Ptr<SimpleNetDevice> nd2 = DynamicCast<SimpleNetDevice> (nd.Get (2));
+  Ptr<SimpleChannel> ch = DynamicCast<SimpleChannel> (nd.Get (0)->GetChannel ());
+  ch->BlackList (nd0, nd2);
+  ch->BlackList (nd2, nd0);
 
   // setup IP addresses
   Ipv4AddressHelper ipv4;
   ipv4.SetBase ("10.1.1.0", "255.255.255.0");
   ipv4.Assign (nd);
 
-  // setup PCAP traces
-  wifiPhy.EnablePcapAll (CreateTempDirFilename(PREFIX));
+  // Create the sockets
+  Ptr<SocketFactory> rxSocketFactoryA = c.Get (0)->GetObject<Ipv4RawSocketFactory> ();
+  m_rxSocketA = DynamicCast<Ipv4RawSocketImpl> (rxSocketFactoryA->CreateSocket ());
+  m_rxSocketA->SetProtocol (UdpL4Protocol::PROT_NUMBER);
+  m_rxSocketA->SetRecvCallback (MakeCallback (&TcRegressionTest::ReceivePktProbeA, this));
+
+  Ptr<SocketFactory> rxSocketFactoryB = c.Get (1)->GetObject<Ipv4RawSocketFactory> ();
+  m_rxSocketB = DynamicCast<Ipv4RawSocketImpl> (rxSocketFactoryB->CreateSocket ());
+  m_rxSocketB->SetProtocol (UdpL4Protocol::PROT_NUMBER);
+  m_rxSocketB->SetRecvCallback (MakeCallback (&TcRegressionTest::ReceivePktProbeB, this));
+
+  Ptr<SocketFactory> rxSocketFactoryC = c.Get (2)->GetObject<Ipv4RawSocketFactory> ();
+  m_rxSocketC = DynamicCast<Ipv4RawSocketImpl> (rxSocketFactoryC->CreateSocket ());
+  m_rxSocketC->SetProtocol (UdpL4Protocol::PROT_NUMBER);
+  m_rxSocketC->SetRecvCallback (MakeCallback (&TcRegressionTest::ReceivePktProbeC, this));
+}
+
+// Note: this is identical to ReceivePktProbeC, but the packet counter needs to be different.
+void
+TcRegressionTest::ReceivePktProbeA (Ptr<Socket> socket)
+{
+  uint32_t availableData;
+  availableData = socket->GetRxAvailable ();
+  Ptr<Packet> receivedPacketProbe = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
+  NS_ASSERT (availableData == receivedPacketProbe->GetSize ());
+
+  Ipv4Header ipHdr;
+  receivedPacketProbe->RemoveHeader (ipHdr);
+  UdpHeader udpHdr;
+  receivedPacketProbe->RemoveHeader (udpHdr);
+  PacketHeader pktHdr;
+  receivedPacketProbe->RemoveHeader (pktHdr);
+
+  if (m_countA == 0)
+    {
+      MessageHeader msgHdr;
+      receivedPacketProbe->RemoveHeader (msgHdr);
+      const olsr::MessageHeader::Hello &hello = msgHdr.GetHello ();
+      NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, "0 - Hello, No messages.");
+    }
+  else if (m_countA == 1)
+    {
+      MessageHeader msgHdr;
+      receivedPacketProbe->RemoveHeader (msgHdr);
+      NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address.");
+      const olsr::MessageHeader::Hello &hello = msgHdr.GetHello ();
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 2, "1 - Hello, one message.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 1, "1 - Asymmetric Link.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses.size (), 1, "1 - Neighbor.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.3"), "1 - Neighbor.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].linkCode, 1, "1 - Asymmetric Link.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses.size (), 1, "1 - Neighbor.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.1"), "1 - Neighbor.");
+    }
+  else
+    {
+      if (m_countA == 5 || m_countA == 8)
+        {
+          MessageHeader msgHdr;
+          receivedPacketProbe->RemoveHeader (msgHdr);
+          const olsr::MessageHeader::Tc &tc = msgHdr.GetTc ();
+          NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address.");
+          NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses.size (), 2, int(m_countA) << " - TC, one message.");
+          NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses[0], Ipv4Address ("10.1.1.3"), int(m_countA) << " - Neighbor.");
+          NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses[1], Ipv4Address ("10.1.1.1"), int(m_countA) << " - Neighbor.");
+        }
+      if (m_countA != 8)
+        {
+          MessageHeader msgHdr;
+          receivedPacketProbe->RemoveHeader (msgHdr);
+          NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address.");
+          const olsr::MessageHeader::Hello &hello = msgHdr.GetHello ();
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 2, int(m_countA) << " - Hello, one message.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 6, int(m_countA) << " - Symmetric Link.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses.size (), 1, int(m_countA) << " - Neighbor.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.3"), int(m_countA) << " - Neighbor.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].linkCode, 6, int(m_countA) << " - Symmetric Link.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses.size (), 1, int(m_countA) << " - Neighbor.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.1"), int(m_countA) << " - Neighbor.");
+        }
+    }
+  m_countA ++;
+}
+
+void
+TcRegressionTest::ReceivePktProbeB (Ptr<Socket> socket)
+{
+  uint32_t availableData;
+  availableData = socket->GetRxAvailable ();
+  Ptr<Packet> receivedPacketProbe = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
+  NS_ASSERT (availableData == receivedPacketProbe->GetSize ());
+
+  Ipv4Header ipHdr;
+  receivedPacketProbe->RemoveHeader (ipHdr);
+  UdpHeader udpHdr;
+  receivedPacketProbe->RemoveHeader (udpHdr);
+  PacketHeader pktHdr;
+  receivedPacketProbe->RemoveHeader (pktHdr);
+
+  MessageHeader msgHdr;
+  receivedPacketProbe->RemoveHeader (msgHdr);
+  const olsr::MessageHeader::Hello &hello = msgHdr.GetHello ();
+
+  if (m_countB == 0 || m_countB == 2 || m_countB == 5 || m_countB == 6 || m_countB == 8 ||
+      m_countB == 10 || m_countB == 13 || m_countB == 15 || m_countB == 17 || m_countB == 19)
+    {
+      NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.3"), "Originator address.");
+    }
+  else
+    {
+      NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.1"), "Originator address.");
+    }
+
+  if (m_countB == 0 || m_countB == 1)
+    {
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, int(m_countC) << " - Hello, links announced.");
+    }
+  else
+    {
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 1, int(m_countC) << " - Hello, links announced.");
+      if (m_countB == 2 || m_countB == 3)
+        {
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 1, int(m_countC) << " - Asymmetric Link.");
+        }
+      else if (m_countB == 4 || m_countB == 5)
+        {
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 6, int(m_countC) << " - Symmetric Link.");
+        }
+      else
+        {
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 10, int(m_countC) << " - MPR Link.");
+        }
+
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.2"), int(m_countC) << " - Neighbor.");
+    }
+
+  m_countB ++;
 }
 
+// Note: this is identical to ReceivePktProbeA, but the packet counter needs to be different.
 void
-TcRegressionTest::CheckResults ()
+TcRegressionTest::ReceivePktProbeC (Ptr<Socket> socket)
 {
-  for (uint32_t i = 0; i < 3; ++i)
+  uint32_t availableData;
+  availableData = socket->GetRxAvailable ();
+  Ptr<Packet> receivedPacketProbe = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
+  NS_ASSERT (availableData == receivedPacketProbe->GetSize ());
+
+  Ipv4Header ipHdr;
+  receivedPacketProbe->RemoveHeader (ipHdr);
+  UdpHeader udpHdr;
+  receivedPacketProbe->RemoveHeader (udpHdr);
+  PacketHeader pktHdr;
+  receivedPacketProbe->RemoveHeader (pktHdr);
+
+  if (m_countC == 0)
+    {
+      MessageHeader msgHdr;
+      receivedPacketProbe->RemoveHeader (msgHdr);
+      const olsr::MessageHeader::Hello &hello = msgHdr.GetHello ();
+      NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, "0 - Hello, No messages.");
+    }
+  else if (m_countC == 1)
+    {
+      MessageHeader msgHdr;
+      receivedPacketProbe->RemoveHeader (msgHdr);
+      NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address.");
+      const olsr::MessageHeader::Hello &hello = msgHdr.GetHello ();
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 2, "1 - Hello, one message.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 1, "1 - Asymmetric Link.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses.size (), 1, "1 - Neighbor.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.3"), "1 - Neighbor.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].linkCode, 1, "1 - Asymmetric Link.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses.size (), 1, "1 - Neighbor.");
+      NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.1"), "1 - Neighbor.");
+    }
+  else
     {
-      NS_PCAP_TEST_EXPECT_EQ (PREFIX << "-" << i << "-1.pcap");
+      if (m_countC == 5 || m_countC == 8)
+        {
+          MessageHeader msgHdr;
+          receivedPacketProbe->RemoveHeader (msgHdr);
+          const olsr::MessageHeader::Tc &tc = msgHdr.GetTc ();
+          NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address.");
+          NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses.size (), 2, int(m_countC) << " - TC, one message.");
+          NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses[0], Ipv4Address ("10.1.1.3"), int(m_countC) << " - Neighbor.");
+          NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses[1], Ipv4Address ("10.1.1.1"), int(m_countC) << " - Neighbor.");
+        }
+      if (m_countC != 8)
+        {
+          MessageHeader msgHdr;
+          receivedPacketProbe->RemoveHeader (msgHdr);
+          NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address.");
+          const olsr::MessageHeader::Hello &hello = msgHdr.GetHello ();
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 2, int(m_countC) << " - Hello, one message.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 6, int(m_countC) << " - Symmetric Link.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses.size (), 1, int(m_countC) << " - Neighbor.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.3"), int(m_countC) << " - Neighbor.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].linkCode, 6, int(m_countC) << " - Symmetric Link.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses.size (), 1, int(m_countC) << " - Neighbor.");
+          NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.1"), int(m_countC) << " - Neighbor.");
+        }
     }
+  m_countC ++;
 }
 
 }
diff -Naur ns-3.23/src/olsr/test/tc-regression-test.h ns-3.24/src/olsr/test/tc-regression-test.h
--- ns-3.23/src/olsr/test/tc-regression-test.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/test/tc-regression-test.h	2015-09-15 11:18:44.000000000 -0700
@@ -23,6 +23,8 @@
 
 #include "ns3/test.h"
 #include "ns3/nstime.h"
+#include "ns3/socket.h"
+#include "ns3/ipv4-raw-socket-impl.h"
 #include "ns3/node-container.h"
 
 namespace ns3
@@ -33,7 +35,7 @@
  * \ingroup olsr
  * \brief Less trivial test of OLSR Topology Control message generation
  * 
- * This test creates 3 WiFi stations with chain topology and runs OLSR without any extra traffic. 
+ * This test simulates 3 Wi-Fi stations with chain topology and runs OLSR without any extra traffic.
  * It is expected that only second station will send TC messages.
  * 
  * Expected trace (20 seconds, note random b-cast jitter):
@@ -78,18 +80,34 @@
   TcRegressionTest(); 
   ~TcRegressionTest();
 private:
-  /// Unique PCAP files prefix for this test
-  static const char * const PREFIX;
   /// Total simulation time
   const Time m_time;
-  /// Distance between nodes in meters, 0.8 of RX range is recommended
-  const double m_step;
   /// Create & configure test network
   void CreateNodes ();
-  /// Compare traces with reference ones
-  void CheckResults ();
   /// Go
   void DoRun ();
+
+  /// Receive raw data on node A
+  void ReceivePktProbeA (Ptr<Socket> socket);
+  /// Packet counter on node A
+  uint8_t m_countA;
+  /// Receiving socket on node A
+  Ptr<Ipv4RawSocketImpl> m_rxSocketA;
+
+  /// Receive raw data on node B
+  void ReceivePktProbeB (Ptr<Socket> socket);
+  /// Packet counter on node B
+  uint8_t m_countB;
+  /// Receiving socket on node B
+  Ptr<Ipv4RawSocketImpl> m_rxSocketB;
+
+  /// Receive raw data on node C
+  void ReceivePktProbeC (Ptr<Socket> socket);
+  /// Packet counter on node C
+  uint8_t m_countC;
+  /// Receiving socket on node C
+  Ptr<Ipv4RawSocketImpl> m_rxSocketC;
+
 };
 
 }
diff -Naur ns-3.23/src/olsr/wscript ns-3.24/src/olsr/wscript
--- ns-3.23/src/olsr/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/olsr/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -1,7 +1,7 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 def build(bld):
-    module = bld.create_ns3_module('olsr', ['internet', 'config-store', 'point-to-point', 'wifi', 'applications'])
+    module = bld.create_ns3_module('olsr', ['internet'])
     module.includes = '.'
     module.source = [
         'model/olsr-header.cc',
diff -Naur ns-3.23/src/openflow/model/openflow-interface.cc ns-3.24/src/openflow/model/openflow-interface.cc
--- ns-3.23/src/openflow/model/openflow-interface.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/openflow/model/openflow-interface.cc	2015-09-15 11:18:44.000000000 -0700
@@ -650,6 +650,23 @@
     }
 }
 
+/* static */
+TypeId
+Controller::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::ofi::Controller")
+    .SetParent<Object> ()
+    .SetGroupName ("OpenFlow")
+    .AddConstructor<Controller> ()
+    ;
+  return tid;
+}
+
+Controller::~Controller ()
+{
+  m_switches.clear ();
+}
+
 void
 Controller::AddSwitch (Ptr<OpenFlowSwitchNetDevice> swtch)
 {
@@ -736,6 +753,18 @@
     }
 }
 
+/* static */
+TypeId
+DropController::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::ofi::DropController")
+    .SetParent<Controller> ()
+    .SetGroupName ("OpenFlow")
+    .AddConstructor<DropController> ()
+    ;
+  return tid;
+}
+
 void
 DropController::ReceiveFromSwitch (Ptr<OpenFlowSwitchNetDevice> swtch, ofpbuf* buffer)
 {
@@ -766,7 +795,7 @@
 TypeId LearningController::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ofi::LearningController")
-    .SetParent (Controller::GetTypeId ())
+    .SetParent <Controller> ()
     .SetGroupName ("Openflow")
     .AddConstructor<LearningController> ()
     .AddAttribute ("ExpirationTime",
diff -Naur ns-3.23/src/openflow/model/openflow-interface.h ns-3.24/src/openflow/model/openflow-interface.h
--- ns-3.23/src/openflow/model/openflow-interface.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/openflow/model/openflow-interface.h	2015-09-15 11:18:44.000000000 -0700
@@ -346,19 +346,13 @@
 class Controller : public Object
 {
 public:
-  static TypeId GetTypeId (void)
-  {
-    static TypeId tid = TypeId ("ns3::ofi::Controller")
-      .SetParent<Object> ()
-      .AddConstructor<Controller> ()
-    ;
-    return tid;
-  }
-
-  virtual ~Controller ()
-  {
-    m_switches.clear ();
-  }
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  /** Destructor. */
+  virtual ~Controller ();
 
   /**
    * Adds a switch to the controller.
@@ -443,6 +437,12 @@
 class DropController : public Controller
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
   void ReceiveFromSwitch (Ptr<OpenFlowSwitchNetDevice> swtch, ofpbuf* buffer);
 };
 
@@ -456,6 +456,10 @@
 class LearningController : public Controller
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   virtual ~LearningController ()
diff -Naur ns-3.23/src/openflow/model/openflow-switch-net-device.cc ns-3.24/src/openflow/model/openflow-switch-net-device.cc
--- ns-3.23/src/openflow/model/openflow-switch-net-device.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/openflow/model/openflow-switch-net-device.cc	2015-09-15 11:18:44.000000000 -0700
@@ -444,10 +444,11 @@
 }
 
 ofpbuf *
-OpenFlowSwitchNetDevice::BufferFromPacket (Ptr<Packet> packet, Address src, Address dst, int mtu, uint16_t protocol)
+OpenFlowSwitchNetDevice::BufferFromPacket (Ptr<const Packet> constPacket, Address src, Address dst, int mtu, uint16_t protocol)
 {
   NS_LOG_INFO ("Creating Openflow buffer from packet.");
 
+  Ptr<Packet> packet = constPacket->Copy ();
   /*
    * Allocate buffer with some headroom to add headers in forwarding
    * to the controller or adding a vlan tag, plus an extra 2 bytes to
@@ -460,19 +461,26 @@
 
   int l2_length = 0, l3_length = 0, l4_length = 0;
 
-  // Load headers
-  EthernetHeader eth_hd;
-  if (packet->PeekHeader (eth_hd))
-    {
-      buffer->l2 = new eth_header;
-      eth_header* eth_h = (eth_header*)buffer->l2;
-      dst.CopyTo (eth_h->eth_dst);              // Destination Mac Address
-      src.CopyTo (eth_h->eth_src);              // Source Mac Address
+  //Parse Ethernet header
+  buffer->l2 = new eth_header;
+  eth_header* eth_h = (eth_header*)buffer->l2;
+  dst.CopyTo (eth_h->eth_dst);              // Destination Mac Address
+  src.CopyTo (eth_h->eth_src);              // Source Mac Address
+  if (protocol == ArpL3Protocol::PROT_NUMBER)
+    {
+      eth_h->eth_type = htons (ETH_TYPE_ARP);    // Ether Type
+    }
+  else if (protocol == Ipv4L3Protocol::PROT_NUMBER)
+    {
       eth_h->eth_type = htons (ETH_TYPE_IP);    // Ether Type
-      NS_LOG_INFO ("Parsed EthernetHeader");
-
-      l2_length = ETH_HEADER_LEN;
     }
+  else
+    {
+      NS_LOG_WARN ("Protocol unsupported: " << protocol);
+    }
+  NS_LOG_INFO ("Parsed EthernetHeader");
+
+  l2_length = ETH_HEADER_LEN;
 
   // We have to wrap this because PeekHeader has an assert fail if we check for an Ipv4Header that isn't there.
   if (protocol == Ipv4L3Protocol::PROT_NUMBER)
@@ -493,6 +501,7 @@
           ip_h->ip_dst      = htonl (ip_hd.GetDestination ().Get ()); // Destination Address
           ip_h->ip_csum     = csum (&ip_h, sizeof ip_h);        // Header Checksum
           NS_LOG_INFO ("Parsed Ipv4Header");
+          packet->RemoveHeader (ip_hd);
 
           l3_length = IP_HEADER_LEN;
         }
@@ -515,6 +524,7 @@
           arp_h->ar_hln = sizeof arp_h->ar_tha;                         // Hardware address length.
           arp_h->ar_pln = sizeof arp_h->ar_tpa;                         // Protocol address length.
           NS_LOG_INFO ("Parsed ArpHeader");
+          packet->RemoveHeader (arp_hd);
 
           l3_length = ARP_ETH_HEADER_LEN;
         }
@@ -539,6 +549,7 @@
               tcp_h->tcp_urg = tcp_hd.GetUrgentPointer ();      // Urgent Pointer
               tcp_h->tcp_csum = csum (&tcp_h, sizeof tcp_h);    // Header Checksum
               NS_LOG_INFO ("Parsed TcpHeader");
+              packet->RemoveHeader (tcp_hd);
 
               l4_length = TCP_HEADER_LEN;
             }
@@ -562,13 +573,14 @@
               udp_csum = csum_continue (udp_csum, udp_h, sizeof udp_h);
               udp_h->udp_csum = csum_finish (csum_continue (udp_csum, buffer->data, buffer->size)); // Header Checksum
               NS_LOG_INFO ("Parsed UdpHeader");
+              packet->RemoveHeader (udp_hd);
 
               l4_length = UDP_HEADER_LEN;
             }
         }
     }
 
-  // Load Packet data into buffer data
+  // Load any remaining packet data into buffer data
   packet->CopyData ((uint8_t*)buffer->data, packet->GetSize ());
 
   if (buffer->l4)
@@ -1144,7 +1156,7 @@
     }
 
   sw_flow_key key;
-  flow_extract (buffer, opo->in_port, &key.flow); // ntohs(opo->in_port)
+  flow_extract (buffer, ntohs(opo->in_port), &key.flow); // ntohs(opo->in_port)
 
   uint16_t v_code = ofi::ValidateActions (&key, opo->actions, actions_len);
   if (v_code != ACT_VALIDATION_OK)
@@ -1287,7 +1299,7 @@
         {
           sw_flow_key key;
           flow_used (flow, buffer);
-          flow_extract (buffer, ofm->match.in_port, &key.flow); // ntohs(ofm->match.in_port);
+          flow_extract (buffer, ntohs(ofm->match.in_port), &key.flow); // ntohs(ofm->match.in_port);
           ofi::ExecuteActions (this, ofm->buffer_id, buffer, &key, ofm->actions, actions_len, false);
           ofpbuf_delete (buffer);
         }
@@ -1328,7 +1340,7 @@
       if (buffer)
         {
           sw_flow_key skb_key;
-          flow_extract (buffer, ofm->match.in_port, &skb_key.flow); // ntohs(ofm->match.in_port);
+          flow_extract (buffer, ntohs(ofm->match.in_port), &skb_key.flow); // ntohs(ofm->match.in_port);
           ofi::ExecuteActions (this, ofm->buffer_id, buffer, &skb_key, ofm->actions, actions_len, false);
           ofpbuf_delete (buffer);
         }
diff -Naur ns-3.23/src/openflow/model/openflow-switch-net-device.h ns-3.24/src/openflow/model/openflow-switch-net-device.h
--- ns-3.23/src/openflow/model/openflow-switch-net-device.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/openflow/model/openflow-switch-net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -86,6 +86,10 @@
 class OpenFlowSwitchNetDevice : public NetDevice
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -268,7 +272,7 @@
    * \param protocol The protocol defining the packet.
    * \return The OpenFlow Buffer created from the packet.
    */
-  ofpbuf * BufferFromPacket (Ptr<Packet> packet, Address src, Address dst, int mtu, uint16_t protocol);
+  ofpbuf * BufferFromPacket (Ptr<const Packet> packet, Address src, Address dst, int mtu, uint16_t protocol);
 
 private:
   /**
diff -Naur ns-3.23/src/openflow/wscript ns-3.24/src/openflow/wscript
--- ns-3.23/src/openflow/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/openflow/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -16,14 +16,13 @@
 
 def configure(conf):
     if not conf.env['LIB_BOOST']:
-	conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration", False,
+        conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration", False,
 				     "Required boost libraries 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('openflow')
-
-	return 
+        return 
 
     present_boost_libs = []
     for boost_lib_name in conf.env['LIB_BOOST']:
@@ -35,19 +34,18 @@
 
     missing_boost_libs = [lib for lib in REQUIRED_BOOST_LIBS if lib not in present_boost_libs]
     if missing_boost_libs != []:
-	conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration", False,
+        conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration", False,
 				     "Required boost libraries not found, missing: %s" % ', '.join(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('openflow')
-
-	return 
+        return 
 
     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)
+        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'
@@ -59,19 +57,18 @@
             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)
+            conf.env['WITH_OPENFLOW'] = os.path.abspath(openflow_dir)
         del openflow_bake_build_dir
         del openflow_bake_lib_dir
-	del openflow_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,
+        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 
+        return 
 
     test_code = '''
 #include "openflow/openflow.h"
@@ -164,8 +161,8 @@
         ]
 
     if bld.env['OPENFLOW'] and bld.env['DL'] and bld.env['XML2']:
-	obj.use.extend('OPENFLOW DL XML2'.split())
-	obj_test.use.extend('OPENFLOW DL XML2'.split())
+        obj.use.extend('OPENFLOW DL XML2'.split())
+        obj_test.use.extend('OPENFLOW DL XML2'.split())
 
     headers = bld(features='ns3header')
     headers.module = 'openflow'
@@ -173,16 +170,15 @@
         ]
 
     if bld.env['ENABLE_OPENFLOW']:
-	obj.source.append('model/openflow-interface.cc')
+        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.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')
+        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')
+        headers.source.append('helper/openflow-switch-helper.h')
 
     if bld.env['ENABLE_EXAMPLES'] and bld.env['ENABLE_OPENFLOW']:
         bld.recurse('examples')
diff -Naur ns-3.23/src/point-to-point/bindings/modulegen__gcc_ILP32.py ns-3.24/src/point-to-point/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -103,7 +103,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## point-to-point-helper.h (module 'point-to-point'): ns3::PointToPointHelper [class]
@@ -309,6 +309,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -344,6 +350,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -713,17 +726,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -745,11 +758,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -759,16 +767,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1006,14 +1004,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1074,11 +1076,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DataRate_methods(root_module, cls):
@@ -2095,7 +2092,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2113,10 +2110,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2180,10 +2177,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -2379,10 +2376,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -2927,10 +2924,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -3857,11 +3854,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4038,10 +4045,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5708,6 +5715,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5720,6 +5728,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/point-to-point/bindings/modulegen__gcc_LP64.py ns-3.24/src/point-to-point/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/point-to-point/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/point-to-point/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -103,7 +103,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## point-to-point-helper.h (module 'point-to-point'): ns3::PointToPointHelper [class]
@@ -309,6 +309,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -344,6 +350,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -713,17 +726,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -745,11 +758,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -759,16 +767,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1006,14 +1004,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1074,11 +1076,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DataRate_methods(root_module, cls):
@@ -2095,7 +2092,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2113,10 +2110,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2180,10 +2177,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -2379,10 +2376,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -2927,10 +2924,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -3857,11 +3854,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4038,10 +4045,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5708,6 +5715,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5720,6 +5728,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/point-to-point/model/point-to-point-channel.h ns-3.24/src/point-to-point/model/point-to-point-channel.h
--- ns-3.23/src/point-to-point/model/point-to-point-channel.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/point-to-point/model/point-to-point-channel.h	2015-09-15 11:18:44.000000000 -0700
@@ -137,11 +137,13 @@
    * \param [in] rxDevice the Receiving NetDevice.
    * \param [in] duration The amount of time to transmit the packet.
    * \param [in] lastBitTime Last bit receive time (relative to now)
+   * \deprecated The non-const \c Ptr<NetDevice> argument is deprecated
+   * and will be changed to \c Ptr<const NetDevice> in a future release.
    */
   typedef void (* TxRxAnimationCallback)
-    (const Ptr<const Packet> packet,
-     const Ptr<const NetDevice> txDevice, const Ptr<const NetDevice> rxDevice,
-     const Time duration, const Time lastBitTime);
+    (Ptr<const Packet> packet,
+     Ptr<NetDevice> txDevice, Ptr<NetDevice> rxDevice,
+     Time duration, Time lastBitTime);
                     
 private:
   /** Each point to point link has exactly two net devices. */
@@ -158,12 +160,14 @@
    * packet receipt time.
    *
    * \see class CallBackTraceSource
+   * \deprecated The non-const \c Ptr<NetDevice> argument is deprecated
+   * and will be changed to \c Ptr<const NetDevice> in a future release.
    */
-  TracedCallback<Ptr<const Packet>, // Packet being transmitted
-                 Ptr<NetDevice>,    // Transmitting NetDevice
-                 Ptr<NetDevice>,    // Receiving NetDevice
-                 Time,              // Amount of time to transmit the pkt
-                 Time               // Last bit receive time (relative to now)
+  TracedCallback<Ptr<const Packet>,     // Packet being transmitted
+                 Ptr<NetDevice>,  // Transmitting NetDevice
+                 Ptr<NetDevice>,  // Receiving NetDevice
+                 Time,                  // Amount of time to transmit the pkt
+                 Time                   // Last bit receive time (relative to now)
                  > m_txrxPointToPoint;
 
   /** \brief Wire states
diff -Naur ns-3.23/src/point-to-point/model/point-to-point-net-device.h ns-3.24/src/point-to-point/model/point-to-point-net-device.h
--- ns-3.23/src/point-to-point/model/point-to-point-net-device.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/point-to-point/model/point-to-point-net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -164,11 +164,6 @@
 
   virtual bool IsLinkUp (void) const;
 
-  /**
-   * TracedCallback signature for link changed event.
-   */
-  typedef void (* LinkChangeTracedCallback) (void);
-  
   virtual void AddLinkChangeCallback (Callback<void> callback);
 
   virtual bool IsBroadcast (void) const;
diff -Naur ns-3.23/src/point-to-point/test/point-to-point-test.cc ns-3.24/src/point-to-point/test/point-to-point-test.cc
--- ns-3.23/src/point-to-point/test/point-to-point-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/point-to-point/test/point-to-point-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 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/test.h"
 #include "ns3/drop-tail-queue.h"
 #include "ns3/simulator.h"
diff -Naur ns-3.23/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py ns-3.24/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -94,6 +94,10 @@
     module.add_class('Ipv6InterfaceContainer', import_from_module='ns.internet')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
@@ -127,7 +131,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -292,6 +296,10 @@
     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'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -332,6 +340,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -367,6 +381,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -397,6 +418,7 @@
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -482,6 +504,8 @@
     register_Ns3Ipv6PmtuCache_methods(root_module, root_module['ns3::Ipv6PmtuCache'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     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'])
@@ -858,17 +882,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -890,11 +914,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -904,16 +923,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1151,14 +1160,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1219,11 +1232,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -2121,6 +2129,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -2523,7 +2603,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2541,10 +2621,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2608,10 +2688,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3045,10 +3125,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3952,10 +4032,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -5106,11 +5186,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -6321,6 +6411,46 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -7040,6 +7170,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -7052,6 +7183,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py ns-3.24/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -94,6 +94,10 @@
     module.add_class('Ipv6InterfaceContainer', import_from_module='ns.internet')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
@@ -127,7 +131,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -292,6 +296,10 @@
     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'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -332,6 +340,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -367,6 +381,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
@@ -397,6 +418,7 @@
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -482,6 +504,8 @@
     register_Ns3Ipv6PmtuCache_methods(root_module, root_module['ns3::Ipv6PmtuCache'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     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'])
@@ -858,17 +882,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -890,11 +914,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -904,16 +923,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1151,14 +1160,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1219,11 +1232,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -2121,6 +2129,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -2523,7 +2603,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2541,10 +2621,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -2608,10 +2688,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3045,10 +3125,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3952,10 +4032,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -5106,11 +5186,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -6321,6 +6411,46 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -7040,6 +7170,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -7052,6 +7183,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/point-to-point-layout/model/point-to-point-dumbbell.h ns-3.24/src/point-to-point-layout/model/point-to-point-dumbbell.h
--- ns-3.23/src/point-to-point-layout/model/point-to-point-dumbbell.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/point-to-point-layout/model/point-to-point-dumbbell.h	2015-09-15 11:18:44.000000000 -0700
@@ -78,6 +78,7 @@
 
   /**
    * \returns pointer to the i'th left side leaf node
+   * \param i node number
    */
   Ptr<Node> GetLeft (uint32_t i) const;
 
@@ -89,26 +90,31 @@
 
   /**
    * \returns pointer to the i'th left side leaf node
+   * \param i node number
    */
   Ptr<Node> GetRight (uint32_t i) const;
 
   /**
    * \returns an Ipv4Address of the i'th left leaf
+   * \param i node number
    */
   Ipv4Address GetLeftIpv4Address (uint32_t i ) const; // Get left leaf address
 
   /**
    * \returns an Ipv4Address of the i'th right leaf
+   * \param i node number
    */
-  Ipv4Address GetRightIpv4Address (uint32_t i) const; // Get right leaf address
+  Ipv4Address GetRightIpv4Address (uint32_t i) const;
 
   /**
    * \returns an Ipv6Address of the i'th left leaf
+   * \param i node number
    */
   Ipv6Address GetLeftIpv6Address (uint32_t i ) const; // Get left leaf address
 
   /**
    * \returns an Ipv6Address of the i'th right leaf
+   * \param i node number
    */
   Ipv6Address GetRightIpv6Address (uint32_t i) const; // Get right leaf address
 
@@ -161,24 +167,24 @@
   void      BoundingBox (double ulx, double uly, double lrx, double lry);
 
 private:
-  NodeContainer          m_leftLeaf;
-  NetDeviceContainer     m_leftLeafDevices;
-  NodeContainer          m_rightLeaf;
-  NetDeviceContainer     m_rightLeafDevices;
-  NodeContainer          m_routers;
-  NetDeviceContainer     m_routerDevices; // just two connecting the routers
-  NetDeviceContainer     m_leftRouterDevices;
-  NetDeviceContainer     m_rightRouterDevices;
-  Ipv4InterfaceContainer m_leftLeafInterfaces;
-  Ipv4InterfaceContainer m_leftRouterInterfaces;
-  Ipv4InterfaceContainer m_rightLeafInterfaces;
-  Ipv4InterfaceContainer m_rightRouterInterfaces;
-  Ipv4InterfaceContainer m_routerInterfaces;
-  Ipv6InterfaceContainer m_leftLeafInterfaces6;
-  Ipv6InterfaceContainer m_leftRouterInterfaces6;
-  Ipv6InterfaceContainer m_rightLeafInterfaces6;
-  Ipv6InterfaceContainer m_rightRouterInterfaces6;
-  Ipv6InterfaceContainer m_routerInterfaces6;
+  NodeContainer          m_leftLeaf;            //!< Left Leaf nodes
+  NetDeviceContainer     m_leftLeafDevices;     //!< Left Leaf NetDevices
+  NodeContainer          m_rightLeaf;           //!< Right Leaf nodes
+  NetDeviceContainer     m_rightLeafDevices;    //!< Right Leaf NetDevices
+  NodeContainer          m_routers;             //!< Routers
+  NetDeviceContainer     m_routerDevices;       //!< Routers NetDevices
+  NetDeviceContainer     m_leftRouterDevices;     //!< Left router NetDevices
+  NetDeviceContainer     m_rightRouterDevices;    //!< Right router NetDevices
+  Ipv4InterfaceContainer m_leftLeafInterfaces;    //!< Left Leaf interfaces (IPv4)
+  Ipv4InterfaceContainer m_leftRouterInterfaces;  //!< Left router interfaces (IPv4)
+  Ipv4InterfaceContainer m_rightLeafInterfaces;   //!< Right Leaf interfaces (IPv4)
+  Ipv4InterfaceContainer m_rightRouterInterfaces; //!< Right router interfaces (IPv4)
+  Ipv4InterfaceContainer m_routerInterfaces;      //!< Router interfaces (IPv4)
+  Ipv6InterfaceContainer m_leftLeafInterfaces6;   //!< Left Leaf interfaces (IPv6)
+  Ipv6InterfaceContainer m_leftRouterInterfaces6; //!< Left router interfaces (IPv6)
+  Ipv6InterfaceContainer m_rightLeafInterfaces6;  //!< Right Leaf interfaces (IPv6)
+  Ipv6InterfaceContainer m_rightRouterInterfaces6;  //!< Right router interfaces (IPv6)
+  Ipv6InterfaceContainer m_routerInterfaces6;     //!< Router interfaces (IPv6)
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/point-to-point-layout/model/point-to-point-grid.h ns-3.24/src/point-to-point-layout/model/point-to-point-grid.h
--- ns-3.23/src/point-to-point-layout/model/point-to-point-grid.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/point-to-point-layout/model/point-to-point-grid.h	2015-09-15 11:18:44.000000000 -0700
@@ -142,15 +142,15 @@
   void BoundingBox (double ulx, double uly, double lrx, double lry);
 
 private:
-  uint32_t m_xSize;
-  uint32_t m_ySize;
-  std::vector<NetDeviceContainer> m_rowDevices;
-  std::vector<NetDeviceContainer> m_colDevices;
-  std::vector<Ipv4InterfaceContainer> m_rowInterfaces;
-  std::vector<Ipv4InterfaceContainer> m_colInterfaces;
-  std::vector<Ipv6InterfaceContainer> m_rowInterfaces6;
-  std::vector<Ipv6InterfaceContainer> m_colInterfaces6;
-  std::vector<NodeContainer> m_nodes;
+  uint32_t m_xSize;   //!< X size of the grid (number of columns)
+  uint32_t m_ySize;   //!< Y size of the grid (number of rows)
+  std::vector<NetDeviceContainer> m_rowDevices;         //!< NetDevices in a row
+  std::vector<NetDeviceContainer> m_colDevices;         //!< NetDevices in a column
+  std::vector<Ipv4InterfaceContainer> m_rowInterfaces;  //!< IPv4 interfaces in a row
+  std::vector<Ipv4InterfaceContainer> m_colInterfaces;  //!< IPv4 interfaces in a column
+  std::vector<Ipv6InterfaceContainer> m_rowInterfaces6; //!< IPv6 interfaces in a row
+  std::vector<Ipv6InterfaceContainer> m_colInterfaces6; //!< IPv6 interfaces in a column
+  std::vector<NodeContainer> m_nodes; //!< all the nodes in the grid
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/point-to-point-layout/model/point-to-point-star.h ns-3.24/src/point-to-point-layout/model/point-to-point-star.h
--- ns-3.23/src/point-to-point-layout/model/point-to-point-star.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/point-to-point-layout/model/point-to-point-star.h	2015-09-15 11:18:44.000000000 -0700
@@ -139,14 +139,14 @@
   void BoundingBox (double ulx, double uly, double lrx, double lry);
 
 private:
-  NodeContainer m_hub;
-  NetDeviceContainer m_hubDevices;
-  NodeContainer m_spokes;
-  NetDeviceContainer m_spokeDevices;
-  Ipv4InterfaceContainer m_hubInterfaces;
-  Ipv4InterfaceContainer m_spokeInterfaces;
-  Ipv6InterfaceContainer m_hubInterfaces6;
-  Ipv6InterfaceContainer m_spokeInterfaces6;
+  NodeContainer m_hub;              //!< Hub node
+  NetDeviceContainer m_hubDevices;  //!< Hub node NetDevices
+  NodeContainer m_spokes;                     //!< Spoke nodes
+  NetDeviceContainer m_spokeDevices;          //!< Spoke nodes NetDevices
+  Ipv4InterfaceContainer m_hubInterfaces;     //!< IPv4 hub interfaces
+  Ipv4InterfaceContainer m_spokeInterfaces;   //!< IPv4 spoke nodes interfaces
+  Ipv6InterfaceContainer m_hubInterfaces6;    //!< IPv6 hub interfaces
+  Ipv6InterfaceContainer m_spokeInterfaces6;  //!< IPv6 spoke nodes interfaces
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/propagation/bindings/modulegen__gcc_ILP32.py ns-3.24/src/propagation/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/propagation/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/propagation/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -210,6 +210,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -245,6 +251,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
@@ -382,11 +395,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -1775,11 +1783,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -1993,10 +2011,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -2905,6 +2923,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -2917,6 +2936,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/propagation/bindings/modulegen__gcc_LP64.py ns-3.24/src/propagation/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/propagation/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/propagation/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -210,6 +210,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -245,6 +251,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
@@ -382,11 +395,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -1775,11 +1783,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -1993,10 +2011,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -2905,6 +2923,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -2917,6 +2936,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/propagation/doc/propagation.rst ns-3.24/src/propagation/doc/propagation.rst
--- ns-3.23/src/propagation/doc/propagation.rst	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/propagation/doc/propagation.rst	2015-09-15 11:18:44.000000000 -0700
@@ -1,6 +1,8 @@
 .. include:: replace.txt
 .. highlight:: cpp
 
+.. _Propagation:
+
 Propagation
 -----------
 
diff -Naur ns-3.23/src/sixlowpan/bindings/modulegen__gcc_ILP32.py ns-3.24/src/sixlowpan/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/sixlowpan/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/sixlowpan/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -60,6 +60,10 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
@@ -244,6 +248,10 @@
     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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -286,6 +294,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -321,6 +335,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -339,6 +360,7 @@
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
@@ -415,6 +437,8 @@
     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_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
@@ -553,17 +577,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -585,11 +609,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -599,16 +618,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -846,14 +855,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -914,11 +927,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -1423,6 +1431,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -1761,7 +1841,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -3840,11 +3920,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -3954,10 +4044,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -4324,6 +4414,46 @@
                    is_virtual=True)
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -5183,6 +5313,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5195,6 +5326,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/sixlowpan/bindings/modulegen__gcc_LP64.py ns-3.24/src/sixlowpan/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/sixlowpan/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/sixlowpan/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -60,6 +60,10 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
@@ -244,6 +248,10 @@
     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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -286,6 +294,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -321,6 +335,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -339,6 +360,7 @@
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
@@ -415,6 +437,8 @@
     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_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
@@ -553,17 +577,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -585,11 +609,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -599,16 +618,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -846,14 +855,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -914,11 +927,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -1423,6 +1431,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -1761,7 +1841,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -3840,11 +3920,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -3954,10 +4044,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -4324,6 +4414,46 @@
                    is_virtual=True)
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -5183,6 +5313,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5195,6 +5326,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/sixlowpan/examples/example-ping-lr-wpan.cc ns-3.24/src/sixlowpan/examples/example-ping-lr-wpan.cc
--- ns-3.23/src/sixlowpan/examples/example-ping-lr-wpan.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/sixlowpan/examples/example-ping-lr-wpan.cc	2015-09-15 11:18:44.000000000 -0700
@@ -49,13 +49,6 @@
   NodeContainer nodes;
   nodes.Create(2);
 
-  LrWpanHelper lrWpanHelper;
-  // Add and install the LrWpanNetDevice for each node
-  NetDeviceContainer lrwpanDevices = lrWpanHelper.Install(nodes);
-
-  // Fake PAN association and short address assignment.
-  lrWpanHelper.AssociateToPan (lrwpanDevices, 0);
-
   MobilityHelper mobility;
   mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
@@ -68,6 +61,12 @@
   mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
   mobility.Install (nodes);
   
+  LrWpanHelper lrWpanHelper;
+  // Add and install the LrWpanNetDevice for each node
+  NetDeviceContainer lrwpanDevices = lrWpanHelper.Install(nodes);
+
+  // Fake PAN association and short address assignment.
+  lrWpanHelper.AssociateToPan (lrwpanDevices, 0);
 
   InternetStackHelper internetv6;
   internetv6.Install (nodes);
diff -Naur ns-3.23/src/sixlowpan/helper/sixlowpan-helper.h ns-3.24/src/sixlowpan/helper/sixlowpan-helper.h
--- ns-3.23/src/sixlowpan/helper/sixlowpan-helper.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/sixlowpan/helper/sixlowpan-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -46,8 +46,8 @@
    * Set an attribute on each ns3::SixlowpanNetDevice created by
    * SixlowpanHelper::Install.
    *
-   * \param n1 the name of the attribute to set
-   * \param v1 the value of the attribute to set
+   * \param n1 [in] The name of the attribute to set.
+   * \param v1 [in] The value of the attribute to set.
    */
   void SetDeviceAttribute (std::string n1,
                            const AttributeValue &v1);
@@ -74,8 +74,8 @@
    * examples directory.
    *
    *
-   * \param c the NetDevice container
-   * \return a container with the newly created SixLowPanNetDevices
+   * \param [in] c The NetDevice container.
+   * \return A container with the newly created SixLowPanNetDevices.
    */
   NetDeviceContainer Install (NetDeviceContainer c);
 
@@ -85,15 +85,15 @@
   * have been assigned. The Install() method should have previously been
   * called by the user.
   *
-  * \param c NetDeviceContainer of the set of net devices for which the
-  *          SixLowPanNetDevice should be modified to use a fixed stream
-  * \param stream first stream index to use
-  * \return the number of stream indices assigned by this helper
+  * \param [in] c NetDeviceContainer of the set of net devices for which the
+  *          SixLowPanNetDevice should be modified to use a fixed stream.
+  * \param [in] stream First stream index to use.
+  * \return The number of stream indices assigned by this helper.
   */
   int64_t AssignStreams (NetDeviceContainer c, int64_t stream);
 
 private:
-  ObjectFactory m_deviceFactory; //!< Object factory
+  ObjectFactory m_deviceFactory; //!< Object factory.
 };
 
 } // namespace ns3
diff -Naur ns-3.23/src/sixlowpan/model/sixlowpan-header.h ns-3.24/src/sixlowpan/model/sixlowpan-header.h
--- ns-3.23/src/sixlowpan/model/sixlowpan-header.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/sixlowpan/model/sixlowpan-header.h	2015-09-15 11:18:44.000000000 -0700
@@ -48,7 +48,7 @@
 {
 public:
   /**
-   *  \brief Dispatch values, as defined in RFC4944 and RFC6282
+   *  \brief Dispatch values, as defined in \RFC{4944} and \RFC{6282}
   \verbatim
      Pattern    Header Type
    +------------+------------------------------------------------+
@@ -112,15 +112,15 @@
 
   /**
    * \brief Get the Dispatch type.
-   * \param dispatch the dispatch value
-   * \return the Dispatch type
+   * \param [in] dispatch The dispatch value.
+   * \return The Dispatch type.
    */
   static Dispatch_e GetDispatchType (uint8_t dispatch);
 
   /**
    * \brief Get the NhcDispatch type.
-   * \param dispatch the dispatch value
-   * \return the NhcDispatch type
+   * \param [in] dispatch The dispatch value.
+   * \return The NhcDispatch type.
    */
   static NhcDispatch_e GetNhcDispatchType (uint8_t dispatch);
 
@@ -128,7 +128,7 @@
 
 /**
  * \ingroup sixlowpan
- * \brief 6LoWPAN HC1 header - see RFC 4944
+ * \brief 6LoWPAN HC1 header - see \RFC{4944}.
  */
 class SixLowPanHc1 : public Header
 {
@@ -138,7 +138,7 @@
    *
    * The address compression is handled in 4 bits and might mean:
    * PI: Prefix inline, PC: Prefix Compressed,
-   * II: Interface Identifier, Inline, IC: Interface Identifier Compressed
+   * II: Interface Identifier, Inline, IC: Interface Identifier Compressed.
    */
   enum LowPanHc1Addr_e
   {
@@ -166,13 +166,13 @@
 
   /**
    * \brief Get the type ID.
-   * \return the object TypeId
+   * \return The object TypeId.
    */
   static TypeId GetTypeId (void);
 
   /**
    * \brief Return the instance type identifier.
-   * \return instance type ID
+   * \return Instance type ID.
    */
 
   virtual TypeId GetInstanceTypeId (void) const;
@@ -181,195 +181,195 @@
 
   /**
    * \brief Get the serialized size of the packet.
-   * \return size
+   * \return Size.
    */
   virtual uint32_t GetSerializedSize (void) const;
 
   /**
    * \brief Serialize the packet.
-   * \param start Buffer iterator
+   * \param [in] start Buffer iterator.
    */
   virtual void Serialize (Buffer::Iterator start) const;
 
   /**
    * \brief Deserialize the packet.
-   * \param start Buffer iterator
-   * \return size of the packet
+   * \param [in] start Buffer iterator.
+   * \return Size of the packet.
    */
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
   /**
    * \brief Set the "Hop limit" field (TTL).
-   * \param limit the hop limit value
+   * \param [in] Limit The hop limit value.
    */
   void SetHopLimit (uint8_t limit);
 
   /**
    * \brief Get the "Hop limit" field (TTL).
-   * \return the hop limit value
+   * \return The hop limit value.
    */
   uint8_t GetHopLimit (void) const;
 
   /**
-   * \brief Get Destination Compression type
-   * \returns the kind of address compression
+   * \brief Get Destination Compression type.
+   * \returns The kind of address compression.
    */
   LowPanHc1Addr_e GetDstCompression () const;
 
   /**
-   * \brief Get the destination interface
-   * \returns the destination interface
+   * \brief Get the destination interface.
+   * \returns The destination interface.
    */
   const uint8_t* GetDstInterface () const;
 
   /**
-   * \brief Get the destination prefix
-   * \returns the destination prefix
+   * \brief Get the destination prefix.
+   * \returns The destination prefix.
    */
   const uint8_t* GetDstPrefix () const;
 
   /**
-   * \brief Get the Flow Label value
-   * \returns the Flow Label
+   * \brief Get the Flow Label value.
+   * \returns The Flow Label.
    */
   uint32_t GetFlowLabel () const;
 
   /**
-   * \brief Get the Next Header value
-   * \returns the Next Header value
+   * \brief Get the Next Header value.
+   * \returns The Next Header value.
    */
   uint8_t GetNextHeader () const;
 
   /**
-   * \brief Get Source Compression type
-   * \returns the kind of address compression
+   * \brief Get Source Compression type.
+   * \returns The kind of address compression.
    */
   LowPanHc1Addr_e GetSrcCompression () const;
 
   /**
-   * \brief Get the source interface
-   * \returns the source interface
+   * \brief Get the source interface.
+   * \returns The source interface.
    */
   const uint8_t* GetSrcInterface () const;
 
   /**
-   * \brief Get the source prefix
-   * \returns the source prefix
+   * \brief Get the source prefix.
+   * \returns The source prefix.
    */
   const uint8_t* GetSrcPrefix () const;
 
   /**
-   * \brief Get the Traffic Class value
-   * \returns the Traffic Class value
+   * \brief Get the Traffic Class value.
+   * \returns The Traffic Class value.
    */
   uint8_t GetTrafficClass () const;
 
   /**
-   * \brief Check if the Traffic Class and Flow Labels are compressed
-   * \returns true if TC and FL are compressed
+   * \brief Check if the Traffic Class and Flow Labels are compressed.
+   * \returns True if TC and FL are compressed.
    */
   bool IsTcflCompression () const;
 
   /**
-   * \brief Check if there is a HC2 compressed header
-   * \returns true if next header is HC2 copressed
+   * \brief Check if there is a HC2 compressed header.
+   * \returns True if next header is HC2 compressed.
    */
   bool IsHc2HeaderPresent () const;
 
   /**
-   * \brief Set Destination Compression type
-   * \param dstCompression the kind of address compression
+   * \brief Set Destination Compression type.
+   * \param [in] dstCompression The kind of address compression.
    */
   void SetDstCompression (LowPanHc1Addr_e dstCompression);
 
   /**
-   * \brief Set the destination interface
-   * \param dstInterface the destination interface
+   * \brief Set the destination interface.
+   * \param [in] dstInterface The destination interface.
    */
   void SetDstInterface (const uint8_t* dstInterface);
 
   /**
-   * \brief Set the destination prefix
-   * \param dstPrefix the destination prefix
+   * \brief Set the destination prefix.
+   * \param [in] dstPrefix The destination prefix.
    */
   void SetDstPrefix (const uint8_t* dstPrefix);
 
   /**
-   * \brief Set the Flow Label value
-   * \param flowLabel the Flow Label
+   * \brief Set the Flow Label value.
+   * \param [in] flowLabel The Flow Label.
    */
   void SetFlowLabel (uint32_t flowLabel);
 
   /**
-   * \brief Set the Next Header value
-   * \param nextHeader the Next Header value
+   * \brief Set the Next Header value.
+   * \param [in] nextHeader The Next Header value.
    */
   void SetNextHeader (uint8_t nextHeader);
 
   /**
-   * \brief Set Source Compression type
-   * \param srcCompression the kind of address compression
+   * \brief Set Source Compression type.
+   * \param [in] srcCompression The kind of address compression.
    */
   void SetSrcCompression (LowPanHc1Addr_e srcCompression);
 
   /**
-   * \brief Set the source interface
-   * \param srcInterface the source interface
+   * \brief Set the source interface.
+   * \param [in] srcInterface The source interface.
    */
   void SetSrcInterface (const uint8_t* srcInterface);
 
   /**
-   * \brief Set the source prefix
-   * \param srcPrefix the source prefix
+   * \brief Set the source prefix.
+   * \param [in] srcPrefix The source prefix.
    */
   void SetSrcPrefix (const uint8_t* srcPrefix);
 
   /**
-   * \brief Set the Traffic Class and Flow Labels as compressed
-   * \param tcflCompression true if TC and FL are compressed
+   * \brief Set the Traffic Class and Flow Labels as compressed.
+   * \param [in] tcflCompression True if TC and FL are compressed.
    */
   void SetTcflCompression (bool tcflCompression);
 
   /**
-   * \brief Set the next header a HC2 compressed header
-   * \param hc2HeaderPresent true if next header is HC2 compressed
+   * \brief Set the next header a HC2 compressed header.
+   * \param [in] hc2HeaderPresent True if next header is HC2 compressed.
    */
   void SetHc2HeaderPresent (bool hc2HeaderPresent);
 
   /**
-   * \brief Set the Traffic Class value
-   * \param trafficClass the Traffic Class value
+   * \brief Set the Traffic Class value.
+   * \param [in] trafficClass The Traffic Class value.
    */
   void SetTrafficClass (uint8_t trafficClass);
 
 private:
-  uint8_t m_hopLimit;           //!< Hop Limit
-  uint8_t m_srcPrefix[8];       //!< Source prefix
-  uint8_t m_srcInterface[8];    //!< Source interface
-  uint8_t m_dstPrefix[8];       //!< Destination prefix
-  uint8_t m_dstInterface[8];    //!< Destination interface
-  uint8_t m_trafficClass;       //!< Traffic Class
-  uint32_t m_flowLabel;         //!< Flow Label
-  uint8_t m_nextHeader;         //!< Next header
-  LowPanHc1Addr_e m_srcCompression; //!< Source compression type
-  LowPanHc1Addr_e m_dstCompression; //!< Destination compression type
-  bool m_tcflCompression;       //!< is TC and FL compressed
-  LowPanHc1NextHeader_e m_nextHeaderCompression; //!< next header compression
-  bool m_hc2HeaderPresent;      //!< is next header HC2 compressed
+  uint8_t m_hopLimit;           //!< Hop Limit.
+  uint8_t m_srcPrefix[8];       //!< Source prefix.
+  uint8_t m_srcInterface[8];    //!< Source interface.
+  uint8_t m_dstPrefix[8];       //!< Destination prefix.
+  uint8_t m_dstInterface[8];    //!< Destination interface.
+  uint8_t m_trafficClass;       //!< Traffic Class.
+  uint32_t m_flowLabel;         //!< Flow Label.
+  uint8_t m_nextHeader;         //!< Next header.
+  LowPanHc1Addr_e m_srcCompression; //!< Source compression type.
+  LowPanHc1Addr_e m_dstCompression; //!< Destination compression type.
+  bool m_tcflCompression;       //!< Is TC and FL compressed.
+  LowPanHc1NextHeader_e m_nextHeaderCompression; //!< Next header compression.
+  bool m_hc2HeaderPresent;      //!< Is next header HC2 compressed.
 };
 
 /**
  * \brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param header the HC1 Header
- * \returns the reference to the output stream
+ * \param [in] os The reference to the output stream.
+ * \param [in] header The HC1 Header.
+ * \returns The reference to the output stream.
  */
 std::ostream & operator<< (std::ostream & os, SixLowPanHc1 const &header);
 
 /**
  * \ingroup sixlowpan
- * \brief 6LoWPAN FRAG1 header - see RFC 4944
+ * \brief 6LoWPAN FRAG1 header - see \RFC{4944}.
  */
 class SixLowPanFrag1 : public Header
 {
@@ -378,13 +378,13 @@
 
   /**
    * \brief Get the type ID.
-   * \return the object TypeId
+   * \return The object TypeId.
    */
   static TypeId GetTypeId (void);
 
   /**
    * \brief Return the instance type identifier.
-   * \return instance type ID
+   * \return Instance type ID.
    */
   virtual TypeId GetInstanceTypeId (void) const;
 
@@ -392,65 +392,65 @@
 
   /**
    * \brief Get the serialized size of the packet.
-   * \return size
+   * \return Size.
    */
   virtual uint32_t GetSerializedSize (void) const;
 
   /**
    * \brief Serialize the packet.
-   * \param start Buffer iterator
+   * \param [in] start Buffer iterator.
    */
   virtual void Serialize (Buffer::Iterator start) const;
 
   /**
    * \brief Deserialize the packet.
-   * \param start Buffer iterator
-   * \return size of the packet
+   * \param [in] start Buffer iterator.
+   * \return Size of the packet.
    */
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
   /**
-   * \brief Set the datagram size
-   * \param datagramSize the datagram size
+   * \brief Set the datagram size.
+   * \param [in] datagramSize The datagram size.
    */
   void SetDatagramSize (uint16_t datagramSize);
 
   /**
-   * \brief Get the datagram size
-   * \returns the datagram size
+   * \brief Get the datagram size.
+   * \returns The datagram size.
    */
   uint16_t GetDatagramSize (void) const;
 
   /**
-   * \brief Set the datagram tag
-   * \param datagramTag the datagram tag
+   * \brief Set the datagram tag.
+   * \param [in] datagramTag The datagram tag.
    */
   void SetDatagramTag (uint16_t datagramTag);
 
   /**
-   * \brief Get the datagram tag
-   * \returns the datagram tag
+   * \brief Get the datagram tag.
+   * \returns The datagram tag.
    */
   uint16_t GetDatagramTag (void) const;
 
 private:
-  uint16_t m_datagramSize; //!< datagram size
-  uint16_t m_datagramTag;  //!< datagram tag
+  uint16_t m_datagramSize; //!< Datagram size.
+  uint16_t m_datagramTag;  //!< Datagram tag.
 
 };
 
 /**
  * \brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param header the Frag1 Header
- * \returns the reference to the output stream
+ * \param [in] os The reference to the output stream.
+ * \param [in] header The Frag1 Header.
+ * \returns The reference to the output stream.
  */
 std::ostream & operator<< (std::ostream & os, SixLowPanFrag1 const & header);
 
 /**
  * \ingroup sixlowpan
- * \brief 6LoWPAN FRAGN header - see RFC 4944
+ * \brief 6LoWPAN FRAGN header - see \RFC{4944}.
  */
 class SixLowPanFragN : public Header
 {
@@ -459,13 +459,13 @@
 
   /**
    * \brief Get the type ID.
-   * \return the object TypeId
+   * \return The object TypeId.
    */
   static TypeId GetTypeId (void);
 
   /**
    * \brief Return the instance type identifier.
-   * \return instance type ID
+   * \return Instance type ID.
    */
   virtual TypeId GetInstanceTypeId (void) const;
 
@@ -473,78 +473,78 @@
 
   /**
    * \brief Get the serialized size of the packet.
-   * \return size
+   * \return Size.
    */
   virtual uint32_t GetSerializedSize (void) const;
 
   /**
    * \brief Serialize the packet.
-   * \param start Buffer iterator
+   * \param [in] start Buffer iterator.
    */
   virtual void Serialize (Buffer::Iterator start) const;
 
   /**
    * \brief Deserialize the packet.
-   * \param start Buffer iterator
-   * \return size of the packet
+   * \param [in] start Buffer iterator.
+   * \return Size of the packet.
    */
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
   /**
-   * \brief Set the datagram size
-   * \param datagramSize the datagram size
+   * \brief Set the datagram size.
+   * \param [in] datagramSize The datagram size.
    */
   void SetDatagramSize (uint16_t datagramSize);
 
   /**
-   * \brief Get the datagram size
-   * \returns the datagram size
+   * \brief Get the datagram size.
+   * \returns The datagram size.
    */
   uint16_t GetDatagramSize (void) const;
 
   /**
-   * \brief Set the datagram tag
-   * \param datagramTag the datagram tag
+   * \brief Set the datagram tag.
+   * \param [in] datagramTag The datagram tag.
    */
   void SetDatagramTag (uint16_t datagramTag);
 
   /**
-   * \brief Get the datagram tag
-   * \returns the datagram tag
+   * \brief Get the datagram tag.
+   * \returns The datagram tag.
    */
   uint16_t GetDatagramTag (void) const;
 
   /**
-   * \brief Set the datagram offset
-   * \param datagramOffset the datagram offset
+   * \brief Set the datagram offset.
+   * \param [in] datagramOffset The datagram offset.
    */
   void SetDatagramOffset (uint8_t datagramOffset);
 
   /**
-   * \brief Get the datagram offset
-   * \returns the datagram offset
+   * \brief Get the datagram offset.
+   * \returns The datagram offset.
    */
   uint8_t GetDatagramOffset (void) const;
 
 private:
-  uint16_t m_datagramSize;  //!< datagram size
-  uint16_t m_datagramTag;   //!< datagram tag
-  uint8_t m_datagramOffset; //!< datagram offset
+  uint16_t m_datagramSize;  //!< Datagram size.
+  uint16_t m_datagramTag;   //!< Datagram tag.
+  uint8_t m_datagramOffset; //!< Datagram offset.
 
 };
 
 /**
  * \brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param header the FragN Header
- * \returns the reference to the output stream
+ * \param [in] os The reference to the output stream.
+ * \param [in] header The FragN Header.
+ * \returns The reference to the output stream.
  */
 std::ostream & operator<< (std::ostream & os, SixLowPanFragN const &header);
 
 /**
  * \ingroup sixlowpan
- * \brief 6LoWPAN IPv6 uncompressed header - see RFC 4944
+ * \brief 6LoWPAN IPv6 uncompressed header - see \RFC{4944}.
  */
 class SixLowPanIpv6 : public Header
 {
@@ -553,13 +553,13 @@
 
   /**
    * \brief Get the type ID.
-   * \return the object TypeId
+   * \return The object TypeId.
    */
   static TypeId GetTypeId (void);
 
   /**
    * \brief Return the instance type identifier.
-   * \return instance type ID
+   * \return Instance type ID.
    */
   virtual TypeId GetInstanceTypeId (void) const;
 
@@ -567,20 +567,20 @@
 
   /**
    * \brief Get the serialized size of the packet.
-   * \return size
+   * \return Size.
    */
   virtual uint32_t GetSerializedSize (void) const;
 
   /**
    * \brief Serialize the packet.
-   * \param start Buffer iterator
+   * \param [in] start Buffer iterator.
    */
   virtual void Serialize (Buffer::Iterator start) const;
 
   /**
    * \brief Deserialize the packet.
-   * \param start Buffer iterator
-   * \return size of the packet
+   * \param [in] start Buffer iterator.
+   * \return Size of the packet.
    */
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
@@ -589,15 +589,15 @@
 /**
  * \brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param header the Frag1 Header
- * \returns the reference to the output stream
+ * \param [in] os The reference to the output stream.
+ * \param [in] header The Frag1 Header.
+ * \returns The reference to the output stream.
  */
 std::ostream & operator<< (std::ostream & os, SixLowPanIpv6 const & header);
 
 /**
 * \ingroup sixlowpan
-* \brief   LOWPAN_IPHC base Encoding - see RFC 6282
+* \brief   LOWPAN_IPHC base Encoding - see \RFC{6282}.
   \verbatim
        0                                       1
        0   1   2   3   4   5   6   7   8   9   0   1   2   3   4   5
@@ -610,7 +610,7 @@
 {
 public:
   /**
-   *  \brief TF: Traffic Class, Flow Label
+   *  \brief TF: Traffic Class, Flow Label.
    *
    *  00:  ECN + DSCP + 4-bit Pad + Flow Label (4 bytes)
    *  01:  ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided.
@@ -627,7 +627,7 @@
   };
 
   /**
-   *  \brief HLIM: Hop Limit
+   *  \brief HLIM: Hop Limit.
    *
    *  00:  The Hop Limit field is carried in-line.
    *  01:  The Hop Limit field is compressed and the hop limit is 1.
@@ -643,7 +643,7 @@
   };
 
   /**
-   *  \brief Source or Destination Address Mode
+   *  \brief Source or Destination Address Mode.
    *
    *  00:  128 bits.
    *  01:  64 bits (or 48 bits if multicast).
@@ -660,20 +660,20 @@
 
   SixLowPanIphc (void);
   /**
-   * \brief Constructor
-   * \param dispatch dispatch value
+   * \brief Constructor.
+   * \param [in] dispatch Dispatch value.
    */
   SixLowPanIphc (uint8_t dispatch);
 
   /**
    * \brief Get the type ID.
-   * \return the object TypeId
+   * \return The object TypeId.
    */
   static TypeId GetTypeId (void);
 
   /**
    * \brief Return the instance type identifier.
-   * \return instance type ID
+   * \return Instance type ID.
    */
   virtual TypeId GetInstanceTypeId (void) const;
 
@@ -681,258 +681,258 @@
 
   /**
    * \brief Get the serialized size of the packet.
-   * \return size
+   * \return Size.
    */
   virtual uint32_t GetSerializedSize (void) const;
 
   /**
    * \brief Serialize the packet.
-   * \param start Buffer iterator
+   * \param [in] start Buffer iterator.
    */
   virtual void Serialize (Buffer::Iterator start) const;
 
   /**
    * \brief Deserialize the packet.
-   * \param start Buffer iterator
-   * \return size of the packet
+   * \param [in] start Buffer iterator.
+   * \return Size of the packet.
    */
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
   /**
    * \brief Set the TF (Traffic Class, Flow Label) compression.
-   * \param tfField ECN, DSCP, Flow Label compression type
+   * \param [in] tfField ECN, DSCP, Flow Label compression type.
    */
   void SetTf (TrafficClassFlowLabel_e tfField);
 
   /**
    * \brief Get the TF (Traffic Class, Flow Label) compression.
-   * \return the ECN, DSCP, Flow Label compression type
+   * \return The ECN, DSCP, Flow Label compression type.
    */
   TrafficClassFlowLabel_e GetTf (void) const;
 
   /**
    * \brief Set the NH (Next Header) compression.
-   * \param nhField false (Next Header carried in-line), true (compressed NH)
+   * \param [in] nhField False (Next Header carried in-line), true (compressed NH).
    */
   void SetNh (bool nhField);
 
   /**
    * \brief Get the NH (Next Header) compression.
-   * \return false (Next Header carried in-line), true (compressed NH)
+   * \return False (Next Header carried in-line), true (compressed NH).
    */
   bool GetNh (void) const;
 
   /**
    * \brief Set the HLIM (Hop Limit) compression.
-   * \param hlimField Hop Limit compression type
+   * \param [in] hlimField Hop Limit compression type
    */
   void SetHlim (Hlim_e hlimField);
 
   /**
    * \brief Get the HLIM (Hop Limit) compression.
-   * \return Hop Limit compression type
+   * \return Hop Limit compression type.
    */
   Hlim_e GetHlim (void) const;
 
   /**
    * \brief Set the CID (Context Identifier Extension) compression.
-   * \param cidField false (no CID present), true (CID follows)
+   * \param [in] cidField False (no CID present), true (CID follows).
    */
   void SetCid (bool cidField);
 
   /**
    * \brief Get the CID (Context Identifier Extension) compression.
-   * \return false (no CID present), true (CID follows)
+   * \return False (no CID present), true (CID follows).
    */
   bool GetCid (void) const;
 
   /**
    * \brief Set the SAC (Source Address Compression) compression.
-   * \param sacField false (stateless), true (stateful)
+   * \param [in] sacField False (stateless), true (stateful).
    */
   void SetSac (bool sacField);
 
   /**
    * \brief Get the SAC (Source Address Compression) compression.
-   * \return false (stateless), true (stateful)
+   * \return False (stateless), true (stateful).
    */
   bool GetSac (void) const;
 
   /**
    * \brief Set the SAM (Source Address Mode) compression.
-   * \param samField - depends on the SAC
+   * \param [in] samField Depends on the SAC.
    */
   void SetSam (HeaderCompression_e samField);
 
   /**
    * \brief Get the SAM (Source Address Mode) compression.
-   * \return depends on the SAC field
+   * \return Depends on the SAC field.
    */
   HeaderCompression_e GetSam (void) const;
 
   /**
    * \brief Set the M (Multicast) compression.
-   * \param mField true if destination is multicast
+   * \param [in] mField True if destination is multicast.
    */
   void SetM (bool mField);
 
   /**
    * \brief Get the M (Multicast) compression.
-   * \return true if destination is multicast
+   * \return True if destination is multicast.
    */
   bool GetM (void) const;
 
   /**
    * \brief Set the DAC (Destination Address Compression) compression.
-   * \param dacField false (stateless), true (stateful)
+   * \param [in] dacField False (stateless), true (stateful).
    */
   void SetDac (bool dacField);
 
   /**
    * \brief Get the DAC (Destination Address Compression) compression.
-   * \return false (stateless), true (stateful)
+   * \return False (stateless), true (stateful).
    */
   bool GetDac (void) const;
 
   /**
    * \brief Set the DAM (Destination Address Mode) compression.
-   * \param damField - depends on the DAC and M fields
+   * \param [in] damField Depends on the DAC and M fields.
    */
   void SetDam (HeaderCompression_e damField);
 
   /**
    * \brief Get the DAM (Destination Address Mode) compression.
-   * \return depends on the DAC and M fields
+   * \return Depends on the DAC and M fields.
    */
   HeaderCompression_e GetDam (void) const;
 
   /**
    * \brief Set the SrcContextId.
-   * \param srcContextId - valid values are [0:15]
+   * \param [in] srcContextId Valid values are [0:15].
    */
   void SetSrcContextId (uint8_t srcContextId);
 
   /**
    * \brief Get the SrcContextId.
-   * \return the SrcContextId
+   * \return The SrcContextId.
    */
   uint8_t GetSrcContextId (void) const;
 
   /**
    * \brief Set the DstContextId.
-   * \param dstContextId - valid values are [0:15]
+   * \param [in] dstContextId Valid values are [0:15].
    */
   void SetDstContextId (uint8_t dstContextId);
 
   /**
    * \brief Get the DstContextId.
-   * \return the DstContextId
+   * \return The DstContextId.
    */
   uint8_t GetDstContextId (void) const;
 
   /**
    * \brief Set the ECN (2bits).
-   * \param ecn - valid values are [0:3]
+   * \param [in] ecn Valid values are [0:3].
    */
   void SetEcn (uint8_t ecn);
 
   /**
    * \brief Get the ECN.
-   * \return the ECN
+   * \return The ECN.
    */
   uint8_t GetEcn (void) const;
 
   /**
    * \brief Set the DSCP (6bits).
-   * \param dscp - valid values are [0:63]
+   * \param [in] dscp Valid values are [0:63].
    */
   void SetDscp (uint8_t dscp);
 
   /**
    * \brief Get the DSCP.
-   * \return the DSCP
+   * \return The DSCP.
    */
   uint8_t GetDscp (void) const;
 
   /**
    * \brief Set the Flow Label (20bits).
-   * \param flowLabel - valid values are 20 bits long.
+   * \param [in] flowLabel Valid values are 20 bits long.
    */
   void SetFlowLabel (uint32_t flowLabel);
 
   /**
    * \brief Get the Flow Label.
-   * \return the Flow Label
+   * \return The Flow Label.
    */
   uint32_t GetFlowLabel (void) const;
 
   /**
    * \brief Set the Next Header field.
-   * \param nextHeader Next Header field.
+   * \param [in] nextHeader Next Header field.
    */
   void SetNextHeader (uint8_t nextHeader);
 
   /**
    * \brief Get the Next Header field.
-   * \return the Next Header field.
+   * \return The Next Header field.
    */
   uint8_t GetNextHeader (void) const;
 
   /**
    * \brief Set the Hop Limit field.
-   * \param hopLimit Hop Limit field.
+   * \param [in] hopLimit Hop Limit field.
    */
   void SetHopLimit (uint8_t hopLimit);
 
   /**
    * \brief Get the Hop Limit field.
-   * \return the Hop Limit field.
+   * \return The Hop Limit field.
    */
   uint8_t GetHopLimit (void) const;
 
   /**
    * \brief Set the Source Address.
-   * \param srcAddress the Source Address.
+   * \param [in] srcAddress The Source Address.
    */
   void SetSrcAddress (Ipv6Address srcAddress);
 
   /**
    * \brief Get the Source Address.
-   * \return the Source Address.
+   * \return The Source Address.
    */
   Ipv6Address GetSrcAddress () const;
 
   /**
    * \brief Set the Destination Address.
-   * \param dstAddress the Destination Address.
+   * \param [in] dstAddress The Destination Address.
    */
   void SetDstAddress (Ipv6Address dstAddress);
 
   /**
    * \brief Get the Destination Address.
-   * \return the Destination Address.
+   * \return The Destination Address.
    */
   Ipv6Address GetDstAddress () const;
 
 private:
-  uint16_t m_baseFormat;      //!< Dispatch + encoding fields
-  uint8_t m_srcdstContextId;  //!< Src and Dst Context ID
-  uint8_t m_ecn : 2;          //!< ECN bits
-  uint8_t m_dscp : 6;         //!< DSCP bits
-  uint32_t m_flowLabel : 20;  //!< Flow Label bits
-  uint8_t m_nextHeader;       //!< Next header
-  uint8_t m_hopLimit;         //!< Hop Limit
-  Ipv6Address m_srcAddress;   //!< Src address
-  Ipv6Address m_dstAddress;   //!< Dst address
+  uint16_t m_baseFormat;      //!< Dispatch + encoding fields.
+  uint8_t m_srcdstContextId;  //!< Src and Dst Context ID.
+  uint8_t m_ecn : 2;          //!< ECN bits.
+  uint8_t m_dscp : 6;         //!< DSCP bits.
+  uint32_t m_flowLabel : 20;  //!< Flow Label bits.
+  uint8_t m_nextHeader;       //!< Next header.
+  uint8_t m_hopLimit;         //!< Hop Limit.
+  Ipv6Address m_srcAddress;   //!< Src address.
+  Ipv6Address m_dstAddress;   //!< Dst address.
 
   /**
    * \brief Post-process the Source address stateful compression
-   * \note currently unsupported
+   * \note Currently unsupported.
    */
   void PostProcessSac ();
   /**
-   * \brief Post-process the Destination address stateful compression
-   * \note currently unsupported
+   * \brief Post-process the Destination address stateful compression.
+   * \note Currently unsupported.
    */
   void PostProcessDac ();
 
@@ -941,15 +941,15 @@
 /**
  * \brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param header the IPHC Header
- * \returns the reference to the output stream
+ * \param [in] os The reference to the output stream.
+ * \param [in] header The IPHC Header.
+ * \returns The reference to the output stream.
  */
 std::ostream & operator<< (std::ostream & os, SixLowPanIphc const &header);
 
 /**
 * \ingroup sixlowpan
-* \brief   LOWPAN_NHC Extension Header Encoding - see RFC 6282
+* \brief   LOWPAN_NHC Extension Header Encoding - see \RFC{6282}.
   \verbatim
      0   1   2   3   4   5   6   7
    +---+---+---+---+---+---+---+---+
@@ -961,14 +961,14 @@
 {
 public:
   /**
-   *  \brief EID: IPv6 Extension Header ID
+   *  \brief EID: IPv6 Extension Header ID.
    *
    *   EID: IPv6 Extension Header ID:
-   *      0: IPv6 Hop-by-Hop Options Header [RFC2460]
-   *      1: IPv6 Routing Header [RFC2460]
-   *      2: IPv6 Fragment Header [RFC2460]
-   *      3: IPv6 Destination Options Header [RFC2460]
-   *      4: IPv6 Mobility Header [RFC6275]
+   *      0: IPv6 Hop-by-Hop Options Header [\RFC{2460}]
+   *      1: IPv6 Routing Header [\RFC{2460}]
+   *      2: IPv6 Fragment Header [\RFC{2460}]
+   *      3: IPv6 Destination Options Header [\RFC{2460}]
+   *      4: IPv6 Mobility Header [\RFC{6275}]
    *      5: Reserved
    *      6: Reserved
    *      7: IPv6 Header
@@ -987,13 +987,13 @@
 
   /**
    * \brief Get the type ID.
-   * \return the object TypeId
+   * \return The object TypeId.
    */
   static TypeId GetTypeId (void);
 
   /**
    * \brief Return the instance type identifier.
-   * \return instance type ID
+   * \return Instance type ID.
    */
   virtual TypeId GetInstanceTypeId (void) const;
 
@@ -1001,100 +1001,100 @@
 
   /**
    * \brief Get the serialized size of the packet.
-   * \return size
+   * \return Size.
    */
   virtual uint32_t GetSerializedSize (void) const;
 
   /**
    * \brief Serialize the packet.
-   * \param start Buffer iterator
+   * \param [in] start Buffer iterator.
    */
   virtual void Serialize (Buffer::Iterator start) const;
 
   /**
    * \brief Deserialize the packet.
-   * \param start Buffer iterator
-   * \return size of the packet
+   * \param [in] start Buffer iterator.
+   * \return Size of the packet.
    */
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
   /**
    * \brief Get the NhcDispatch type.
-   * \return the NhcDispatch type
+   * \return The NhcDispatch type.
    */
   virtual SixLowPanDispatch::NhcDispatch_e GetNhcDispatchType (void) const;
 
   /**
    * \brief Set the Extension Header Type.
-   * \param extensionHeaderType the Extension Header Type
+   * \param [in] extensionHeaderType The Extension Header Type.
    */
   void SetEid (Eid_e extensionHeaderType);
 
   /**
    * \brief Get the Extension Header Type.
-   * \return the Extension Header Type
+   * \return The Extension Header Type.
    */
   Eid_e GetEid (void) const;
 
   /**
    * \brief Set the Next Header field values.
-   * \param nextHeader the Next Header field value
+   * \param [in] nextHeader The Next Header field value.
    */
   void SetNextHeader (uint8_t nextHeader);
 
   /**
    * \brief Get the Next Header field value.
-   * \return the Next Header field value
+   * \return The Next Header field value.
    */
   uint8_t GetNextHeader (void) const;
 
   /**
    * \brief Set the NH field values.
-   * \param nhField the NH field value
+   * \param [in] nhField The NH field value.
    */
   void SetNh (bool nhField);
 
   /**
    * \brief Get the Next Header field value.
-   * \return the NH field value
+   * \return The NH field value.
    */
   bool GetNh (void) const;
 
   /**
    * \brief Set the option header data blob.
-   * \param blob a buffer holding the blob data
-   * \param size the data blob size
+   * \param [in] blob A buffer holding the blob data.
+   * \param [in] size The data blob size.
    */
   void SetBlob (const uint8_t* blob, uint32_t size);
 
   /**
    * \brief Get the option header data blob.
-   * \param blob a buffer to copy the blob data into
-   * \param size the size of the buffer
-   * \return the length of the copied data
+   * \param [in] blob A buffer to copy the blob data into.
+   * \param [in] size The size of the buffer.
+   * \return The length of the copied data.
    */
   uint32_t CopyBlob (uint8_t* blob, uint32_t size) const;
 
 private:
-  uint8_t m_nhcExtensionHeader; //!< NHC extension header type
-  uint8_t m_nhcNextHeader;      //!< Next header
-  uint8_t m_nhcBlobLength;      //!< Length of the NHC compressed header
-  uint8_t m_nhcBlob[256];       //!< NHC compressed header
+  uint8_t m_nhcExtensionHeader; //!< NHC extension header type.
+  uint8_t m_nhcNextHeader;      //!< Next header.
+  uint8_t m_nhcBlobLength;      //!< Length of the NHC compressed header.
+  uint8_t m_nhcBlob[256];       //!< NHC compressed header.
 };
 
 /**
  * \brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param header the NHC Extension Header
- * \returns the reference to the output stream
+ * \param [in] os The reference to the output stream.
+ * \param [in] header The NHC Extension Header.
+ * \returns The reference to the output stream.
  */
 std::ostream & operator<< (std::ostream & os, SixLowPanNhcExtension const &header);
 
 
 /**
 * \ingroup sixlowpan
-* \brief   UDP LOWPAN_NHC Extension Header Encoding - see RFC 6282
+* \brief   UDP LOWPAN_NHC Extension Header Encoding - see \RFC{6282}.
   \verbatim
      0   1   2   3   4   5   6   7
    +---+---+---+---+---+---+---+---+
@@ -1124,14 +1124,14 @@
   SixLowPanUdpNhcExtension (void);
 
   /**
-   * \brief Return the instance type identifier.
-   * \return instance type ID
+   * \brief Get the type ID.
+   * \return The object TypeId.
    */
   static TypeId GetTypeId (void);
 
   /**
    * \brief Return the instance type identifier.
-   * \return instance type ID
+   * \return Instance type ID.
    */
   virtual TypeId GetInstanceTypeId (void) const;
 
@@ -1139,102 +1139,102 @@
 
   /**
    * \brief Get the serialized size of the packet.
-   * \return size
+   * \return Size.
    */
   virtual uint32_t GetSerializedSize (void) const;
 
   /**
    * \brief Serialize the packet.
-   * \param start Buffer iterator
+   * \param [in] start Buffer iterator.
    */
   virtual void Serialize (Buffer::Iterator start) const;
 
   /**
    * \brief Deserialize the packet.
-   * \param start Buffer iterator
-   * \return size of the packet
+   * \param [in] start Buffer iterator.
+   * \return Size of the packet.
    */
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
   /**
    * \brief Get the NhcDispatch type.
-   * \return the NhcDispatch type
+   * \return The NhcDispatch type.
    */
   virtual SixLowPanDispatch::NhcDispatch_e GetNhcDispatchType (void) const;
 
   /**
    * \brief Set the compressed Src and Dst Ports.
-   * \param port Src and Dst the Ports
+   * \param [in] port Src and Dst Ports.
    */
   void SetPorts (Ports_e port);
 
   /**
    * \brief Get the compressed Src and Dst Ports.
-   * \return the Src and Dst Ports
+   * \return The Src and Dst Ports.
    */
   Ports_e GetPorts (void) const;
 
   /**
-   * \brief Set the Destination Port.
-   * \param port the Destination Port.
+   * \brief Set the Source Port.
+   * \param [in] port The Source Port.
    */
   void SetSrcPort (uint16_t port);
 
   /**
-   * \brief Get the Destination Port.
-   * \return the Destination Port.
+   * \brief Get the Source Port.
+   * \return The Source Port.
    */
   uint16_t GetSrcPort () const;
 
   /**
    * \brief Set the Destination Port.
-   * \param port the Destination Port.
+   * \param [in] port The Destination Port.
    */
   void SetDstPort (uint16_t port);
 
   /**
    * \brief Get the Destination Port.
-   * \return the Destination Port.
+   * \return The Destination Port.
    */
   uint16_t GetDstPort () const;
 
   /**
    * \brief Set the C (Checksum).
-   * \param cField false (All checksum carried in-line), true (Checksum elided)
+   * \param [in] cField False (All checksum carried in-line), true (Checksum elided).
    */
   void SetC (bool cField);
 
   /**
    * \brief Get the C (Checksum).
-   * \return false (All checksum carried in-line), true (Checksum elided)
+   * \return False (All checksum carried in-line), true (Checksum elided).
    */
   bool GetC (void) const;
 
   /**
    * \brief Set the Checksum field values.
-   * \param checksum the Checksum field value
+   * \param [in] checksum The Checksum field value.
    */
   void SetChecksum (uint16_t checksum);
 
   /**
    * \brief Get the Checksum field value.
-   * \return the Checksum field value
+   * \return The Checksum field value.
    */
   uint16_t GetChecksum (void) const;
 
 private:
-  uint8_t m_baseFormat; //!< Dispatch + encoding fields
-  uint16_t m_checksum;  //!< Checksum
-  uint16_t m_srcPort;   //!< Source port
-  uint16_t m_dstPort;   //!< Destination port
+  uint8_t m_baseFormat; //!< Dispatch + encoding fields.
+  uint16_t m_checksum;  //!< Checksum.
+  uint16_t m_srcPort;   //!< Source port.
+  uint16_t m_dstPort;   //!< Destination port.
 };
 
 /**
  * \brief Stream insertion operator.
  *
- * \param os the reference to the output stream
- * \param header the UDP NHC Extension Header
- * \returns the reference to the output stream
+ * \param [in] os The reference to the output stream.
+ * \param [in] header The UDP NHC Extension Header.
+ * \returns The reference to the output stream.
  */
 std::ostream & operator<< (std::ostream & os, SixLowPanUdpNhcExtension const &header);
 
diff -Naur ns-3.23/src/sixlowpan/model/sixlowpan-net-device.h ns-3.24/src/sixlowpan/model/sixlowpan-net-device.h
--- ns-3.23/src/sixlowpan/model/sixlowpan-net-device.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/sixlowpan/model/sixlowpan-net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -39,11 +39,11 @@
 
 /**
  * \defgroup sixlowpan 6LoWPAN
- * \brief Performs 6LoWPAN compression of IPv6 packets as specified by RFC 4944 and RFC 6282
+ * \brief Performs 6LoWPAN compression of IPv6 packets as specified by \RFC{4944} and \RFC{6282}
  *
  * This module acts as a shim between IPv6 and a generic NetDevice.
  *
- * The module implements RFCs 4944 and 6282, with the following exceptions:
+ * The module implements \RFC{4944} and \RFC{6282}, with the following exceptions:
  * <ul>
  * <li> MESH and LOWPAN_BC0 dispatch types are not supported </li>
  * <li> HC2 encoding is not supported </li>
@@ -76,7 +76,7 @@
 
   /**
    * \brief Get the type ID.
-   * \return the object TypeId
+   * \return The object TypeId.
    */
   static TypeId GetTypeId (void);
 
@@ -95,10 +95,10 @@
 
   /**
    * \brief Returns the link-layer MTU for this interface.
-   * If the link-layer MTU is smaller than IPv6's minimum MTU (RFC 4944),
+   * If the link-layer MTU is smaller than IPv6's minimum MTU (\RFC{4944}),
    * 1280 will be returned.
    *
-   * \return the link-level MTU in bytes for this interface.
+   * \return The link-level MTU in bytes for this interface.
    */
   virtual uint16_t GetMtu (void) const;
   virtual bool IsLinkUp (void) const;
@@ -122,7 +122,7 @@
   /**
    * \brief Returns a smart pointer to the underlying NetDevice.
    *
-   * \return a smart pointer to the underlying NetDevice.
+   * \return A smart pointer to the underlying NetDevice.
    */
   Ptr<NetDevice> GetNetDevice () const;
 
@@ -131,7 +131,7 @@
    * All the packets incoming and outgoing from the NetDevice will be
    * processed by SixLowPanNetDevice.
    *
-   * \param device a smart pointer to the NetDevice to be proxied.
+   * \param [in] device A smart pointer to the NetDevice to be proxied.
    */
   void SetNetDevice (Ptr<NetDevice> device);
 
@@ -140,8 +140,8 @@
    * 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
+   * \param [in] stream First stream index to use.
+   * \return the number of stream indices assigned by this model.
    */
   int64_t AssignStreams (int64_t stream);
 
@@ -149,26 +149,31 @@
    * TracedCallback signature for packet send/receive events.
    *
    * \param [in] packet The packet.
-   * \param [in] sixNetDevice The SixLowPanNetDevice
+   * \param [in] sixNetDevice The SixLowPanNetDevice.
    * \param [in] ifindex The ifindex of the device.
+   * \deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
+   * is deprecated and will be changed to \c Ptr<const SixLowPanNetDevice>
+   * in a future release.
    */
   typedef void (* RxTxTracedCallback)
-    (const Ptr<const Packet> packet,
-     const Ptr<const SixLowPanNetDevice> sixNetDevice,
-     const uint32_t ifindex);
+    (Ptr<const Packet> packet, Ptr<SixLowPanNetDevice> sixNetDevice,
+     uint32_t ifindex);
 
   /**
    * TracedCallback signature for
    *
    * \param [in] reason The reason for the drop.
    * \param [in] packet The packet.
-   * \param [in] sixNetDevice The SixLowPanNetDevice
+   * \param [in] sixNetDevice The SixLowPanNetDevice.
    * \param [in] ifindex The ifindex of the device.
+   * \deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
+   * is deprecated and will be changed to \c Ptr<const SixLowPanNetDevice>
+   * in a future release.
    */
   typedef void (* DropTracedCallback)
-    (const DropReason reason, const Ptr<const Packet> packet,
-     const Ptr<const SixLowPanNetDevice> sixNetDevice,
-     const uint32_t ifindex);
+    (DropReason reason, Ptr<const Packet> packet,
+     Ptr<SixLowPanNetDevice> sixNetDevice,
+     uint32_t ifindex);
    
 protected:
   virtual void DoDispose (void);
@@ -177,43 +182,43 @@
   /**
    * \brief Copy constructor
    *
-   * Defined and unimplemented to avoid misuse
+   * Defined and unimplemented to avoid misuse.
    */
   SixLowPanNetDevice (SixLowPanNetDevice const &);
   /**
    * \brief Copy constructor
    *
-   * Defined and unimplemented to avoid misuse
+   * Defined and unimplemented to avoid misuse.
    * \returns
    */
   SixLowPanNetDevice& operator= (SixLowPanNetDevice const &);
   /**
-   * \brief receives all the packets from a NetDevice for further processing.
-   * \param device the NetDevice the packet ws received from
-   * \param packet the received packet
-   * \param protocol the protocol (if known)
-   * \param source the source address
-   * \param destination the destination address
-   * \param packetType the packet kind (e.g., HOST, BROADCAST, etc.)
-   * \return the IPv6 link-local address
+   * \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.
+   * \param [in] protocol The protocol (if known).
+   * \param [in] source The source address.
+   * \param [in] destination The destination address.
+   * \param [in] packetType The packet kind (e.g., HOST, BROADCAST, etc.).
+   * \return The IPv6 link-local address.
    */
   void ReceiveFromDevice (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol,
                           Address const &source, Address const &destination, PacketType packetType);
 
 
   /**
-   * \param packet packet sent from above down to Network Device
-   * \param source source mac address (so called "MAC spoofing")
-   * \param dest mac address of the destination (already resolved)
-   * \param protocolNumber identifies the type of payload contained in
+   * \param [in] packet Packet sent from above down to Network Device.
+   * \param [in] source Source mac address (only used if doSendFrom is true, i.e., "MAC spoofing").
+   * \param [in] dest Mac address of the destination (already resolved).
+   * \param [in] protocolNumber Identifies the type of payload contained in
    *        this packet. Used to call the right L3Protocol when the packet
    *        is received.
-   * \param doSendFrom perform a SendFrom instead of a Send
+   * \param [in] doSendFrom Perform a SendFrom instead of a Send.
    *
    *  Called from higher layer to send packet into Network Device
    *  with the specified source and destination Addresses.
    *
-   * \return whether the Send operation succeeded
+   * \return Whether the Send operation succeeded.
    */
   bool DoSend (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber, bool doSendFrom);
 
@@ -234,6 +239,9 @@
    * \li Packet received (including 6LoWPAN header)
    * \li Ptr to SixLowPanNetDevice
    * \li interface index
+   * \deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
+   * is deprecated and will be changed to \c Ptr<const SixLowPanNetDevice>
+   * in a future release.
    */
   TracedCallback<Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t> m_txTrace;
 
@@ -244,6 +252,9 @@
    * \li Packet received (including 6LoWPAN header)
    * \li Ptr to SixLowPanNetDevice
    * \li interface index
+   * \deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
+   * is deprecated and will be changed to \c Ptr<const SixLowPanNetDevice>
+   * in a future release.
    */
   TracedCallback<Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t> m_rxTrace;
 
@@ -255,110 +266,113 @@
    * \li Packet dropped (including 6LoWPAN header)
    * \li Ptr to SixLowPanNetDevice
    * \li interface index
+   * \deprecated The non-const \c Ptr<SixLowPanNetDevice> argument
+   * is deprecated and will be changed to \c Ptr<const SixLowPanNetDevice>
+   * in a future release.
    */
   TracedCallback<DropReason, Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t> m_dropTrace;
 
   /**
-   * \brief make a link-local address from a MAC address.
-   * \param addr the MAC address
-   * \return the IPv6 link-local address
+   * \brief Make a link-local address from a MAC address.
+   * \param [in] addr The MAC address.
+   * \return The IPv6 link-local address.
    */
   Ipv6Address MakeLinkLocalAddressFromMac (Address const &addr);
 
   /**
-   * \brief make a global address from a MAC address.
-   * \param addr the MAC address
-   * \param prefix the address prefix
-   * \return the IPv6 address
+   * \brief Make a global address from a MAC address.
+   * \param [in] addr the MAC address.
+   * \param [in] prefix The address prefix.
+   * \return The IPv6 address.
    */
   Ipv6Address MakeGlobalAddressFromMac (Address const &addr, Ipv6Address prefix);
 
   /**
    * \brief Compress the headers according to HC1 compression.
-   * \param packet the packet to be compressed
-   * \param src the MAC source address
-   * \param dst the MAC destination address
-   * \return the size of the removed headers
+   * \param [in] packet The packet to be compressed.
+   * \param [in] src The MAC source address.
+   * \param [in] dst The MAC destination address.
+   * \return The size of the removed headers.
    */
   uint32_t CompressLowPanHc1 (Ptr<Packet> packet, Address const &src, Address const &dst);
 
   /**
    * \brief Decompress the headers according to HC1 compression.
-   * \param packet the packet to be compressed
-   * \param src the MAC source address
-   * \param dst the MAC destination address
+   * \param [in] packet the packet to be compressed.
+   * \param [in] src the MAC source address.
+   * \param [in] dst the MAC destination address.
    */
   void DecompressLowPanHc1 (Ptr<Packet> packet, Address const &src, Address const &dst);
 
   /**
    * \brief Compress the headers according to IPHC compression.
-   * \param packet the packet to be compressed
-   * \param src the MAC source address
-   * \param dst the MAC destination address
-   * \return the size of the removed headers
+   * \param [in] packet The packet to be compressed.
+   * \param [in] src The MAC source address.
+   * \param [in] dst The MAC destination address.
+   * \return The size of the removed headers.
    */
   uint32_t CompressLowPanIphc (Ptr<Packet> packet, Address const &src, Address const &dst);
 
   /**
    * \brief Checks if the next header can be compressed using NHC.
-   * \param headerType the header kind to be compressed
-   * \return true if the header can be compressed
+   * \param [in] headerType The header kind to be compressed.
+   * \return True if the header can be compressed.
    */
   bool CanCompressLowPanNhc (uint8_t headerType);
 
   /**
    * \brief Decompress the headers according to IPHC compression.
-   * \param packet the packet to be compressed
-   * \param src the MAC source address
-   * \param dst the MAC destination address
+   * \param [in] packet The packet to be compressed.
+   * \param [in] src The MAC source address.
+   * \param [in] dst The MAC destination address.
    */
   void DecompressLowPanIphc (Ptr<Packet> packet, Address const &src, Address const &dst);
 
   /**
    * \brief Compress the headers according to NHC compression.
-   * \param packet the packet to be compressed
-   * \param headerType the header type
-   * \param src the MAC source address
-   * \param dst the MAC destination address
-   * \return the size of the removed headers
+   * \param [in] packet The packet to be compressed.
+   * \param [in] headerType The header type.
+   * \param [in] src The MAC source address.
+   * \param [in] dst The MAC destination address.
+   * \return The size of the removed headers.
    */
   uint32_t CompressLowPanNhc (Ptr<Packet> packet, uint8_t headerType, Address const &src, Address const &dst);
 
   /**
    * \brief Decompress the headers according to NHC compression.
-   * \param packet the packet to be compressed
-   * \param src the MAC source address
-   * \param dst the MAC destination address
-   * \param srcAddress the IPv6 source address
-   * \param dstAddress the IPv6 destination address
-   * \return the decompressed header type
+   * \param [in] packet The packet to be compressed.
+   * \param [in] src The MAC source address.
+   * \param [in] dst The MAC destination address.
+   * \param [in] srcAddress The IPv6 source address.
+   * \param [in] dstAddress The IPv6 destination address.
+   * \return The decompressed header type.
    */
   uint8_t DecompressLowPanNhc (Ptr<Packet> packet, Address const &src, Address const &dst, Ipv6Address srcAddress, Ipv6Address dstAddress);
 
   /**
    * \brief Compress the headers according to NHC compression.
-   * \param packet the packet to be compressed
-   * \param omitChecksum omit UDP checksum (if true)
-   * \return the size of the removed headers
+   * \param [in] packet The packet to be compressed.
+   * \param [in] omitChecksum Omit UDP checksum (if true).
+   * \return The size of the removed headers.
    */
   uint32_t CompressLowPanUdpNhc (Ptr<Packet> packet, bool omitChecksum);
 
   /**
    * \brief Decompress the headers according to NHC compression.
-   * \param packet the packet to be compressed
-   * \param saddr the IPv6 source address
-   * \param daddr the IPv6 destination address
+   * \param [in] packet The packet to be compressed.
+   * \param [in] saddr The IPv6 source address.
+   * \param [in] daddr The IPv6 destination address.
    */
   void DecompressLowPanUdpNhc (Ptr<Packet> packet, Ipv6Address saddr, Ipv6Address daddr);
 
   /**
-   * Fragment identifier type: src/dst address src/dst port
+   * Fragment identifier type: src/dst address src/dst port.
    */
   typedef std::pair< std::pair<Address, Address>, std::pair<uint16_t, uint16_t> > FragmentKey;
 
   /**
    * \class Fragments
-   * \brief A Set of Fragment
+   * \brief A Set of Fragment.
    */
   class Fragments : public SimpleRefCount<Fragments>
   {
@@ -375,33 +389,33 @@
 
     /**
      * \brief Add a fragment to the pool.
-     * \param fragment the fragment
-     * \param fragmentOffset the offset of the fragment
+     * \param [in] fragment the fragment.
+     * \param [in] fragmentOffset the offset of the fragment.
      */
     void AddFragment (Ptr<Packet> fragment, uint16_t fragmentOffset);
 
     /**
      * \brief Add the first packet fragment. The first fragment is needed to
      * allow the post-defragmentation decompression.
-     * \param fragment the fragment
+     * \param [in] fragment The fragment.
      */
     void AddFirstFragment (Ptr<Packet> fragment);
 
     /**
      * \brief If all fragments have been added.
-     * \returns true if the packet is entire
+     * \returns True if the packet is entire.
      */
     bool IsEntire () const;
 
     /**
      * \brief Get the entire packet.
-     * \return the entire packet
+     * \return The entire packet.
      */
     Ptr<Packet> GetPacket () const;
 
     /**
      * \brief Set the packet-to-be-defragmented size.
-     * \param packetSize the packet size (bytes)
+     * \param [in] packetSize The packet size (bytes).
      */
     void SetPacketSize (uint32_t packetSize);
 
@@ -422,64 +436,64 @@
     std::list<std::pair<Ptr<Packet>, uint16_t> > m_fragments;
 
     /**
-     * \brief The very first fragment
+     * \brief The very first fragment.
      */
     Ptr<Packet> m_firstFragment;
 
   };
 
   /**
-   * \brief Return the instance type identifier.
-   * \param packet the packet to be fragmented (with headers already compressed with 6LoWPAN)
-   * \param origPacketSize the size of the IP packet before the 6LoWPAN header compression, including the IP/L4 headers
-   * \param origHdrSize the size of the IP header before the 6LoWPAN header compression
-   * \param listFragments a reference to the list of the resulting packets, all with the proper headers in place
+   * \brief Performs a packet fragmentation.
+   * \param [in] packet the packet to be fragmented (with headers already compressed with 6LoWPAN).
+   * \param [in] origPacketSize the size of the IP packet before the 6LoWPAN header compression, including the IP/L4 headers.
+   * \param [in] origHdrSize the size of the IP header before the 6LoWPAN header compression.
+   * \param [out] listFragments A reference to the list of the resulting packets, all with the proper headers in place.
    */
   void DoFragmentation (Ptr<Packet> packet, uint32_t origPacketSize, uint32_t origHdrSize,
                         std::list<Ptr<Packet> >& listFragments);
 
   /**
-   * \brief Process a packet fragment
-   * \param packet the packet
-   * \param src the source MAC address
-   * \param dst the destination MAC address
-   * \param isFirst true if it is the first fragment, false otherwise
-   * \return true is the fragment completed the packet
+   * \brief Process a packet fragment.
+   * \param [in] packet The packet.
+   * \param [in] src The source MAC address.
+   * \param [in] dst The destination MAC address.
+   * \param [in] isFirst True if it is the first fragment, false otherwise.
+   * \return True is the fragment completed the packet.
    */
   bool ProcessFragment (Ptr<Packet>& packet, Address const &src, Address const &dst, bool isFirst);
 
   /**
-   * \brief Process the timeout for packet fragments
-   * \param key representing the packet fragments
-   * \param iif Input Interface
+   * \brief Process the timeout for packet fragments.
+   * \param [in] key A key representing the packet fragments.
+   * \param [in] iif Input Interface.
    */
   void HandleFragmentsTimeout ( FragmentKey key, uint32_t iif);
 
   /**
-   * \brief Drops the oldest fragment set
+   * \brief Drops the oldest fragment set.
    */
   void DropOldestFragmentSet ();
 
   /**
-   * Container for fragment key -> fragments
+   * Container for fragment key -> fragments.
    */
   typedef std::map< FragmentKey, Ptr<Fragments> > MapFragments_t;
   /**
-   * Container Iterator for fragment key -> fragments
+   * Container Iterator for fragment key -> fragments.
    */
   typedef std::map< FragmentKey, Ptr<Fragments> >::iterator MapFragmentsI_t;
   /**
-   * Container for fragment key -> exiration event
+   * Container for fragment key -> expiration event.
    */
   typedef std::map< FragmentKey, EventId > MapFragmentsTimers_t;
   /**
-   * Container Iterator for fragment key -> exiration event
+   * Container Iterator for fragment key -> expiration event.
    */
   typedef std::map< FragmentKey, EventId >::iterator MapFragmentsTimersI_t;
 
-  MapFragments_t       m_fragments; /**< Fragments hold to be rebuilt */
-  MapFragmentsTimers_t m_fragmentsTimers; /**< Timers related to fragment rebuilding */
-  Time                 m_fragmentExpirationTimeout; /**< Time limit for fragment rebuilding */
+  MapFragments_t       m_fragments; //!< Fragments hold to be rebuilt.
+  MapFragmentsTimers_t m_fragmentsTimers; //!< Timers related to fragment rebuilding.
+  Time                 m_fragmentExpirationTimeout; //!< Time limit for fragment rebuilding.
 
   /**
    * \brief How many packets can be rebuilt at the same time.
@@ -487,22 +501,22 @@
    */
   uint16_t             m_fragmentReassemblyListSize;
 
-  bool m_useIphc; /**< Use IPHC or HC1 */
+  bool m_useIphc; //!< Use IPHC or HC1.
 
-  Ptr<Node> m_node; /**< Smart pointer to the Node */
-  Ptr<NetDevice> m_netDevice; /**< Smart pointer to the underlying NetDevice */
-  uint32_t m_ifIndex; /**< Interface index */
+  Ptr<Node> m_node; //!< Smart pointer to the Node.
+  Ptr<NetDevice> m_netDevice; //!< Smart pointer to the underlying NetDevice.
+  uint32_t m_ifIndex; //!< Interface index.
 
   /**
    * \brief Force the EtherType number.
-   * Also implying that the underlying NetDevice is using 48-bit Addresses, e.g., Ethernet, WiFi, etc.
+   * Also implying that the underlying NetDevice is using 48-bit Addresses, e.g., Ethernet, Wi-Fi, etc.
    */
   bool m_forceEtherType;
 
-  uint16_t m_etherType; /**< EtherType number (used only if m_forceEtherType is true) */
-  bool m_omitUdpChecksum; /**< Omit UDP checksum in NC1 encoding */
+  uint16_t m_etherType; //!< EtherType number (used only if m_forceEtherType is true).
+  bool m_omitUdpChecksum; //!< Omit UDP checksum in NC1 encoding.
 
-  uint32_t m_compressionThreshold; /**< Minimum L2 payload size */
+  uint32_t m_compressionThreshold; //!< Minimum L2 payload size.
 
   Ptr<UniformRandomVariable> m_rng; //!< Rng for the fragments tag.
 };
diff -Naur ns-3.23/src/sixlowpan/test/error-channel-sixlow.cc ns-3.24/src/sixlowpan/test/error-channel-sixlow.cc
--- ns-3.23/src/sixlowpan/test/error-channel-sixlow.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/sixlowpan/test/error-channel-sixlow.cc	2015-09-15 11:18:44.000000000 -0700
@@ -34,7 +34,8 @@
 ErrorChannelSixlow::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ErrorChannelSixlow")
-    .SetParent<Channel> ()
+    .SetParent<SimpleChannel> ()
+    .SetGroupName ("SixLowPan")
     .AddConstructor<ErrorChannelSixlow> ()
   ;
   return tid;
@@ -150,6 +151,7 @@
 {
   static TypeId tid = TypeId ("ns3::BinaryErrorSixlowModel")
     .SetParent<ErrorModel> ()
+    .SetGroupName ("SixLowPan")
     .AddConstructor<BinaryErrorSixlowModel> ()
   ;
   return tid;
diff -Naur ns-3.23/src/spectrum/bindings/modulegen__gcc_ILP32.py ns-3.24/src/spectrum/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/spectrum/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -86,6 +86,8 @@
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
+    ## 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]
@@ -465,6 +467,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace addressUtils
     
     nested_module = module.add_cpp_namespace('addressUtils')
@@ -505,6 +513,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_addressUtils(module):
     root_module = module.get_root()
     
@@ -537,6 +552,7 @@
     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'])
@@ -888,17 +904,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -920,11 +936,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -934,16 +945,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1181,14 +1182,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1249,11 +1254,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DataRate_methods(root_module, cls):
@@ -2068,6 +2068,12 @@
                    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([])
@@ -2361,7 +2367,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -3723,6 +3729,11 @@
     cls.add_method('EndRx', 
                    'bool', 
                    [])
+    ## spectrum-interference.h (module 'spectrum'): static ns3::TypeId ns3::SpectrumInterference::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## spectrum-interference.h (module 'spectrum'): void ns3::SpectrumInterference::SetErrorModel(ns3::Ptr<ns3::SpectrumErrorModel> e) [member function]
     cls.add_method('SetErrorModel', 
                    'void', 
@@ -3785,11 +3796,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> m) [member function]
     cls.add_method('SetMobility', 
                    'void', 
@@ -4292,11 +4303,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::TvSpectrumTransmitter::GetDevice() [member function]
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::TvSpectrumTransmitter::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumModel const> ns3::TvSpectrumTransmitter::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -4461,11 +4472,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::WaveformGenerator::GetDevice() [member function]
+    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::WaveformGenerator::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumModel const> ns3::WaveformGenerator::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -4818,11 +4829,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5056,10 +5077,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5349,11 +5370,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::HalfDuplexIdealPhy::GetDevice() [member function]
+    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::HalfDuplexIdealPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumModel const> ns3::HalfDuplexIdealPhy::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -6627,6 +6648,11 @@
                    'void', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('ns3::Time', 'duration')], 
                    is_virtual=True)
+    ## spectrum-error-model.h (module 'spectrum'): static ns3::TypeId ns3::ShannonSpectrumErrorModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## spectrum-error-model.h (module 'spectrum'): bool ns3::ShannonSpectrumErrorModel::IsRxCorrect() [member function]
     cls.add_method('IsRxCorrect', 
                    'bool', 
@@ -6672,11 +6698,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumAnalyzer::GetDevice() [member function]
+    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumAnalyzer::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumModel const> ns3::SpectrumAnalyzer::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -7391,6 +7417,7 @@
                         [param('ns3::SpectrumValue const &', 'x')])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_addressUtils(module.get_submodule('addressUtils'), root_module)
     return
 
@@ -7404,6 +7431,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_addressUtils(module, root_module):
     return
 
diff -Naur ns-3.23/src/spectrum/bindings/modulegen__gcc_LP64.py ns-3.24/src/spectrum/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/spectrum/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -86,6 +86,8 @@
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
+    ## 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]
@@ -465,6 +467,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace addressUtils
     
     nested_module = module.add_cpp_namespace('addressUtils')
@@ -505,6 +513,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_addressUtils(module):
     root_module = module.get_root()
     
@@ -537,6 +552,7 @@
     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'])
@@ -888,17 +904,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -920,11 +936,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -934,16 +945,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1181,14 +1182,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1249,11 +1254,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DataRate_methods(root_module, cls):
@@ -2068,6 +2068,12 @@
                    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([])
@@ -2361,7 +2367,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -3723,6 +3729,11 @@
     cls.add_method('EndRx', 
                    'bool', 
                    [])
+    ## spectrum-interference.h (module 'spectrum'): static ns3::TypeId ns3::SpectrumInterference::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## spectrum-interference.h (module 'spectrum'): void ns3::SpectrumInterference::SetErrorModel(ns3::Ptr<ns3::SpectrumErrorModel> e) [member function]
     cls.add_method('SetErrorModel', 
                    'void', 
@@ -3785,11 +3796,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> m) [member function]
     cls.add_method('SetMobility', 
                    'void', 
@@ -4292,11 +4303,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::TvSpectrumTransmitter::GetDevice() [member function]
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::TvSpectrumTransmitter::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumModel const> ns3::TvSpectrumTransmitter::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -4461,11 +4472,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::WaveformGenerator::GetDevice() [member function]
+    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::WaveformGenerator::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumModel const> ns3::WaveformGenerator::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -4818,11 +4829,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5056,10 +5077,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -5349,11 +5370,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::HalfDuplexIdealPhy::GetDevice() [member function]
+    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::HalfDuplexIdealPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumModel const> ns3::HalfDuplexIdealPhy::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -6627,6 +6648,11 @@
                    'void', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('ns3::Time', 'duration')], 
                    is_virtual=True)
+    ## spectrum-error-model.h (module 'spectrum'): static ns3::TypeId ns3::ShannonSpectrumErrorModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## spectrum-error-model.h (module 'spectrum'): bool ns3::ShannonSpectrumErrorModel::IsRxCorrect() [member function]
     cls.add_method('IsRxCorrect', 
                    'bool', 
@@ -6672,11 +6698,11 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_virtual=True)
-    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumAnalyzer::GetDevice() [member function]
+    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumAnalyzer::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumModel const> ns3::SpectrumAnalyzer::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -7391,6 +7417,7 @@
                         [param('ns3::SpectrumValue const &', 'x')])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_addressUtils(module.get_submodule('addressUtils'), root_module)
     return
 
@@ -7404,6 +7431,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_addressUtils(module, root_module):
     return
 
diff -Naur ns-3.23/src/spectrum/model/half-duplex-ideal-phy.cc ns-3.24/src/spectrum/model/half-duplex-ideal-phy.cc
--- ns-3.23/src/spectrum/model/half-duplex-ideal-phy.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/half-duplex-ideal-phy.cc	2015-09-15 11:18:44.000000000 -0700
@@ -135,7 +135,7 @@
 
 
 Ptr<NetDevice>
-HalfDuplexIdealPhy::GetDevice ()
+HalfDuplexIdealPhy::GetDevice () const
 {
   NS_LOG_FUNCTION (this);
   return m_netDevice;
diff -Naur ns-3.23/src/spectrum/model/half-duplex-ideal-phy.h ns-3.24/src/spectrum/model/half-duplex-ideal-phy.h
--- ns-3.23/src/spectrum/model/half-duplex-ideal-phy.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/half-duplex-ideal-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -98,7 +98,7 @@
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
   Ptr<MobilityModel> GetMobility ();
-  Ptr<NetDevice> GetDevice ();
+  Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
   Ptr<AntennaModel> GetRxAntenna ();
   void StartRx (Ptr<SpectrumSignalParameters> params);
diff -Naur ns-3.23/src/spectrum/model/multi-model-spectrum-channel.h ns-3.24/src/spectrum/model/multi-model-spectrum-channel.h
--- ns-3.23/src/spectrum/model/multi-model-spectrum-channel.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/multi-model-spectrum-channel.h	2015-09-15 11:18:44.000000000 -0700
@@ -173,6 +173,11 @@
 
   double m_maxLossDb;
 
+  /**
+   * \deprecated The non-const \c Ptr<SpectrumPhy> argument
+   * is deprecated and will be changed to \c Ptr<const SpectrumPhy>
+   * in a future release.
+   */
   TracedCallback<Ptr<SpectrumPhy>, Ptr<SpectrumPhy>, double > m_pathLossTrace;
 };
 
diff -Naur ns-3.23/src/spectrum/model/single-model-spectrum-channel.h ns-3.24/src/spectrum/model/single-model-spectrum-channel.h
--- ns-3.23/src/spectrum/model/single-model-spectrum-channel.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/single-model-spectrum-channel.h	2015-09-15 11:18:44.000000000 -0700
@@ -109,6 +109,11 @@
 
   double m_maxLossDb;
 
+  /**
+   * \deprecated The non-const \c Ptr<SpectrumPhy> argument
+   * is deprecated and will be changed to \c Ptr<const SpectrumPhy>
+   * in a future release.
+   */
   TracedCallback<Ptr<SpectrumPhy>, Ptr<SpectrumPhy>, double > m_pathLossTrace;
 };
 
diff -Naur ns-3.23/src/spectrum/model/spectrum-analyzer.cc ns-3.24/src/spectrum/model/spectrum-analyzer.cc
--- ns-3.23/src/spectrum/model/spectrum-analyzer.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/spectrum-analyzer.cc	2015-09-15 11:18:44.000000000 -0700
@@ -99,7 +99,7 @@
 
 
 Ptr<NetDevice>
-SpectrumAnalyzer::GetDevice ()
+SpectrumAnalyzer::GetDevice () const
 {
   return m_netDevice;
 }
diff -Naur ns-3.23/src/spectrum/model/spectrum-analyzer.h ns-3.24/src/spectrum/model/spectrum-analyzer.h
--- ns-3.23/src/spectrum/model/spectrum-analyzer.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/spectrum-analyzer.h	2015-09-15 11:18:44.000000000 -0700
@@ -59,7 +59,7 @@
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
   Ptr<MobilityModel> GetMobility ();
-  Ptr<NetDevice> GetDevice ();
+  Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
   Ptr<AntennaModel> GetRxAntenna ();
   void StartRx (Ptr<SpectrumSignalParameters> params);
diff -Naur ns-3.23/src/spectrum/model/spectrum-channel.h ns-3.24/src/spectrum/model/spectrum-channel.h
--- ns-3.23/src/spectrum/model/spectrum-channel.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/spectrum-channel.h	2015-09-15 11:18:44.000000000 -0700
@@ -101,10 +101,13 @@
    * \param [in] txPhy The TX SpectrumPhy instance.
    * \param [in] rxPhy The RX SpectrumPhy instance.
    * \param [in] lossDb The loss value, in dB.
+   * \deprecated The non-const `Ptr<SpectrumValue>` is
+   * deprecated and will be changed to Ptr<const SpectrumValue>`
+   * in a future release.
    */
   typedef void (* LossTracedCallback)
-    (const Ptr<const SpectrumPhy> txPhy, const Ptr<const SpectrumPhy> rxPhy,
-     const double lossDb);
+    (Ptr<SpectrumPhy> txPhy, Ptr<SpectrumPhy> rxPhy,
+     double lossDb);
   
 };
 
diff -Naur ns-3.23/src/spectrum/model/spectrum-error-model.cc ns-3.24/src/spectrum/model/spectrum-error-model.cc
--- ns-3.23/src/spectrum/model/spectrum-error-model.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/spectrum-error-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -35,6 +35,7 @@
   static TypeId tid = TypeId ("ns3::SpectrumErrorModel")
     .SetParent<Object> ()
     .SetGroupName ("Spectrum")
+    // No AddConstructor because this is an abstract class.
     ;
   return tid;
 }
@@ -43,6 +44,17 @@
 {
 }
 
+/* static */
+TypeId
+ShannonSpectrumErrorModel::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::ShannonSpectrumErrorModel")
+    .SetParent<SpectrumErrorModel> ()
+    .SetGroupName ("Spectrum")
+    .AddConstructor<ShannonSpectrumErrorModel> ()
+    ;
+  return tid;
+}
 void
 ShannonSpectrumErrorModel::DoDispose ()
 {
diff -Naur ns-3.23/src/spectrum/model/spectrum-error-model.h ns-3.24/src/spectrum/model/spectrum-error-model.h
--- ns-3.23/src/spectrum/model/spectrum-error-model.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/spectrum-error-model.h	2015-09-15 11:18:44.000000000 -0700
@@ -40,6 +40,10 @@
 {
 public:
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId ();
   virtual ~SpectrumErrorModel ();
   virtual void StartRx (Ptr<const Packet> p) = 0;
@@ -62,6 +66,11 @@
   virtual void DoDispose ();
 
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
   // inherited from SpectrumErrorModel
   void StartRx (Ptr<const Packet> p);
   void EvaluateChunk (const SpectrumValue& sinr, Time duration);
diff -Naur ns-3.23/src/spectrum/model/spectrum-interference.cc ns-3.24/src/spectrum/model/spectrum-interference.cc
--- ns-3.23/src/spectrum/model/spectrum-interference.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/spectrum-interference.cc	2015-09-15 11:18:44.000000000 -0700
@@ -45,6 +45,17 @@
   NS_LOG_FUNCTION (this);
 }
 
+TypeId
+SpectrumInterference::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::SpectrumInterference")
+    .SetParent<Object> ()
+    .SetGroupName ("Spectrum")
+    .AddConstructor<SpectrumInterference> ()
+    ;
+  return tid;
+}
+
 void
 SpectrumInterference::DoDispose ()
 {
diff -Naur ns-3.23/src/spectrum/model/spectrum-interference.h ns-3.24/src/spectrum/model/spectrum-interference.h
--- ns-3.23/src/spectrum/model/spectrum-interference.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/spectrum-interference.h	2015-09-15 11:18:44.000000000 -0700
@@ -50,6 +50,12 @@
   virtual ~SpectrumInterference ();
 
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
+  /**
    * set the SpectrumErrorModel to be used.
    *
    * @param e
diff -Naur ns-3.23/src/spectrum/model/spectrum-phy.h ns-3.24/src/spectrum/model/spectrum-phy.h
--- ns-3.23/src/spectrum/model/spectrum-phy.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/spectrum-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -63,7 +63,7 @@
    *
    * @return a Ptr to the associated NetDevice instance
    */
-  virtual Ptr<NetDevice> GetDevice () = 0;
+  virtual Ptr<NetDevice> GetDevice () const = 0;
 
   /**
    * Set the mobility model associated with this device.
diff -Naur ns-3.23/src/spectrum/model/spectrum-value.cc ns-3.24/src/spectrum/model/spectrum-value.cc
--- ns-3.23/src/spectrum/model/spectrum-value.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/spectrum-value.cc	2015-09-15 11:18:44.000000000 -0700
@@ -39,13 +39,13 @@
 }
 
 double&
-SpectrumValue:: operator[] (size_t index)
+SpectrumValue::operator[] (size_t index)
 {
   return m_values.at (index);
 }
 
 const double&
-SpectrumValue:: operator[] (size_t index) const
+SpectrumValue::operator[] (size_t index) const
 {
   return m_values.at (index);
 }
@@ -598,28 +598,28 @@
 }
 
 SpectrumValue&
-SpectrumValue:: operator+= (const SpectrumValue& rhs)
+SpectrumValue::operator+= (const SpectrumValue& rhs)
 {
   Add (rhs);
   return *this;
 }
 
 SpectrumValue&
-SpectrumValue:: operator-= (const SpectrumValue& rhs)
+SpectrumValue::operator-= (const SpectrumValue& rhs)
 {
   Subtract (rhs);
   return *this;
 }
 
 SpectrumValue&
-SpectrumValue:: operator*= (const SpectrumValue& rhs)
+SpectrumValue::operator*= (const SpectrumValue& rhs)
 {
   Multiply (rhs);
   return *this;
 }
 
 SpectrumValue&
-SpectrumValue:: operator/= (const SpectrumValue& rhs)
+SpectrumValue::operator/= (const SpectrumValue& rhs)
 {
   Divide (rhs);
   return *this;
@@ -627,28 +627,28 @@
 
 
 SpectrumValue&
-SpectrumValue:: operator+= (double rhs)
+SpectrumValue::operator+= (double rhs)
 {
   Add (rhs);
   return *this;
 }
 
 SpectrumValue&
-SpectrumValue:: operator-= (double rhs)
+SpectrumValue::operator-= (double rhs)
 {
   Subtract (rhs);
   return *this;
 }
 
 SpectrumValue&
-SpectrumValue:: operator*= (double rhs)
+SpectrumValue::operator*= (double rhs)
 {
   Multiply (rhs);
   return *this;
 }
 
 SpectrumValue&
-SpectrumValue:: operator/= (double rhs)
+SpectrumValue::operator/= (double rhs)
 {
   Divide (rhs);
   return *this;
@@ -656,7 +656,7 @@
 
 
 SpectrumValue&
-SpectrumValue:: operator= (double rhs)
+SpectrumValue::operator= (double rhs)
 {
   Values::iterator it1 = m_values.begin ();
 
@@ -671,7 +671,7 @@
 
 
 SpectrumValue
-SpectrumValue:: operator<< (int n) const
+SpectrumValue::operator<< (int n) const
 {
   SpectrumValue res = *this;
   res.ShiftLeft (n);
@@ -679,7 +679,7 @@
 }
 
 SpectrumValue
-SpectrumValue:: operator>> (int n) const
+SpectrumValue::operator>> (int n) const
 {
   SpectrumValue res = *this;
   res.ShiftRight (n);
diff -Naur ns-3.23/src/spectrum/model/spectrum-value.h ns-3.24/src/spectrum/model/spectrum-value.h
--- ns-3.23/src/spectrum/model/spectrum-value.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/spectrum-value.h	2015-09-15 11:18:44.000000000 -0700
@@ -507,8 +507,11 @@
    *  TracedCallback signature for SpectrumValue.
    *
    * \param [in] value Value of the traced variable.
+   * \deprecated The non-const \c Ptr<SpectrumPhy> argument
+   * is deprecated and will be changed to \c Ptr<const SpectrumPhy>
+   * in a future release.
    */
-  typedef void (* TracedCallback)(const Ptr<const SpectrumValue> value);
+  typedef void (* TracedCallback)(Ptr<SpectrumValue> value);
 
 
 private:
diff -Naur ns-3.23/src/spectrum/model/tv-spectrum-transmitter.cc ns-3.24/src/spectrum/model/tv-spectrum-transmitter.cc
--- ns-3.23/src/spectrum/model/tv-spectrum-transmitter.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/tv-spectrum-transmitter.cc	2015-09-15 11:18:44.000000000 -0700
@@ -151,7 +151,7 @@
 }
 
 Ptr<NetDevice>
-TvSpectrumTransmitter::GetDevice ()
+TvSpectrumTransmitter::GetDevice () const
 {
   NS_LOG_FUNCTION (this);
   return m_netDevice;
diff -Naur ns-3.23/src/spectrum/model/tv-spectrum-transmitter.h ns-3.24/src/spectrum/model/tv-spectrum-transmitter.h
--- ns-3.23/src/spectrum/model/tv-spectrum-transmitter.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/tv-spectrum-transmitter.h	2015-09-15 11:18:44.000000000 -0700
@@ -71,7 +71,7 @@
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
   Ptr<MobilityModel> GetMobility ();
-  Ptr<NetDevice> GetDevice ();
+  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 ();
diff -Naur ns-3.23/src/spectrum/model/waveform-generator.cc ns-3.24/src/spectrum/model/waveform-generator.cc
--- ns-3.23/src/spectrum/model/waveform-generator.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/waveform-generator.cc	2015-09-15 11:18:44.000000000 -0700
@@ -98,7 +98,7 @@
 
 
 Ptr<NetDevice>
-WaveformGenerator::GetDevice ()
+WaveformGenerator::GetDevice () const
 {
   return m_netDevice;
 }
diff -Naur ns-3.23/src/spectrum/model/waveform-generator.h ns-3.24/src/spectrum/model/waveform-generator.h
--- ns-3.23/src/spectrum/model/waveform-generator.h	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/spectrum/model/waveform-generator.h	2015-09-15 11:18:44.000000000 -0700
@@ -64,7 +64,7 @@
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
   Ptr<MobilityModel> GetMobility ();
-  Ptr<NetDevice> GetDevice ();
+  Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
   Ptr<AntennaModel> GetRxAntenna ();
   void StartRx (Ptr<SpectrumSignalParameters> params);
diff -Naur ns-3.23/src/stats/bindings/modulegen__gcc_ILP32.py ns-3.24/src/stats/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/stats/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/stats/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -217,6 +217,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -257,6 +263,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -402,11 +439,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DataOutputCallback_methods(root_module, cls):
@@ -926,10 +958,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -1317,6 +1349,11 @@
     cls.add_method('SetParent', 
                    'ns3::TypeId', 
                    [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent() [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   template_parameters=['ns3::Object'])
     ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetSize(std::size_t size) [member function]
     cls.add_method('SetSize', 
                    'ns3::TypeId', 
@@ -2043,11 +2080,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2106,6 +2153,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-calculator.h (module 'stats'): static ns3::TypeId ns3::DataCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-calculator.h (module 'stats'): void ns3::DataCalculator::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -2228,6 +2280,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-collector.h (module 'stats'): static ns3::TypeId ns3::DataCollector::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-collector.h (module 'stats'): std::_List_iterator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > ns3::DataCollector::MetadataBegin() [member function]
     cls.add_method('MetadataBegin', 
                    'std::_List_iterator< std::pair< std::basic_string< char, std::char_traits< char >, std::allocator< char > >, std::basic_string< char, std::char_traits< char >, std::allocator< char > > > >', 
@@ -2253,6 +2310,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-output-interface.h (module 'stats'): static ns3::TypeId ns3::DataOutputInterface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-output-interface.h (module 'stats'): void ns3::DataOutputInterface::Output(ns3::DataCollector & dc) [member function]
     cls.add_method('Output', 
                    'void', 
@@ -2649,6 +2711,11 @@
     cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< double > const &', 'arg0')])
     ## basic-data-calculators.h (module 'stats'): ns3::MinMaxAvgTotalCalculator<double>::MinMaxAvgTotalCalculator() [constructor]
     cls.add_constructor([])
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::MinMaxAvgTotalCalculator<double>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::MinMaxAvgTotalCalculator<double>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -2754,6 +2821,11 @@
     cls.add_constructor([param('ns3::OmnetDataOutput const &', 'arg0')])
     ## omnet-data-output.h (module 'stats'): ns3::OmnetDataOutput::OmnetDataOutput() [constructor]
     cls.add_constructor([])
+    ## omnet-data-output.h (module 'stats'): static ns3::TypeId ns3::OmnetDataOutput::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## omnet-data-output.h (module 'stats'): void ns3::OmnetDataOutput::Output(ns3::DataCollector & dc) [member function]
     cls.add_method('Output', 
                    'void', 
@@ -2798,6 +2870,11 @@
     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', 
@@ -2815,6 +2892,11 @@
     cls.add_constructor([param('ns3::TimeMinMaxAvgTotalCalculator const &', 'arg0')])
     ## time-data-calculators.h (module 'stats'): ns3::TimeMinMaxAvgTotalCalculator::TimeMinMaxAvgTotalCalculator() [constructor]
     cls.add_constructor([])
+    ## time-data-calculators.h (module 'stats'): static ns3::TypeId ns3::TimeMinMaxAvgTotalCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## time-data-calculators.h (module 'stats'): void ns3::TimeMinMaxAvgTotalCalculator::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -3302,6 +3384,7 @@
                         [param('double', 'x')])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -3315,6 +3398,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/stats/bindings/modulegen__gcc_LP64.py ns-3.24/src/stats/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/stats/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/stats/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -217,6 +217,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -257,6 +263,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -402,11 +439,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DataOutputCallback_methods(root_module, cls):
@@ -926,10 +958,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -1317,6 +1349,11 @@
     cls.add_method('SetParent', 
                    'ns3::TypeId', 
                    [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent() [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   template_parameters=['ns3::Object'])
     ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetSize(std::size_t size) [member function]
     cls.add_method('SetSize', 
                    'ns3::TypeId', 
@@ -2043,11 +2080,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2106,6 +2153,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-calculator.h (module 'stats'): static ns3::TypeId ns3::DataCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-calculator.h (module 'stats'): void ns3::DataCalculator::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -2228,6 +2280,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-collector.h (module 'stats'): static ns3::TypeId ns3::DataCollector::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-collector.h (module 'stats'): std::_List_iterator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > ns3::DataCollector::MetadataBegin() [member function]
     cls.add_method('MetadataBegin', 
                    'std::_List_iterator< std::pair< std::basic_string< char, std::char_traits< char >, std::allocator< char > >, std::basic_string< char, std::char_traits< char >, std::allocator< char > > > >', 
@@ -2253,6 +2310,11 @@
                    'std::string', 
                    [], 
                    is_const=True)
+    ## data-output-interface.h (module 'stats'): static ns3::TypeId ns3::DataOutputInterface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## data-output-interface.h (module 'stats'): void ns3::DataOutputInterface::Output(ns3::DataCollector & dc) [member function]
     cls.add_method('Output', 
                    'void', 
@@ -2649,6 +2711,11 @@
     cls.add_constructor([param('ns3::MinMaxAvgTotalCalculator< double > const &', 'arg0')])
     ## basic-data-calculators.h (module 'stats'): ns3::MinMaxAvgTotalCalculator<double>::MinMaxAvgTotalCalculator() [constructor]
     cls.add_constructor([])
+    ## basic-data-calculators.h (module 'stats'): static ns3::TypeId ns3::MinMaxAvgTotalCalculator<double>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## basic-data-calculators.h (module 'stats'): void ns3::MinMaxAvgTotalCalculator<double>::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -2754,6 +2821,11 @@
     cls.add_constructor([param('ns3::OmnetDataOutput const &', 'arg0')])
     ## omnet-data-output.h (module 'stats'): ns3::OmnetDataOutput::OmnetDataOutput() [constructor]
     cls.add_constructor([])
+    ## omnet-data-output.h (module 'stats'): static ns3::TypeId ns3::OmnetDataOutput::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## omnet-data-output.h (module 'stats'): void ns3::OmnetDataOutput::Output(ns3::DataCollector & dc) [member function]
     cls.add_method('Output', 
                    'void', 
@@ -2798,6 +2870,11 @@
     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', 
@@ -2815,6 +2892,11 @@
     cls.add_constructor([param('ns3::TimeMinMaxAvgTotalCalculator const &', 'arg0')])
     ## time-data-calculators.h (module 'stats'): ns3::TimeMinMaxAvgTotalCalculator::TimeMinMaxAvgTotalCalculator() [constructor]
     cls.add_constructor([])
+    ## time-data-calculators.h (module 'stats'): static ns3::TypeId ns3::TimeMinMaxAvgTotalCalculator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## time-data-calculators.h (module 'stats'): void ns3::TimeMinMaxAvgTotalCalculator::Output(ns3::DataOutputCallback & callback) const [member function]
     cls.add_method('Output', 
                    'void', 
@@ -3302,6 +3384,7 @@
                         [param('double', 'x')])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -3315,6 +3398,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/stats/examples/double-probe-example.cc ns-3.24/src/stats/examples/double-probe-example.cc
--- ns-3.23/src/stats/examples/double-probe-example.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/stats/examples/double-probe-example.cc	2015-09-15 11:18:44.000000000 -0700
@@ -38,6 +38,10 @@
 class Emitter : public Object
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   Emitter ();
 private:
@@ -56,12 +60,13 @@
 Emitter::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::Emitter")
-    .AddConstructor<Emitter> ()
     .SetParent<Object> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<Emitter> ()
     .AddTraceSource ("Counter",
                      "sample counter",
                      MakeTraceSourceAccessor (&Emitter::m_counter),
-                     "ns3::TracedValue::DoubleCallback")
+                     "ns3::TracedValueCallback::Double")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/stats/examples/file-helper-example.cc ns-3.24/src/stats/examples/file-helper-example.cc
--- ns-3.23/src/stats/examples/file-helper-example.cc	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/src/stats/examples/file-helper-example.cc	2015-09-15 11:18:44.000000000 -0700
@@ -42,6 +42,10 @@
 class Emitter : public Object
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   Emitter ();
 private:
@@ -59,12 +63,13 @@
 Emitter::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::Emitter")
-    .AddConstructor<Emitter> ()
     .SetParent<Object> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<Emitter> ()
     .AddTraceSource ("Counter",
                      "sample counter",
                      MakeTraceSourceAccessor (&Emitter::m_counter),
-                     "ns3::TracedValue::DoubleCallback")
+                     "ns3::TracedValueCallback::Double")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/stats/examples/gnuplot-helper-example.cc ns-3.24/src/stats/examples/gnuplot-helper-example.cc
--- ns-3.23/src/stats/examples/gnuplot-helper-example.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/examples/gnuplot-helper-example.cc	2015-09-15 11:18:44.000000000 -0700
@@ -42,6 +42,10 @@
 class Emitter : public Object
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   Emitter ();
 private:
@@ -58,12 +62,13 @@
 Emitter::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::Emitter")
-    .AddConstructor<Emitter> ()
     .SetParent<Object> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<Emitter> ()
     .AddTraceSource ("Counter",
                      "sample counter",
                      MakeTraceSourceAccessor (&Emitter::m_counter),
-                     "ns3::TracedValue::DoubleCallback")
+                     "ns3::TracedValueCallback::Double")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/stats/examples/time-probe-example.cc ns-3.24/src/stats/examples/time-probe-example.cc
--- ns-3.23/src/stats/examples/time-probe-example.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/examples/time-probe-example.cc	2015-09-15 11:18:44.000000000 -0700
@@ -53,6 +53,10 @@
 class Emitter : public Object
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   Emitter ();
 private:
@@ -71,8 +75,9 @@
 Emitter::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::Emitter")
-    .AddConstructor<Emitter> ()
     .SetParent<Object> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<Emitter> ()
     .AddTraceSource ("Interval",
                      "Trace source",
                      MakeTraceSourceAccessor (&Emitter::m_interval),
diff -Naur ns-3.23/src/stats/model/average.h ns-3.24/src/stats/model/average.h
--- ns-3.23/src/stats/model/average.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/average.h	2015-09-15 11:18:44.000000000 -0700
@@ -93,6 +93,8 @@
    *   - uncorrelated measurements, 
    *   - normal distribution and
    *   - large enough sample size.
+   *
+   * \returns Margin of error of the mean for 90% confidence level
    */
   double   Error90 () const { return 1.645 * std::sqrt (Var () / Count ()); }
   /**
@@ -102,6 +104,8 @@
    *   - uncorrelated measurements, 
    *   - normal distribution and
    *   - large enough sample size.
+   *
+   * \returns Margin of error of the mean for 95% confidence level
    */
   double   Error95 () const { return 1.960 * std::sqrt (Var () / Count ()); }
   /**
@@ -111,6 +115,9 @@
    *   - uncorrelated measurements, 
    *   - normal distribution and
    *   - large enough sample size.
+   *
+   * \returns Margin of error of the mean for 99% confidence level
+   *
    */
   double   Error99 () const { return 2.576 * std::sqrt (Var () / Count ()); }
   /**@}*/
diff -Naur ns-3.23/src/stats/model/basic-data-calculators.h ns-3.24/src/stats/model/basic-data-calculators.h
--- ns-3.23/src/stats/model/basic-data-calculators.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/basic-data-calculators.h	2015-09-15 11:18:44.000000000 -0700
@@ -23,6 +23,7 @@
 
 #include "data-calculator.h"
 #include "data-output-interface.h"
+#include "ns3/type-name.h"
 
 namespace ns3 {
 
@@ -42,6 +43,12 @@
   virtual ~MinMaxAvgTotalCalculator();
 
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
+  /**
    * Updates all variables of MinMaxAvgTotalCalculator
    * \param i value of type T to use for updating the calculator
    */
@@ -139,6 +146,7 @@
 MinMaxAvgTotalCalculator<T>::~MinMaxAvgTotalCalculator()
 {
 }
+  
 template <typename T>
 void
 MinMaxAvgTotalCalculator<T>::DoDispose (void)
@@ -147,6 +155,21 @@
   // MinMaxAvgTotalCalculator::DoDispose
 }
 
+/* static */
+template <typename T>
+TypeId
+MinMaxAvgTotalCalculator<T>::GetTypeId (void)
+{
+  static TypeId tid = TypeId ( ("ns3::MinMaxAvgTotalCalculator<"
+                                + TypeNameGet<T> ()
+                                + ">").c_str () )
+    .SetParent<Object> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<MinMaxAvgTotalCalculator<T> > ()
+    ;
+  return tid;
+}
+  
 template <typename T>
 void
 MinMaxAvgTotalCalculator<T>::Update (const T i)
@@ -254,6 +277,12 @@
   virtual ~CounterCalculator();
 
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
+  /**
    * Increments count by 1
    */
   void Update ();
@@ -295,6 +324,21 @@
 CounterCalculator<T>::~CounterCalculator()
 {
 }
+/* static */
+template <typename T>
+TypeId
+CounterCalculator<T>::GetTypeId (void)
+{
+  static TypeId tid = TypeId ( ("ns3::CounterCalculator<"
+                                + TypeNameGet<T> ()
+                                + ">").c_str () )
+    .SetParent<Object> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<CounterCalculator<T> > ()
+    ;
+  return tid;
+}
+
 template <typename T>
 void
 CounterCalculator<T>::DoDispose (void)
diff -Naur ns-3.23/src/stats/model/boolean-probe.cc ns-3.24/src/stats/model/boolean-probe.cc
--- ns-3.23/src/stats/model/boolean-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/boolean-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -44,7 +44,7 @@
     .AddTraceSource ( "Output",
                       "The bool that serves as output for this probe",
                       MakeTraceSourceAccessor (&BooleanProbe::m_output),
-                      "ns3::TracedValue::BoolCallback")
+                      "ns3::TracedValueCallback::Bool")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/stats/model/data-calculator.cc ns-3.24/src/stats/model/data-calculator.cc
--- ns-3.23/src/stats/model/data-calculator.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/data-calculator.cc	2015-09-15 11:18:44.000000000 -0700
@@ -43,6 +43,18 @@
   NS_LOG_FUNCTION (this);
 }
 
+/* static */
+TypeId
+DataCalculator::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::DataCalculator")
+    .SetParent<Object> ()
+    .SetGroupName ("Stats")
+    // No AddConstructor because this is an abstract class.
+    ;
+  return tid;
+}
+  
 void
 DataCalculator::DoDispose (void)
 {
diff -Naur ns-3.23/src/stats/model/data-calculator.h ns-3.24/src/stats/model/data-calculator.h
--- ns-3.23/src/stats/model/data-calculator.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/data-calculator.h	2015-09-15 11:18:44.000000000 -0700
@@ -114,6 +114,12 @@
   virtual ~DataCalculator();
 
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
+  /**
    * Returns whether the DataCalculator is enabled
    * \return true if DataCalculator is enabled
    */
diff -Naur ns-3.23/src/stats/model/data-collector.cc ns-3.24/src/stats/model/data-collector.cc
--- ns-3.23/src/stats/model/data-collector.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/data-collector.cc	2015-09-15 11:18:44.000000000 -0700
@@ -40,6 +40,18 @@
   // end DataCollector::~DataCollector
 }
 
+/* static */
+TypeId
+DataCollector::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::DataCollector")
+    .SetParent<Object> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<DataCollector> ()
+    ;
+  return tid;
+}
+  
 void DataCollector::DoDispose () {
   NS_LOG_FUNCTION (this);
 
diff -Naur ns-3.23/src/stats/model/data-collector.h ns-3.24/src/stats/model/data-collector.h
--- ns-3.23/src/stats/model/data-collector.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/data-collector.h	2015-09-15 11:18:44.000000000 -0700
@@ -52,6 +52,12 @@
   virtual ~DataCollector();
 
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
+  /**
    * Provide specific parameters to the DataCollector
    * \param experiment Label for the experiment
    * \param strategy Label for the strategy
diff -Naur ns-3.23/src/stats/model/data-output-interface.cc ns-3.24/src/stats/model/data-output-interface.cc
--- ns-3.23/src/stats/model/data-output-interface.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/data-output-interface.cc	2015-09-15 11:18:44.000000000 -0700
@@ -36,6 +36,18 @@
 {
   NS_LOG_FUNCTION (this);
 }
+/* static */
+TypeId
+DataOutputInterface::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::DataOutputInterface")
+    .SetParent<Object> ()
+    .SetGroupName ("Stats")
+    // No AddConstructor because this is an abstract class.
+    ;
+  return tid;
+}
+  
 void
 DataOutputInterface::DoDispose ()
 {
diff -Naur ns-3.23/src/stats/model/data-output-interface.h ns-3.24/src/stats/model/data-output-interface.h
--- ns-3.23/src/stats/model/data-output-interface.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/data-output-interface.h	2015-09-15 11:18:44.000000000 -0700
@@ -42,6 +42,12 @@
   virtual ~DataOutputInterface();
 
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
+  /**
    * Outputs information from the provided DataCollector
    * \param dc DataCollector object
    */
diff -Naur ns-3.23/src/stats/model/double-probe.cc ns-3.24/src/stats/model/double-probe.cc
--- ns-3.23/src/stats/model/double-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/double-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -44,7 +44,7 @@
     .AddTraceSource ( "Output",
                       "The double that serves as output for this probe",
                       MakeTraceSourceAccessor (&DoubleProbe::m_output),
-                     "ns3::TracedValue::DoubleCallback")
+                     "ns3::TracedValueCallback::Double")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/stats/model/omnet-data-output.cc ns-3.24/src/stats/model/omnet-data-output.cc
--- ns-3.23/src/stats/model/omnet-data-output.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/omnet-data-output.cc	2015-09-15 11:18:44.000000000 -0700
@@ -44,6 +44,18 @@
 {
   NS_LOG_FUNCTION (this);
 }
+/* static */
+TypeId
+OmnetDataOutput::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::OmnetDataOutput")
+    .SetParent<DataOutputInterface> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<OmnetDataOutput> ()
+    ;
+  return tid;
+}
+  
 void
 OmnetDataOutput::DoDispose ()
 {
diff -Naur ns-3.23/src/stats/model/omnet-data-output.h ns-3.24/src/stats/model/omnet-data-output.h
--- ns-3.23/src/stats/model/omnet-data-output.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/omnet-data-output.h	2015-09-15 11:18:44.000000000 -0700
@@ -41,6 +41,12 @@
   OmnetDataOutput();
   virtual ~OmnetDataOutput();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
   virtual void Output (DataCollector &dc);
 
 protected:
diff -Naur ns-3.23/src/stats/model/sqlite-data-output.cc ns-3.24/src/stats/model/sqlite-data-output.cc
--- ns-3.23/src/stats/model/sqlite-data-output.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/sqlite-data-output.cc	2015-09-15 11:18:44.000000000 -0700
@@ -45,6 +45,17 @@
 {
   NS_LOG_FUNCTION (this);
 }
+/* static */
+TypeId
+SqliteDataOutput::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::SqliteDataOutput")
+    .SetParent<DataOutputInterface> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<SqliteDataOutput> ();
+  return tid;
+}
+  
 void
 SqliteDataOutput::DoDispose ()
 {
diff -Naur ns-3.23/src/stats/model/sqlite-data-output.h ns-3.24/src/stats/model/sqlite-data-output.h
--- ns-3.23/src/stats/model/sqlite-data-output.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/sqlite-data-output.h	2015-09-15 11:18:44.000000000 -0700
@@ -43,6 +43,12 @@
   SqliteDataOutput();
   virtual ~SqliteDataOutput();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
   virtual void Output (DataCollector &dc);
 
 protected:
diff -Naur ns-3.23/src/stats/model/time-data-calculators.cc ns-3.24/src/stats/model/time-data-calculators.cc
--- ns-3.23/src/stats/model/time-data-calculators.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/time-data-calculators.cc	2015-09-15 11:18:44.000000000 -0700
@@ -39,6 +39,17 @@
 {
   NS_LOG_FUNCTION (this);
 }
+/* static */
+TypeId
+TimeMinMaxAvgTotalCalculator::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::TimeMinMaxAvgTotalCalculator")
+    .SetParent<DataCalculator> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<TimeMinMaxAvgTotalCalculator> ();
+  return tid;
+}
+  
 void
 TimeMinMaxAvgTotalCalculator::DoDispose (void)
 {
diff -Naur ns-3.23/src/stats/model/time-data-calculators.h ns-3.24/src/stats/model/time-data-calculators.h
--- ns-3.23/src/stats/model/time-data-calculators.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/time-data-calculators.h	2015-09-15 11:18:44.000000000 -0700
@@ -45,6 +45,12 @@
   virtual ~TimeMinMaxAvgTotalCalculator();
 
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
+  /**
    * Updates all variables of TimeMinMaxAvgTotalCalculator
    * \param i value of type Time to use for updating the calculator
    */
diff -Naur ns-3.23/src/stats/model/time-probe.cc ns-3.24/src/stats/model/time-probe.cc
--- ns-3.23/src/stats/model/time-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/time-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -45,7 +45,7 @@
     .AddTraceSource ("Output",
                      "The double valued (units of seconds) probe output",
                      MakeTraceSourceAccessor (&TimeProbe::m_output),
-                     "ns3::TracedValue::DoubleCallback")
+                     "ns3::TracedValueCallback::Double")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/stats/model/time-series-adaptor.h ns-3.24/src/stats/model/time-series-adaptor.h
--- ns-3.23/src/stats/model/time-series-adaptor.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/time-series-adaptor.h	2015-09-15 11:18:44.000000000 -0700
@@ -115,7 +115,7 @@
   /**
    * TracedCallback signature for output trace.
    *
-   * \param [in] now The current Time.
+   * \param [in] now The current time, in seconds.
    * \param [in] data The new data value.
    */
   typedef void (* OutputTracedCallback) (const double now, const double data);
diff -Naur ns-3.23/src/stats/model/uinteger-16-probe.cc ns-3.24/src/stats/model/uinteger-16-probe.cc
--- ns-3.23/src/stats/model/uinteger-16-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/uinteger-16-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -43,7 +43,7 @@
     .AddTraceSource ( "Output",
                       "The uint16_t that serves as output for this probe",
                       MakeTraceSourceAccessor (&Uinteger16Probe::m_output),
-                     "ns3::TracedValue::Uint16Callback")
+                     "ns3::TracedValueCallback::Uint16")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/stats/model/uinteger-32-probe.cc ns-3.24/src/stats/model/uinteger-32-probe.cc
--- ns-3.23/src/stats/model/uinteger-32-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/uinteger-32-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -43,7 +43,7 @@
     .AddTraceSource ( "Output",
                       "The uint32_t that serves as output for this probe",
                       MakeTraceSourceAccessor (&Uinteger32Probe::m_output),
-                     "ns3::TracedValue::Uint32Callback")
+                     "ns3::TracedValueCallback::Uint32")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/stats/model/uinteger-8-probe.cc ns-3.24/src/stats/model/uinteger-8-probe.cc
--- ns-3.23/src/stats/model/uinteger-8-probe.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/model/uinteger-8-probe.cc	2015-09-15 11:18:44.000000000 -0700
@@ -43,7 +43,7 @@
     .AddTraceSource ( "Output",
                       "The uint8_t that serves as output for this probe",
                       MakeTraceSourceAccessor (&Uinteger8Probe::m_output),
-                     "ns3::TracedValue::Uint8Callback")
+                     "ns3::TracedValueCallback::Uint8")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/stats/test/double-probe-test-suite.cc ns-3.24/src/stats/test/double-probe-test-suite.cc
--- ns-3.23/src/stats/test/double-probe-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/stats/test/double-probe-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -64,7 +64,7 @@
     .SetParent<Object> ()
     .AddTraceSource ("Emitter", "XX",
                      MakeTraceSourceAccessor (&SampleEmitter::m_trace),
-                     "ns3::TracedValue::DoubleCallback")
+                     "ns3::TracedValueCallback::Double")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/tap-bridge/bindings/modulegen__gcc_ILP32.py ns-3.24/src/tap-bridge/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -242,6 +242,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -277,6 +283,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -496,17 +509,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -528,11 +541,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -542,16 +550,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -789,14 +787,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -857,11 +859,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DataRate_methods(root_module, cls):
@@ -1814,7 +1811,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2887,11 +2884,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4117,6 +4124,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -4129,6 +4137,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/tap-bridge/bindings/modulegen__gcc_LP64.py ns-3.24/src/tap-bridge/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -242,6 +242,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -277,6 +283,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -496,17 +509,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -528,11 +541,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -542,16 +550,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -789,14 +787,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -857,11 +859,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DataRate_methods(root_module, cls):
@@ -1814,7 +1811,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2887,11 +2884,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4117,6 +4124,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -4129,6 +4137,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/tap-bridge/model/tap-bridge.h ns-3.24/src/tap-bridge/model/tap-bridge.h
--- ns-3.23/src/tap-bridge/model/tap-bridge.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/tap-bridge/model/tap-bridge.h	2015-09-15 11:18:44.000000000 -0700
@@ -35,6 +35,10 @@
 
 namespace ns3 {
 
+/**
+ * \ingroup tap-bridge
+ * Class to perform the actual reading from a socket
+ */
 class TapBridgeFdReader : public FdReader
 {
 private:
@@ -103,6 +107,10 @@
 class TapBridge : public NetDevice
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -217,10 +225,29 @@
    */
   virtual void DoDispose (void);
 
+  /**
+   * Receives a packet from a bridged Device
+   * \param device the originating port
+   * \param packet the received packet
+   * \param protocol the packet protocol (e.g., Ethertype)
+   * \param src the packet source
+   * \param dst the packet destination
+   * \param packetType the packet type (e.g., host, broadcast, etc.)
+   * \returns true on success
+   */
   bool ReceiveFromBridgedDevice (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol,
                                  Address const &src, Address const &dst, PacketType packetType);
 
-  bool DiscardFromBridgedDevice (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol, Address const &src);
+  /**
+   * Receives a packet from a bridged Device
+   * \param device the originating port
+   * \param packet the received packet
+   * \param protocol the packet protocol (e.g., Ethertype)
+   * \param src the packet source
+   * \returns true on success
+   */
+  bool DiscardFromBridgedDevice (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol,
+                                 Address const &src);
 
 private:
 
@@ -247,13 +274,13 @@
    */
   void ReadCallback (uint8_t *buf, ssize_t len);
 
-  /*
+  /**
    * 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
    *            received from the host.
-   * \param buf The length of the buffer.
+   * \param len The length of the buffer.
    */
   void ForwardToBridgedDevice (uint8_t *buf, ssize_t len);
 
@@ -274,9 +301,13 @@
    *               either the Ethernet header in the case of type interpretation
    *               (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.
    */
   Ptr<Packet> Filter (Ptr<Packet> packet, Address *src, Address *dst, uint16_t *type);
 
+  /**
+   * Notifies that the link is up and ready.
+   */
   void NotifyLinkUp (void);
 
   /**
@@ -405,7 +436,7 @@
    */
   uint8_t *m_packetBuffer;
 
-  /*
+  /**
    * 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 
    * multithreaded apps is not a good thing.
diff -Naur ns-3.23/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc ns-3.24/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc
--- ns-3.23/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -79,6 +79,12 @@
   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:
@@ -115,6 +121,18 @@
   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)
 {
diff -Naur ns-3.23/src/test/ns3tcp/ns3tcp-interop-test-suite.cc ns-3.24/src/test/ns3tcp/ns3tcp-interop-test-suite.cc
--- ns-3.23/src/test/ns3tcp/ns3tcp-interop-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/test/ns3tcp/ns3tcp-interop-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -110,10 +110,9 @@
 {
   //
   // We expect there to be a file called tcp-interop-response-vectors.pcap in
-  // response-vectors/ of this directory
+  // the data directory
   //
-  m_pcapFilename = static_cast<std::string> (NS_TEST_SOURCEDIR) + 
-    static_cast<std::string> ("/response-vectors/ns3tcp-interop-response-vectors.pcap");
+  m_pcapFilename = CreateDataDirFilename ("ns3tcp-interop-response-vectors.pcap");
 
   if (m_writeVectors)
     {
@@ -157,15 +156,10 @@
       Time tNow = Simulator::Now ();
       int64_t tMicroSeconds = tNow.GetMicroSeconds ();
 
-      uint32_t size = p->GetSize ();
-      uint8_t *buf = new uint8_t[size];
-      p->CopyData (buf, size);
-
       m_pcapFile.Write (uint32_t (tMicroSeconds / 1000000), 
                         uint32_t (tMicroSeconds % 1000000), 
-                        buf, 
-                        size);
-      delete [] buf;
+                        p
+                        );
     }
   else
     {
@@ -311,6 +305,9 @@
 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);
 }
 
diff -Naur ns-3.23/src/test/ns3tcp/ns3tcp-loss-test-suite.cc ns-3.24/src/test/ns3tcp/ns3tcp-loss-test-suite.cc
--- ns-3.23/src/test/ns3tcp/ns3tcp-loss-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/test/ns3tcp/ns3tcp-loss-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -118,10 +118,10 @@
 {
   //
   // We expect there to be a file called ns3tcp-state-response-vectors.pcap in
-  // response-vectors/ of this directory
+  // the data directory
   //
   std::ostringstream oss;
-  oss << "/response-vectors/ns3tcp-loss-" << m_tcpModel << m_testCase << "-response-vectors.pcap";
+  oss << "ns3tcp-loss-" << m_tcpModel << m_testCase << "-response-vectors.pcap";
   m_pcapFilename = CreateDataDirFilename(oss.str ());
 
   if (m_writeVectors)
@@ -132,7 +132,9 @@
   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");
+      NS_ABORT_MSG_UNLESS (m_pcapFile.GetDataLinkType () == PCAP_LINK_TYPE,
+                           "Wrong response vectors in directory: opening " <<
+                           m_pcapFilename);
     }
 }
 
@@ -166,15 +168,11 @@
       Time tNow = Simulator::Now ();
       int64_t tMicroSeconds = tNow.GetMicroSeconds ();
 
-      uint32_t size = p->GetSize ();
-      uint8_t *buf = new uint8_t[size];
-      p->CopyData (buf, size);
 
       m_pcapFile.Write (uint32_t (tMicroSeconds / 1000000), 
                         uint32_t (tMicroSeconds % 1000000), 
-                        buf, 
-                        size);
-      delete [] buf;
+                        p
+                        );
     }
   else
     {
@@ -457,7 +455,8 @@
 Ns3TcpLossTestSuite::Ns3TcpLossTestSuite ()
   : TestSuite ("ns3-tcp-loss", SYSTEM)
 {
-  SetDataDir (NS_TEST_SOURCEDIR);
+  // We can't use NS_TEST_SOURCEDIR variable here because we use subdirectories
+  SetDataDir ("src/test/ns3tcp/response-vectors");
   Packet::EnablePrinting ();  // Enable packet metadata for all test cases
 
   AddTestCase (new Ns3TcpLossTestCase ("Tahoe", 0), TestCase::QUICK);
diff -Naur ns-3.23/src/test/ns3tcp/ns3tcp-socket-writer.cc ns-3.24/src/test/ns3tcp/ns3tcp-socket-writer.cc
--- ns-3.23/src/test/ns3tcp/ns3tcp-socket-writer.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/test/ns3tcp/ns3tcp-socket-writer.cc	2015-09-15 11:18:44.000000000 -0700
@@ -33,6 +33,18 @@
   m_node = 0;
 }
 
+/* static */
+TypeId
+SocketWriter::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::SocketWriter")
+    .SetParent<Application> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<SocketWriter> ()
+    ;
+  return tid;
+}
+  
 void
 SocketWriter::StartApplication ()
 {
diff -Naur ns-3.23/src/test/ns3tcp/ns3tcp-socket-writer.h ns-3.24/src/test/ns3tcp/ns3tcp-socket-writer.h
--- ns-3.23/src/test/ns3tcp/ns3tcp-socket-writer.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/test/ns3tcp/ns3tcp-socket-writer.h	2015-09-15 11:18:44.000000000 -0700
@@ -30,6 +30,12 @@
 public:
   SocketWriter ();
   virtual ~SocketWriter ();
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
   void Setup (Ptr<Node> node, Address peer);
   void Connect ();
   void Write (uint32_t numBytes);
diff -Naur ns-3.23/src/test/ns3tcp/ns3tcp-state-test-suite.cc ns-3.24/src/test/ns3tcp/ns3tcp-state-test-suite.cc
--- ns-3.23/src/test/ns3tcp/ns3tcp-state-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/test/ns3tcp/ns3tcp-state-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -115,11 +115,12 @@
 {
   //
   // We expect there to be a file called ns3tcp-state-response-vectors.pcap in
-  // response-vectors/ of this directory
+  // the data directory
   //
   std::ostringstream oss;
-  oss << "/response-vectors/ns3tcp-state" << m_testCase << "-response-vectors.pcap";
-  m_pcapFilename = static_cast<std::string> (NS_TEST_SOURCEDIR) + oss.str ();
+  oss << "ns3tcp-state" << m_testCase << "-response-vectors.pcap";
+  m_pcapFilename = CreateDataDirFilename (oss.str ());
+  std::cout << "m_pcapFilename=" << m_pcapFilename << std::endl;
 
   if (m_writeVectors)
     {
@@ -129,7 +130,9 @@
   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");
+      NS_ABORT_MSG_UNLESS (m_pcapFile.GetDataLinkType () == PCAP_LINK_TYPE,
+                           "Wrong response vectors in directory: opening " <<
+                           m_pcapFilename);
     }
 }
 
@@ -170,15 +173,9 @@
       Time tNow = Simulator::Now ();
       int64_t tMicroSeconds = tNow.GetMicroSeconds ();
 
-      uint32_t size = p->GetSize ();
-      uint8_t *buf = new uint8_t[size];
-      p->CopyData (buf, size);
-
       m_pcapFile.Write (uint32_t (tMicroSeconds / 1000000), 
                         uint32_t (tMicroSeconds % 1000000), 
-                        buf, 
-                        size);
-      delete [] buf;
+                        p);
     }
   else
     {
@@ -457,7 +454,10 @@
 Ns3TcpStateTestSuite::Ns3TcpStateTestSuite ()
   : TestSuite ("ns3-tcp-state", SYSTEM)
 {
+  // We can't use NS_TEST_SOURCEDIR variable here because we use subdirectories
+  SetDataDir ("src/test/ns3tcp/response-vectors");
   Packet::EnablePrinting ();  // Enable packet metadata for all test cases
+  
   AddTestCase (new Ns3TcpStateTestCase (0), TestCase::QUICK);
   AddTestCase (new Ns3TcpStateTestCase (1), TestCase::QUICK);
   AddTestCase (new Ns3TcpStateTestCase (2), TestCase::QUICK);
diff -Naur ns-3.23/src/test/ns3wifi/wifi-interference-test-suite.cc ns-3.24/src/test/ns3wifi/wifi-interference-test-suite.cc
--- ns-3.23/src/test/ns3wifi/wifi-interference-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/test/ns3wifi/wifi-interference-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,4 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
  * Copyright (c) 2009 University of Washington
  *
diff -Naur ns-3.23/src/test/traced/traced-callback-typedef-test-suite.cc ns-3.24/src/test/traced/traced-callback-typedef-test-suite.cc
--- ns-3.23/src/test/traced/traced-callback-typedef-test-suite.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/test/traced/traced-callback-typedef-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,647 @@
+/* -*- 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>
+ */
+
+#include "ns3/test.h"
+#include "ns3/core-module.h"
+
+#include "ns3/dsr-module.h"       // DsrOPtionSRHeader
+#include "ns3/internet-module.h"  // Ipv4, Ipv4L3Protocol, Ipv4PacketProbe
+                                  // Ipv6L3Protocol, Ipv6PacketProbe
+#include "ns3/lr-wpan-mac.h"      // LrWpanMac
+#include "ns3/lte-module.h"       // PhyReceptionStatParameters,
+                                  // PhyTransmissionStatParameters,
+                                  // LteUePowerControl
+#include "ns3/mesh-module.h"      // PeerManagementProtocol
+#include "ns3/mobility-module.h"  // MobilityModel
+#include "ns3/network-module.h"   // Packet, PacketBurst
+#include "ns3/olsr-module.h"      // olsr::RoutingProtocol
+#include "ns3/sixlowpan-module.h" // SixLowPanNetDevice
+#include "ns3/spectrum-module.h"  // SpectrumValue
+#include "ns3/stats-module.h"     // TimeSeriesAdapter
+#include "ns3/uan-module.h"       // UanPhy
+#include "ns3/wifi-module.h"      // WifiMacHeader, WifiPhyStateHelper
+
+
+#include <iostream>
+#include <sstream>
+#include <set>
+#include <string>
+
+using namespace ns3;
+
+namespace {
+
+/**
+ * Stringify the known TracedCallback type names.
+ *
+ * \tparam T \explicit The typedef name.
+ * \param [in] N The number of arguments expected.
+ * \returns The \c TracedCallback type name.
+ */
+template <typename T> inline
+std::string TypeName (int N) { return "unknown"; }
+
+#define TYPENAME(T)		  \
+  template <> inline std::string  \
+  TypeName < T >     (int N)	  \
+  {				  \
+    std::stringstream ss;	  \
+    ss << # T << "(" << N << ")"; \
+    return ss.str ();		  \
+  }
+
+/**
+ * \name Stringify known typename.
+ * @{
+ */
+TYPENAME (dsr::DsrOptionSRHeader::TracedCallback);
+TYPENAME (EpcUeNas::StateTracedCallback);
+TYPENAME (Ipv4L3Protocol::DropTracedCallback);
+TYPENAME (Ipv4L3Protocol::SentTracedCallback);
+TYPENAME (Ipv4L3Protocol::TxRxTracedCallback);
+TYPENAME (Ipv6L3Protocol::DropTracedCallback);
+TYPENAME (Ipv6L3Protocol::SentTracedCallback);
+TYPENAME (Ipv6L3Protocol::TxRxTracedCallback);
+TYPENAME (LrWpanMac::SentTracedCallback);
+TYPENAME (LrWpanMac::StateTracedCallback);
+TYPENAME (LrWpanPhy::StateTracedCallback);
+// TYPENAME (LteEnbMac::DlSchedulingTracedCallback);
+TYPENAME (LteEnbMac::UlSchedulingTracedCallback);
+TYPENAME (LteEnbPhy::ReportInterferenceTracedCallback);
+TYPENAME (LteEnbPhy::ReportUeSinrTracedCallback);
+TYPENAME (LteEnbRrc::ConnectionHandoverTracedCallback);
+TYPENAME (LteEnbRrc::HandoverStartTracedCallback);
+TYPENAME (LteEnbRrc::NewUeContextTracedCallback);
+TYPENAME (LteEnbRrc::ReceiveReportTracedCallback);
+TYPENAME (LtePdcp::PduRxTracedCallback);  
+TYPENAME (LtePdcp::PduTxTracedCallback);
+TYPENAME (LteUePhy::StateTracedCallback);
+TYPENAME (LteUePhy::RsrpSinrTracedCallback);  
+TYPENAME (LteUePhy::RsrpRsrqTracedCallback);
+TYPENAME (LteUeRrc::CellSelectionTracedCallback);
+TYPENAME (LteUeRrc::StateTracedCallback);  
+TYPENAME (Mac48Address::TracedCallback);
+TYPENAME (MobilityModel::TracedCallback);
+TYPENAME (olsr::RoutingProtocol::PacketTxRxTracedCallback);
+TYPENAME (olsr::RoutingProtocol::TableChangeTracedCallback);
+TYPENAME (Packet::AddressTracedCallback);
+TYPENAME (Packet::Mac48AddressTracedCallback);
+TYPENAME (Packet::SinrTracedCallback);
+TYPENAME (Packet::SizeTracedCallback);
+TYPENAME (Packet::TracedCallback);
+TYPENAME (PacketBurst::TracedCallback);
+TYPENAME (dot11s::PeerManagementProtocol::LinkOpenCloseTracedCallback);
+TYPENAME (PhyReceptionStatParameters::TracedCallback);
+TYPENAME (PhyTransmissionStatParameters::TracedCallback);
+TYPENAME (SixLowPanNetDevice::DropTracedCallback);
+TYPENAME (SixLowPanNetDevice::RxTxTracedCallback);
+TYPENAME (SpectrumChannel::LossTracedCallback);
+TYPENAME (SpectrumValue::TracedCallback);
+TYPENAME (TimeSeriesAdaptor::OutputTracedCallback);
+TYPENAME (UanMac::PacketModeTracedCallback);
+TYPENAME (UanMacCw::QueueTracedCallback);
+TYPENAME (UanMacRc::QueueTracedCallback);
+TYPENAME (UanNetDevice::RxTxTracedCallback);
+TYPENAME (UanPhy::TracedCallback);
+TYPENAME (UeManager::StateTracedCallback);
+TYPENAME (WifiMacHeader::TracedCallback);
+TYPENAME (WifiPhyStateHelper::RxOkTracedCallback);
+TYPENAME (WifiPhyStateHelper::StateTracedCallback);
+TYPENAME (WifiPhyStateHelper::TxTracedCallback);
+TYPENAME (WifiRemoteStationManager::PowerChangeTracedCallback);
+TYPENAME (WifiRemoteStationManager::RateChangeTracedCallback);
+/** @} */
+#undef TYPENAME
+
+
+/** Record typedefs which are identical to previously declared. */
+std::set<std::string>
+Duplicates (void)
+{
+  std::set<std::string> dupes;
+
+#define dupename(T)    dupes.insert (# T)
+  
+  dupename (LteRlc::NotifyTxTracedCallback);
+  dupename (LteRlc::ReceiveTracedCallback);
+  dupename (LteUeRrc::ImsiCidRntiTracedCallback);
+  dupename (LteUeRrc::MibSibHandoverTracedCallback);
+  dupename (WifiPhyStateHelper::RxEndErrorTracedCallback);
+
+#undef dupename
+  
+  return dupes;
+}
+  
+/**
+ * Container for duplicate types.
+ */
+std::set<std::string> g_dupes = Duplicates ();
+
+  
+/**
+ * Number of arguments passed to callback.
+ *
+ * Since the sink function is outside the invoking class,
+ * which in this case is TracedCallbackTestCase, we can't use
+ * the test macros directly.  Instead, we cache success
+ * in the \c g_NArgs global value, then inspect it
+ * in the TracedValueCallbackTestCase::CheckType method.
+ */
+int g_NArgs = 0;
+
+
+/**
+ * Log that a callback was invoked.
+ *
+ * We can't actually do anything with any of the arguments,
+ * but the fact we got called is what's important.
+ *
+ * \param [in] N The number of arguments passed to the callback.
+ */
+void SinkIt (unsigned int N)
+{
+  std::cout << "with " << N << " args." << std::endl;
+  g_NArgs = N;
+}
+
+/**
+ * Sink functions.
+ * @{
+ */
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+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) { SinkIt (1); }
+};
+/** @} */
+
+/** Non-const non-reference type. */
+template <typename T>
+struct NonConstReferenced
+{
+  typedef typename TypeTraits< typename TypeTraits<T>::ReferencedType >::NonConstType Type;
+};
+
+}  // anonymous namespace
+
+
+class TracedCallbackTypedefTestCase : public TestCase
+{
+public:
+  TracedCallbackTypedefTestCase ();
+  virtual ~TracedCallbackTypedefTestCase () {}
+  
+private:
+  
+  /** Invoker boilerplate. */
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  class 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 (g_NArgs == 0) std::cout << std::endl;
+      NS_ASSERT_MSG (g_NArgs && g_NArgs == N, "failed.");
+      g_NArgs = 0;
+    }
+  };  // CheckerBase
+  
+  /** Callback checkers. */
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  class 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>
+    
+  template <typename T1, typename T2, typename T3, typename T4>
+  class Checker<T1, T2, T3, T4, empty>
+    : public CheckerBase<T1, T2, T3, T4, empty>
+  {
+    TracedCallback<T1, T2, T3, T4> 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);
+      
+      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>
+    
+
+  template <typename T1, typename T2, typename T3>
+  class Checker<T1, T2, T3, empty, empty>
+    : public CheckerBase<T1, T2, T3, empty, empty>
+  {
+    TracedCallback<T1, T2, T3> m_cb;
+    
+  public:
+    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);
+      
+      std::cout << TypeName<U> (N) << " invoked ";
+      m_cb.ConnectWithoutContext (cb);
+      m_cb (this->m1, this->m2, this->m3);
+      this->Cleanup (N);
+    }
+  };  // Checker<3>
+    
+  template <typename T1, typename T2>
+  class 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)
+    {
+      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);
+    }
+  };  // Checker<2>
+
+  template <typename T1>
+  class 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>
+
+  virtual void DoRun (void);
+
+};  // TracedCallbackTypedefTestCase
+
+TracedCallbackTypedefTestCase::TracedCallbackTypedefTestCase ()
+  : TestCase ("Check basic TracedCallback operation")
+{
+}
+
+void
+TracedCallbackTypedefTestCase::DoRun (void)
+{
+
+#define DUPE(U, T1)                                                     \
+  if (g_dupes.find ( # U ) == g_dupes.end ())                           \
+    NS_TEST_ASSERT_MSG_NE (0, 1,                                        \
+                         "expected to find " <<  # U << " in dupes.");  \
+  if (TypeName<U> (0) == TypeName<T1> (0))                              \
+    std::cout << # U << " matches " << # T1  << std::endl;              \
+  else                                                                  \
+    NS_TEST_ASSERT_MSG_EQ                                               \
+      (TypeName<U> (0), TypeName<T1> (0),                               \
+       "the typedef " << # U <<                                         \
+       " 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> ()
+
+  CHECK (dsr::DsrOptionSRHeader::TracedCallback,
+         const dsr::DsrOptionSRHeader &,
+         empty, empty, empty, empty);
+
+  CHECK (EpcUeNas::StateTracedCallback,
+         EpcUeNas::State, EpcUeNas::State,
+         empty, empty, empty);
+
+  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);
+
+  CHECK (Ipv4L3Protocol::TxRxTracedCallback,
+         Ptr<const Packet>, Ptr<Ipv4>, uint32_t,
+         empty, empty);
+  
+  CHECK (Ipv6L3Protocol::DropTracedCallback,
+         const Ipv6Header &, Ptr<const Packet>,
+         Ipv6L3Protocol::DropReason, Ptr<Ipv6>, uint32_t
+        );
+
+  CHECK (Ipv6L3Protocol::SentTracedCallback,
+         const Ipv6Header &, Ptr<const Packet>, uint32_t,
+         empty, empty);
+
+  CHECK (Ipv6L3Protocol::TxRxTracedCallback,
+         Ptr<const Packet>, Ptr<Ipv6>, uint32_t,
+         empty, empty);
+
+  CHECK (LrWpanMac::SentTracedCallback,
+         Ptr<const Packet>, uint8_t, uint8_t,
+         empty, empty);
+
+  CHECK (LrWpanMac::StateTracedCallback,
+         LrWpanMacState, LrWpanMacState,
+         empty, empty, empty);
+
+  CHECK (LrWpanPhy::StateTracedCallback,
+         Time, LrWpanPhyEnumeration, LrWpanPhyEnumeration,
+         empty, empty);
+
+  
+  /*  Too many args :(
+  CHECK (LteEnbMac::DlSchedulingTracedCallback,
+         uint32_t, uint32_t, uint16_t,
+         uint8_t, uint16_t, uint8_t, uint16_t);
+  */
+
+  CHECK (LteEnbMac::UlSchedulingTracedCallback,
+         uint32_t, uint32_t, uint16_t, uint8_t, uint16_t);
+
+  CHECK (LteEnbPhy::ReportUeSinrTracedCallback,
+         uint16_t, uint16_t, double,
+         empty, empty);
+
+  CHECK (LteEnbPhy::ReportInterferenceTracedCallback,
+         uint16_t, Ptr<SpectrumValue>,
+         empty, empty, empty);
+
+  CHECK (LteEnbRrc::ConnectionHandoverTracedCallback,
+         uint64_t, uint16_t, uint16_t,
+         empty, empty);
+
+  CHECK (LteEnbRrc::HandoverStartTracedCallback,
+         uint64_t, uint16_t, uint16_t, uint16_t,
+         empty);
+  
+  CHECK (LteEnbRrc::NewUeContextTracedCallback,
+         uint16_t, uint16_t,
+         empty, empty, empty);
+
+  CHECK (LteEnbRrc::ReceiveReportTracedCallback,
+         uint64_t, uint16_t, uint16_t, LteRrcSap::MeasurementReport,
+         empty);
+
+  CHECK (LtePdcp::PduRxTracedCallback,
+         uint16_t, uint8_t, uint32_t, uint64_t,
+         empty);
+
+  CHECK (LtePdcp::PduTxTracedCallback,
+         uint16_t, uint8_t, uint32_t,
+         empty, empty);
+
+  DUPE  (LteRlc::NotifyTxTracedCallback, LtePdcp::PduTxTracedCallback);
+
+  DUPE  (LteRlc::ReceiveTracedCallback, LtePdcp::PduRxTracedCallback);
+
+  CHECK (LteUePhy::RsrpSinrTracedCallback,
+         uint16_t, uint16_t, double, double,
+         empty);
+         
+  CHECK (LteUePhy::RsrpRsrqTracedCallback,
+         uint16_t, uint16_t, double, double, bool);
+         
+  CHECK (LteUePhy::StateTracedCallback,
+         uint16_t, uint16_t, LteUePhy::State, LteUePhy::State,
+         empty);
+
+  DUPE   (LteUePowerControl::TxPowerTracedCallback, LteEnbPhy::ReportUeSinrTracedCallback);
+
+  CHECK (LteUeRrc::CellSelectionTracedCallback,
+         uint64_t, uint16_t,
+         empty, empty, empty);
+
+  DUPE  (LteUeRrc::ImsiCidRntiTracedCallback, LteEnbRrc::ConnectionHandoverTracedCallback);
+
+  DUPE   (LteUeRrc::MibSibHandoverTracedCallback, LteEnbRrc::HandoverStartTracedCallback);
+
+  CHECK (LteUeRrc::StateTracedCallback,
+         uint64_t, uint16_t, uint16_t, LteUeRrc::State, LteUeRrc::State);
+         
+  CHECK (Mac48Address::TracedCallback,
+         Mac48Address,
+         empty, empty, empty, empty);
+
+  CHECK (MobilityModel::TracedCallback,
+         Ptr<const MobilityModel>,
+         empty, empty, empty, empty);
+
+  CHECK (olsr::RoutingProtocol::PacketTxRxTracedCallback,
+         const olsr::PacketHeader &, const olsr::MessageList &,
+         empty, empty, empty);
+
+  CHECK (olsr::RoutingProtocol::TableChangeTracedCallback,
+         uint32_t,
+         empty, empty, empty, empty);
+
+  CHECK (Packet::AddressTracedCallback,
+         Ptr<const Packet>, const Address &,
+         empty, empty, empty);
+
+  CHECK (Packet::Mac48AddressTracedCallback,
+         Ptr<const Packet>, Mac48Address,
+         empty, empty, empty);
+
+  CHECK (Packet::SinrTracedCallback,
+         Ptr<const Packet>, double,
+         empty, empty, empty);
+
+  CHECK (Packet::SizeTracedCallback,
+         uint32_t, uint32_t,
+         empty, empty, empty);
+
+  CHECK (Packet::TracedCallback,
+         Ptr<const Packet>,
+         empty, empty, empty, empty);
+
+  CHECK (PacketBurst::TracedCallback,
+         Ptr<const PacketBurst>,
+         empty, empty, empty, empty);
+
+  CHECK (dot11s::PeerManagementProtocol::LinkOpenCloseTracedCallback,
+         Mac48Address, Mac48Address,
+         empty, empty, empty);
+         
+  CHECK (PhyReceptionStatParameters::TracedCallback,
+         PhyReceptionStatParameters,
+         empty, empty, empty, empty);
+
+  CHECK (PhyTransmissionStatParameters::TracedCallback,
+         PhyTransmissionStatParameters,
+         empty, empty, empty, empty);
+
+  CHECK (SixLowPanNetDevice::DropTracedCallback,
+         SixLowPanNetDevice::DropReason, Ptr<const Packet>,
+         Ptr<SixLowPanNetDevice>, uint32_t,
+         empty);
+
+  CHECK (SixLowPanNetDevice::RxTxTracedCallback,
+         Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t,
+         empty, empty);
+
+  CHECK (SpectrumChannel::LossTracedCallback,
+         Ptr<SpectrumPhy>, Ptr<SpectrumPhy>, double,
+         empty, empty);
+  
+  CHECK (SpectrumValue::TracedCallback,
+         Ptr<SpectrumValue>,
+         empty, empty, empty, empty);
+
+  CHECK (TimeSeriesAdaptor::OutputTracedCallback,
+         double, double,
+         empty, empty, empty);
+
+  CHECK (UanMac::PacketModeTracedCallback,
+         Ptr<const Packet>, UanTxMode,
+         empty, empty, empty);
+         
+  CHECK (UanMacCw::QueueTracedCallback,
+         Ptr<const Packet>, uint16_t,
+         empty, empty, empty);
+         
+  CHECK (UanMacRc::QueueTracedCallback,
+         Ptr<const Packet>, uint32_t,
+         empty, empty, empty);
+
+  CHECK (UanNetDevice::RxTxTracedCallback,
+         Ptr<const Packet>, UanAddress,
+         empty, empty, empty);
+         
+  CHECK (UanPhy::TracedCallback,
+         Ptr<const Packet>, double, UanTxMode,
+         empty, empty);
+
+  CHECK (UeManager::StateTracedCallback,
+         uint64_t, uint16_t, uint16_t, UeManager::State, UeManager::State);
+  
+  CHECK (WifiMacHeader::TracedCallback,
+         const WifiMacHeader &,
+         empty, empty, empty, empty);
+
+  DUPE   (WifiPhyStateHelper::RxEndErrorTracedCallback, Packet::SinrTracedCallback);
+
+  CHECK (WifiPhyStateHelper::RxOkTracedCallback,
+         Ptr<const Packet>, double, WifiMode, WifiPreamble,
+         empty);
+
+  CHECK (WifiPhyStateHelper::StateTracedCallback,
+         Time, Time, WifiPhy::State,
+         empty, empty);
+
+  CHECK (WifiPhyStateHelper::TxTracedCallback,
+         Ptr<const Packet>, WifiMode, WifiPreamble, uint8_t,
+         empty);
+
+  CHECK (WifiRemoteStationManager::PowerChangeTracedCallback,
+         uint8_t, Mac48Address,
+         empty, empty, empty);
+
+  CHECK (WifiRemoteStationManager::RateChangeTracedCallback,
+         uint32_t, Mac48Address,
+         empty, empty, empty);
+}
+
+class TracedCallbackTypedefTestSuite : public TestSuite
+{
+public:
+  TracedCallbackTypedefTestSuite ();
+};
+
+TracedCallbackTypedefTestSuite::TracedCallbackTypedefTestSuite ()
+  : TestSuite ("traced-callback-typedef", SYSTEM)
+{
+  AddTestCase (new TracedCallbackTypedefTestCase, TestCase::QUICK);
+}
+
+static TracedCallbackTypedefTestSuite tracedCallbackTypedefTestSuite;
diff -Naur ns-3.23/src/test/traced/traced-value-callback-typedef-test-suite.cc ns-3.24/src/test/traced/traced-value-callback-typedef-test-suite.cc
--- ns-3.23/src/test/traced/traced-value-callback-typedef-test-suite.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/test/traced/traced-value-callback-typedef-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,240 @@
+/* -*- 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>
+ */
+
+#include "ns3/test.h"
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"  // SequenceNumber32
+
+using namespace ns3;
+
+namespace {
+
+/**
+ * \name Stringify the known TracedValue type names.
+ *
+ * \returns The \c TracedValueCallback type name.
+ * @{
+ */
+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" ; }
+template <> inline std::string TypeName <int32_t>  (void) { return "Int32_t" ; }
+template <> inline std::string TypeName <uint8_t>  (void) { return "Uint8_t" ; }
+template <> inline std::string TypeName <uint16_t> (void) { return "Uint16_t"; }
+template <> inline std::string TypeName <uint32_t> (void) { return "Uint32_t"; }
+template <> inline std::string TypeName <double>   (void) { return "Double"  ; }
+template <> inline std::string TypeName <Time>     (void) { return "Time"    ; }
+template <> inline std::string TypeName <SequenceNumber32> (void) { return "SequenceNumber32" ; }
+/** @} */
+
+
+/**
+ * Result of callback test.
+ *
+ * Since the sink function is outside the invoking class,
+ * which in this case is TracedValueCallbackTestCase, we can't use
+ * the test macros directly.  Instead, we cache the result
+ * in the \c g_Result global value, then inspect it
+ * in the TracedValueCallbackTestCase::CheckType method.
+ */
+std::string g_Result = "";
+  
+
+/**
+ * Template for TracedValue sink functions.
+ *
+ * This generates a sink function for any underlying type.
+ *
+ * \tparam T \explicit The type of the value being traced.
+ *        Since the point of this template is to create a
+ *        sink function, the template type must be given explicitly.
+ * \param [in] oldValue The original value.
+ * \param [in] newValue The new value.
+ */
+template <typename T>
+void TracedValueCbSink (T oldValue, T newValue)
+{
+  std::cout << ": "
+            << (int64_t)oldValue << " -> "
+            << (int64_t)newValue
+            << std::endl;
+  if (oldValue != 0)
+    g_Result = "oldValue should be 0";
+  else if (newValue != 1)
+    g_Result = "newValue should be 1";
+
+}  // TracedValueCbSink<>()
+  
+/**
+ * TracedValueCbSink specialization for Time.
+ */
+template <>
+void TracedValueCbSink<Time> (Time oldValue, Time newValue)
+{
+  TracedValueCbSink <int64_t> (oldValue.GetInteger (),
+                               newValue.GetInteger ());
+}
+/**
+ * TracedValueCbSink specialization for SequenceNumber32.
+ */
+template <>  
+void TracedValueCbSink<SequenceNumber32> (SequenceNumber32 oldValue,
+                                          SequenceNumber32 newValue)
+{
+  TracedValueCbSink <int64_t> (oldValue.GetValue (), newValue.GetValue ());
+}
+
+
+}  // anonymous namespace
+
+  
+class TracedValueCallbackTestCase : public TestCase
+{
+public:
+  TracedValueCallbackTestCase ();
+  virtual ~TracedValueCallbackTestCase () {}
+
+private:
+
+  /**
+   * A class to check that the callback function typedef will
+   * actually connect to the TracedValue.
+   */
+  template <typename T>
+  class CheckTvCb : public Object
+  {
+    TracedValue<T> m_value;
+
+  public:
+    /** Constructor. */
+    CheckTvCb (void)  : m_value (0)  { }
+    
+    /** Register this type. */
+    static TypeId GetTypeId (void)
+    {
+      static TypeId tid =
+        TypeId ( ("CheckTvCb<" + TypeName<T>() + ">").c_str ())
+        .SetParent <Object> ()
+        .AddTraceSource ("value",
+                         "A value being traced.",
+                         MakeTraceSourceAccessor (&CheckTvCb<T>::m_value),
+                         ("ns3::TracedValueCallback::" + TypeName<T>()).c_str () )
+        ;
+      return tid;
+    }  // GetTypeId ()
+
+    /**
+     * Check the sink function against the actual TracedValue invocation.
+     *
+     * We connect the TracedValue to the sink.  If the types
+     * aren't compatible, the connection will fail.
+     *
+     * Just to make sure, we increment the TracedValue,
+     * which calls the sink..
+     */
+    template <typename U>
+    void Invoke (U cb)
+    {
+      bool ok = TraceConnectWithoutContext ("value", MakeCallback (cb));
+      std::cout << GetTypeId () << ": "
+                << (ok ? "connected " : "failed to connect ")
+                << GetTypeId ().GetTraceSource (0).callback
+        ;
+      // The endl is in the sink function.
+      
+      if (ok)
+        // Odd form here is to accomodate the uneven operator support
+        // of Time and SequenceNumber32.
+        m_value = m_value + (T) 1; 
+      else
+        {
+          // finish the line started above
+          std::cout << std::endl;
+
+          // and log the error
+          g_Result = "failed to connect callback";
+        }
+
+    }  // Invoke()
+
+  };  // class CheckTvCb<T>
+  
+
+  /**
+   * Check the TracedValue typedef against TracedValueCbSink<T>.
+   *
+   * We instantiate a sink function of type \c U, initialized to
+   * TracedValueCbSink<T>.  If this compiles, we've proved the
+   * sink function and the typedef agree.
+   *
+   * \tparam T \explicit The base type.
+   * \tparam U \explicit The TracedValueCallback sink typedef type.
+   */
+  template <typename T, typename U>
+  void CheckType (void)
+  {
+    U sink = TracedValueCbSink<T>;
+    CreateObject<CheckTvCb<T> > ()->Invoke (sink);
+
+    NS_TEST_ASSERT_MSG_EQ (g_Result, "", g_Result);
+    g_Result = "";
+    
+  }  // CheckType<>()
+    
+  virtual void DoRun (void);
+
+};
+
+TracedValueCallbackTestCase::TracedValueCallbackTestCase ()
+  : TestCase ("Check basic TracedValue callback operation")
+{
+}
+
+void
+TracedValueCallbackTestCase::DoRun (void)
+{
+  CheckType< bool,     TracedValueCallback::Bool   > ();
+  CheckType< int8_t,   TracedValueCallback::Int8   > ();
+  CheckType< int16_t,  TracedValueCallback::Int16  > ();
+  CheckType< int32_t,  TracedValueCallback::Int32  > ();
+  CheckType< uint8_t,  TracedValueCallback::Uint8  > ();
+  CheckType< uint16_t, TracedValueCallback::Uint16 > ();
+  CheckType< uint32_t, TracedValueCallback::Uint32 > ();
+  CheckType< double,   TracedValueCallback::Double > ();
+  CheckType< Time,     TracedValueCallback::Time   > ();
+  CheckType< SequenceNumber32, TracedValueCallback::SequenceNumber32 > ();
+}
+
+class TracedValueCallbackTestSuite : public TestSuite
+{
+public:
+  TracedValueCallbackTestSuite ();
+};
+
+TracedValueCallbackTestSuite::TracedValueCallbackTestSuite ()
+  : TestSuite ("traced-value-callback", UNIT)
+{
+  AddTestCase (new TracedValueCallbackTestCase, TestCase::QUICK);
+}
+
+static TracedValueCallbackTestSuite tracedValueCallbackTestSuite;
diff -Naur ns-3.23/src/test/wscript ns-3.24/src/test/wscript
--- ns-3.23/src/test/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/test/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -15,15 +15,20 @@
     if 'test' in bld.env['MODULES_NOT_BUILT']:
         return
 
-    test = bld.create_ns3_module('test', ['internet', 'mobility', 'applications', 'csma', 'bridge', 'config-store', 'point-to-point', 'csma-layout', 'flow-monitor', 'wifi'])
+    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'])
+
     headers = bld(features='ns3header')
     headers.module = 'test'
 
     test_test = bld.create_ns3_module_test_library('test')
     test_test.source = [
         'csma-system-test-suite.cc',
-        'ns3wifi/wifi-interference-test-suite.cc',
-        'ns3wifi/wifi-msdu-aggregator-test-suite.cc',
         'ns3tcp/ns3tcp-cwnd-test-suite.cc',
         'ns3tcp/ns3tcp-interop-test-suite.cc',
         'ns3tcp/ns3tcp-loss-test-suite.cc',
@@ -32,5 +37,9 @@
         'ns3tcp/ns3tcp-state-test-suite.cc',
         'ns3tcp/nsctcp-loss-test-suite.cc',
         'ns3tcp/ns3tcp-socket-writer.cc',
+        'ns3wifi/wifi-interference-test-suite.cc',
+        'ns3wifi/wifi-msdu-aggregator-test-suite.cc',
+        'traced/traced-callback-typedef-test-suite.cc',
+        'traced/traced-value-callback-typedef-test-suite.cc',
         ]
 
diff -Naur ns-3.23/src/topology-read/bindings/modulegen__gcc_ILP32.py ns-3.24/src/topology-read/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/topology-read/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/topology-read/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -165,6 +165,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -200,6 +206,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -388,11 +401,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -1935,11 +1943,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2634,6 +2652,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -2646,6 +2665,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/topology-read/bindings/modulegen__gcc_LP64.py ns-3.24/src/topology-read/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/topology-read/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/topology-read/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -165,6 +165,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -200,6 +206,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -388,11 +401,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -1935,11 +1943,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2634,6 +2652,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -2646,6 +2665,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/topology-read/helper/topology-reader-helper.h ns-3.24/src/topology-read/helper/topology-reader-helper.h
--- ns-3.23/src/topology-read/helper/topology-reader-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/topology-read/helper/topology-reader-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -39,25 +39,25 @@
 
   /**
    * \brief Sets the input file name.
-   * \param fileName the input file name.
+   * \param [in] fileName The input file name.
    */
   void SetFileName (const std::string fileName);
 
   /**
    * \brief Sets the input file type. Supported file types are "Orbis", "Inet", "Rocketfuel".
-   * \param fileType the input file type.
+   * \param [in] fileType The input file type.
    */
   void SetFileType (const std::string fileType);
 
   /**
    * \brief Gets a Ptr<TopologyReader> to the actual TopologyReader.
-   * \return the created Topology Reader (or null if there was an error).
+   * \return The created Topology Reader (or null if there was an error).
    */
   Ptr<TopologyReader> GetTopologyReader ();
 
 private:
-  Ptr<TopologyReader> m_inputModel;  //!< Smart pointer to the actual topology model
-  std::string m_fileName;  //!< Name of the input file
+  Ptr<TopologyReader> m_inputModel;  //!< Smart pointer to the actual topology model.
+  std::string m_fileName;  //!< Name of the input file.
   std::string m_fileType;  //!< Type of the input file (e.g., "Inet", "Orbis", etc.).
 };
 
diff -Naur ns-3.23/src/topology-read/model/inet-topology-reader.cc ns-3.24/src/topology-read/model/inet-topology-reader.cc
--- ns-3.23/src/topology-read/model/inet-topology-reader.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/topology-read/model/inet-topology-reader.cc	2015-09-15 11:18:44.000000000 -0700
@@ -37,8 +37,9 @@
 TypeId InetTopologyReader::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::InetTopologyReader")
-    .SetParent<Object> ()
+    .SetParent<TopologyReader> ()
     .SetGroupName ("TopologyReader")
+    .AddConstructor<InetTopologyReader> ()
   ;
   return tid;
 }
diff -Naur ns-3.23/src/topology-read/model/inet-topology-reader.h ns-3.24/src/topology-read/model/inet-topology-reader.h
--- ns-3.23/src/topology-read/model/inet-topology-reader.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/topology-read/model/inet-topology-reader.h	2015-09-15 11:18:44.000000000 -0700
@@ -49,7 +49,7 @@
 public:
   /**
    * \brief Get the type ID.
-   * \return the object TypeId
+   * \return the object TypeId.
    */
   static TypeId GetTypeId (void);
 
@@ -66,7 +66,7 @@
    * Then reads until the end of the file (total links number rows) and saves
    * the structure of every single link in the topology.
    *
-   * \return the container of the nodes created (or empty container if there was an error)
+   * \return The container of the nodes created (or empty container if there was an error)
    */
   virtual NodeContainer Read (void);
 
@@ -74,13 +74,13 @@
   /**
    * \brief Copy constructor
    *
-   * Defined and unimplemented to avoid misuse
+   * Defined and unimplemented to avoid misuse.
    */
   InetTopologyReader (const InetTopologyReader&);
   /**
    * \brief Copy constructor
    *
-   * Defined and unimplemented to avoid misuse
+   * Defined and unimplemented to avoid misuse.
    * \returns
    */
   InetTopologyReader& operator= (const InetTopologyReader&);
diff -Naur ns-3.23/src/topology-read/model/orbis-topology-reader.cc ns-3.24/src/topology-read/model/orbis-topology-reader.cc
--- ns-3.23/src/topology-read/model/orbis-topology-reader.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/topology-read/model/orbis-topology-reader.cc	2015-09-15 11:18:44.000000000 -0700
@@ -37,8 +37,9 @@
 TypeId OrbisTopologyReader::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::OrbisTopologyReader")
-    .SetParent<Object> ()
+    .SetParent<TopologyReader> ()
     .SetGroupName ("TopologyReader")
+    .AddConstructor<OrbisTopologyReader> ()
   ;
   return tid;
 }
diff -Naur ns-3.23/src/topology-read/model/orbis-topology-reader.h ns-3.24/src/topology-read/model/orbis-topology-reader.h
--- ns-3.23/src/topology-read/model/orbis-topology-reader.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/topology-read/model/orbis-topology-reader.h	2015-09-15 11:18:44.000000000 -0700
@@ -46,7 +46,7 @@
 public:
   /**
    * \brief Get the type ID.
-   * \return the object TypeId
+   * \return the object TypeId.
    */
   static TypeId GetTypeId (void);
 
@@ -61,7 +61,7 @@
    * so the input file is read line by line to figure out how many links
    * and nodes are in the topology.
    *
-   * \return the container of the nodes created (or empty container if there was an error)
+   * \return The container of the nodes created (or empty container if there was an error)
    */
   virtual NodeContainer Read (void);
 
@@ -70,13 +70,13 @@
   /**
    * \brief Copy constructor
    *
-   * Defined and unimplemented to avoid misuse
+   * Defined and unimplemented to avoid misuse.
    */
   OrbisTopologyReader (const OrbisTopologyReader&);
   /**
    * \brief Copy constructor
    *
-   * Defined and unimplemented to avoid misuse
+   * Defined and unimplemented to avoid misuse.
    * \returns
    */
   OrbisTopologyReader& operator= (const OrbisTopologyReader&);
diff -Naur ns-3.23/src/topology-read/model/rocketfuel-topology-reader.cc ns-3.24/src/topology-read/model/rocketfuel-topology-reader.cc
--- ns-3.23/src/topology-read/model/rocketfuel-topology-reader.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/topology-read/model/rocketfuel-topology-reader.cc	2015-09-15 11:18:44.000000000 -0700
@@ -37,8 +37,9 @@
 TypeId RocketfuelTopologyReader::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::RocketfuelTopologyReader")
-    .SetParent<Object> ()
+    .SetParent<TopologyReader> ()
     .SetGroupName ("TopologyReader")
+    .AddConstructor<RocketfuelTopologyReader> ()
   ;
   return tid;
 }
diff -Naur ns-3.23/src/topology-read/model/rocketfuel-topology-reader.h ns-3.24/src/topology-read/model/rocketfuel-topology-reader.h
--- ns-3.23/src/topology-read/model/rocketfuel-topology-reader.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/topology-read/model/rocketfuel-topology-reader.h	2015-09-15 11:18:44.000000000 -0700
@@ -45,7 +45,7 @@
 public:
   /**
    * \brief Get the type ID.
-   * \return the object TypeId
+   * \return The object TypeId
    */
   static TypeId GetTypeId (void);
 
@@ -60,7 +60,7 @@
    * so the input file is read line by line to figure out how many links
    * and nodes are in the topology.
    *
-   * \return the container of the nodes created (or empty container if there was an error)
+   * \return The container of the nodes created (or empty container if there was an error)
    */
   virtual NodeContainer Read (void);
 
@@ -71,9 +71,9 @@
    * Parser for the *.cch file available at:
    * http://www.cs.washington.edu/research/networking/rocketfuel/maps/rocketfuel_maps_cch.tar.gz
    *
-   * \param argc argument counter
-   * \param argv argument vector
-   * \return the container of the nodes created (or empty container if there was an error)
+   * \param [in] argc Argument counter.
+   * \param [in] argv Argument vector.
+   * \return The container of the nodes created (or empty container if there was an error).
    */
   NodeContainer GenerateFromMapsFile (int argc, char *argv[]);
 
@@ -83,9 +83,9 @@
    * Parser for the weights.* file available at:
    * http://www.cs.washington.edu/research/networking/rocketfuel/maps/weights-dist.tar.gz
    *
-   * \param argc argument counter
-   * \param argv argument vector
-   * \return the container of the nodes created (or empty container if there was an error)
+   * \param [in] argc Argument counter.
+   * \param [in] argv Argument vector.
+   * \return The container of the nodes created (or empty container if there was an error).
    */
   NodeContainer GenerateFromWeightsFile (int argc, char *argv[]);
 
@@ -103,25 +103,25 @@
   /**
    * \brief Classifies the file type according to its content.
    *
-   * \return the file type (RF_MAPS, RF_WEIGHTS, or RF_UNKNOWN)
+   * \return The file type (RF_MAPS, RF_WEIGHTS, or RF_UNKNOWN)
    */
   enum RF_FileType GetFileType (const char *);
 
-  int m_linksNumber; //!< number of links
-  int m_nodesNumber; //!< number of nodes
-  std::map<std::string, Ptr<Node> > m_nodeMap; //!< map of the nodes (name, node)
+  int m_linksNumber; //!< Number of links.
+  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
+   * Defined and unimplemented to avoid misuse.
    */
   RocketfuelTopologyReader (const RocketfuelTopologyReader&);
   /**
    * \brief Copy constructor
    *
-   * Defined and unimplemented to avoid misuse
+   * Defined and unimplemented to avoid misuse.
    * \returns
    */
   RocketfuelTopologyReader& operator= (const RocketfuelTopologyReader&);
diff -Naur ns-3.23/src/topology-read/model/topology-reader.h ns-3.24/src/topology-read/model/topology-reader.h
--- ns-3.23/src/topology-read/model/topology-reader.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/topology-read/model/topology-reader.h	2015-09-15 11:18:44.000000000 -0700
@@ -60,74 +60,72 @@
     typedef std::map<std::string, std::string>::const_iterator ConstAttributesIterator;
 
     /**
-     * \brief Constructor
-     * \param fromPtr Ptr to the node the link is orginating from
-     * \param fromName name of the node the link is orginating from
-     * \param toPtr Ptr to the node the link is directed to
-     * \param toName name of the node the link is directed to
+     * \brief Constructor.
+     * \param [in] fromPtr Ptr to the node the link is originating from.
+     * \param [in] fromName Name of the node the link is originating from.
+     * \param [in] toPtr Ptr to the node the link is directed to.
+     * \param [in] toName Name of the node the link is directed to.
      */
     Link ( Ptr<Node> fromPtr, const std::string &fromName, Ptr<Node> toPtr, const std::string &toName );
 
     /**
-     * \brief Returns a Ptr<Node> to the "from" node of the link
-     * \return a Ptr<Node> to the "from" node of the link
+     * \brief Returns a Ptr<Node> to the "from" node of the link.
+     * \return A Ptr<Node> to the "from" node of the link.
      */
     Ptr<Node> GetFromNode (void) const;
     /**
-     * \brief Returns the name of the "from" node of the link
-     * \return the name of the "from" node of the link
+     * \brief Returns the name of the "from" node of the link.
+     * \return The name of the "from" node of the link.
      */
     std::string GetFromNodeName (void) const;
     /**
-     * \brief Returns a Ptr<Node> to the "to" node of the link
-     * \return a Ptr<Node> to the "to" node of the link
+     * \brief Returns a Ptr<Node> to the "to" node of the link.
+     * \return A Ptr<Node> to the "to" node of the link.
      */
     Ptr<Node> GetToNode (void) const;
     /**
-     * \brief Returns the name of the "to" node of the link
-     * \return the name of the "to" node of the link
+     * \brief Returns the name of the "to" node of the link.
+     * \return The name of the "to" node of the link.
      */
     std::string GetToNodeName (void) const;
     /**
      * \brief Returns the value of a link attribute. The attribute must exist.
-     *
-     * \param name the name of the attribute
-     *
-     * \return the value of the attribute
+     * \param [in] Name the name of the attribute.
+     * \return The value of the attribute.
      */
     std::string GetAttribute (const std::string &name) const;
     /**
      * \brief Returns the value of a link attribute.
-     * \param name the name of the attribute
-     * \param value the value of the attribute
+     * \param [in] name The name of the attribute.
+     * \param [out] value The value of the attribute.
      *
-     * \return true if the attribute was defined, false otherwise.
+     * \return True if the attribute was defined, false otherwise.
      */
     bool GetAttributeFailSafe (const std::string &name, std::string &value) const;
     /**
      * \brief Sets an arbitrary link attribute.
-     * \param name the name of the attribute
-     * \param value the value of the attribute
+     * \param [in] name The name of the attribute.
+     * \param [in] value The value of the attribute.
      */
     void SetAttribute (const std::string &name, const std::string &value);
     /**
      * \brief Returns an iterator to the begin of the attributes.
-     * \return a const iterator to the first attribute of a link.
+     * \return A const iterator to the first attribute of a link.
      */
     ConstAttributesIterator AttributesBegin (void) const;
     /**
      * \brief Returns an iterator to the end of the attributes.
-     * \return a const iterator to the last attribute of a link.
+     * \return A const iterator to the last attribute of a link.
      */
     ConstAttributesIterator AttributesEnd (void) const;
 
 private:
     Link ();
-    std::string m_fromName; //!< Name of the node the links originates from
-    Ptr< Node > m_fromPtr;  //!< The node the links originates from
-    std::string m_toName;   //!< Name of the node the links is directed to
-    Ptr< Node > m_toPtr;    //!< The node the links is directed to
-    std::map<std::string, std::string> m_linkAttr;  ///< Container of the link attributes (if any)
+    std::string m_fromName; //!< Name of the node the links originates from.
+    Ptr< Node > m_fromPtr;  //!< The node the links originates from.
+    std::string m_toName;   //!< Name of the node the links is directed to.
+    Ptr< Node > m_toPtr;    //!< The node the links is directed to.
+    std::map<std::string, std::string> m_linkAttr;  //!< Container of the link attributes (if any).
   };
 
   /**
@@ -137,7 +135,7 @@
 
   /**
    * \brief Get the type ID.
-   * \return the object TypeId
+   * \return The object TypeId.
    */
   static TypeId GetTypeId (void);
 
@@ -153,49 +151,49 @@
    * reader from the choices about actual IP number assignment and
    * kind of links between nodes.
    *
-   * \return the container of the nodes created (or null if there was an error)
+   * \return The container of the nodes created (or null if there was an error).
    */
   virtual NodeContainer Read (void) = 0;
 
   /**
    * \brief Sets the input file name.
-   * \param fileName the input file name.
+   * \param [in] fileName The input file name.
    */
   void SetFileName (const std::string &fileName);
 
   /**
    * \brief Returns the input file name.
-   * \return the input file name.
+   * \return The input file name.
    */
   std::string GetFileName (void) const;
 
   /**
    * \brief Returns an iterator to the the first link in this block.
-   * \return a const iterator to the first link in this block.
+   * \return A const iterator to the first link in this block.
    */
   ConstLinksIterator LinksBegin (void) const;
 
   /**
    * \brief Returns an iterator to the the last link in this block.
-   * \return a const iterator to the last link in this block.
+   * \return A const iterator to the last link in this block.
    */
   ConstLinksIterator LinksEnd (void) const;
 
   /**
    * \brief Returns the number of links in this block.
-   * \return the number of links in this block.
+   * \return The number of links in this block.
    */
   int LinksSize (void) const;
 
   /**
    * \brief Checks if the block contains any links.
-   * \return true if there are no links in this block, false otherwise.
+   * \return True if there are no links in this block, false otherwise.
    */
   bool LinksEmpty (void) const;
 
   /**
    * \brief Adds a link to the topology.
-   * \param link the link to be added.
+   * \param link [in] The link to be added.
    */
   void AddLink (Link link);
 
@@ -204,24 +202,24 @@
   /**
    * \brief Copy constructor
    *
-   * Defined and unimplemented to avoid misuse
+   * Defined and unimplemented to avoid misuse.
    */
   TopologyReader (const TopologyReader&);
   /**
    * \brief Copy constructor
    *
-   * Defined and unimplemented to avoid misuse
+   * Defined and unimplemented to avoid misuse.
    * \returns
    */
   TopologyReader& operator= (const TopologyReader&);
 
   /**
-   * the name of the input file
+   * The name of the input file.
    */
   std::string m_fileName;
 
   /**
-   * the container of the links between the nodes
+   * The container of the links between the nodes.
    */
   std::list<Link> m_linksList;
 
diff -Naur ns-3.23/src/uan/bindings/modulegen__gcc_ILP32.py ns-3.24/src/uan/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/uan/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -66,6 +66,10 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
@@ -330,6 +334,10 @@
     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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## mobility-model.h (module 'mobility'): ns3::MobilityModel [class]
     module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
@@ -418,6 +426,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -458,6 +472,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -483,6 +528,7 @@
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -604,6 +650,8 @@
     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_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
@@ -755,17 +803,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -787,11 +835,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -801,16 +844,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1048,14 +1081,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1116,11 +1153,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DeviceEnergyModelContainer_methods(root_module, cls):
@@ -1738,6 +1770,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -2140,7 +2244,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2292,10 +2396,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4570,11 +4674,11 @@
                    'ns3::Ptr< ns3::UanChannel >', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## uan-phy.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhy::GetDevice() [member function]
+    ## uan-phy.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::UanNetDevice >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## uan-phy.h (module 'uan'): ns3::UanTxMode ns3::UanPhy::GetMode(uint32_t n) [member function]
     cls.add_method('GetMode', 
                    'ns3::UanTxMode', 
@@ -4884,11 +4988,11 @@
                    'ns3::Ptr< ns3::UanChannel >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## uan-phy-dual.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhyDual::GetDevice() [member function]
+    ## uan-phy-dual.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhyDual::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::UanNetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## uan-phy-dual.h (module 'uan'): ns3::UanTxMode ns3::UanPhyDual::GetMode(uint32_t n) [member function]
     cls.add_method('GetMode', 
                    'ns3::UanTxMode', 
@@ -5218,11 +5322,11 @@
                    'ns3::UanModesList', 
                    [], 
                    is_static=True)
-    ## uan-phy-gen.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhyGen::GetDevice() [member function]
+    ## uan-phy-gen.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhyGen::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::UanNetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## uan-phy-gen.h (module 'uan'): ns3::UanTxMode ns3::UanPhyGen::GetMode(uint32_t n) [member function]
     cls.add_method('GetMode', 
                    'ns3::UanTxMode', 
@@ -5972,11 +6076,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -6193,10 +6307,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -6874,6 +6988,46 @@
                    is_virtual=True)
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3MobilityModel_methods(root_module, cls):
     ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel(ns3::MobilityModel const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MobilityModel const &', 'arg0')])
@@ -8269,6 +8423,7 @@
                         [])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -8282,6 +8437,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/uan/bindings/modulegen__gcc_LP64.py ns-3.24/src/uan/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/uan/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -66,6 +66,10 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
@@ -330,6 +334,10 @@
     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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## mobility-model.h (module 'mobility'): ns3::MobilityModel [class]
     module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
@@ -418,6 +426,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -458,6 +472,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -483,6 +528,7 @@
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -604,6 +650,8 @@
     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_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
@@ -755,17 +803,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -787,11 +835,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -801,16 +844,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1048,14 +1081,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1116,11 +1153,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3DeviceEnergyModelContainer_methods(root_module, cls):
@@ -1738,6 +1770,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -2140,7 +2244,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2292,10 +2396,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4570,11 +4674,11 @@
                    'ns3::Ptr< ns3::UanChannel >', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## uan-phy.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhy::GetDevice() [member function]
+    ## uan-phy.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::UanNetDevice >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## uan-phy.h (module 'uan'): ns3::UanTxMode ns3::UanPhy::GetMode(uint32_t n) [member function]
     cls.add_method('GetMode', 
                    'ns3::UanTxMode', 
@@ -4884,11 +4988,11 @@
                    'ns3::Ptr< ns3::UanChannel >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## uan-phy-dual.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhyDual::GetDevice() [member function]
+    ## uan-phy-dual.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhyDual::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::UanNetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## uan-phy-dual.h (module 'uan'): ns3::UanTxMode ns3::UanPhyDual::GetMode(uint32_t n) [member function]
     cls.add_method('GetMode', 
                    'ns3::UanTxMode', 
@@ -5218,11 +5322,11 @@
                    'ns3::UanModesList', 
                    [], 
                    is_static=True)
-    ## uan-phy-gen.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhyGen::GetDevice() [member function]
+    ## uan-phy-gen.h (module 'uan'): ns3::Ptr<ns3::UanNetDevice> ns3::UanPhyGen::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::UanNetDevice >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## uan-phy-gen.h (module 'uan'): ns3::UanTxMode ns3::UanPhyGen::GetMode(uint32_t n) [member function]
     cls.add_method('GetMode', 
                    'ns3::UanTxMode', 
@@ -5972,11 +6076,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -6193,10 +6307,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -6874,6 +6988,46 @@
                    is_virtual=True)
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3MobilityModel_methods(root_module, cls):
     ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel(ns3::MobilityModel const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MobilityModel const &', 'arg0')])
@@ -8269,6 +8423,7 @@
                         [])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -8282,6 +8437,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/uan/helper/uan-helper.cc ns-3.24/src/uan/helper/uan-helper.cc
--- ns-3.23/src/uan/helper/uan-helper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/helper/uan-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,4 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
  * uan-helper.cc
  *
diff -Naur ns-3.23/src/uan/helper/uan-helper.h ns-3.24/src/uan/helper/uan-helper.h
--- ns-3.23/src/uan/helper/uan-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/helper/uan-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,3 +1,4 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
  * Copyright (c) 2008 University of Washington
  *
diff -Naur ns-3.23/src/uan/model/acoustic-modem-energy-model.cc ns-3.24/src/uan/model/acoustic-modem-energy-model.cc
--- ns-3.23/src/uan/model/acoustic-modem-energy-model.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/acoustic-modem-energy-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -66,7 +66,7 @@
     .AddTraceSource ("TotalEnergyConsumption",
                      "Total energy consumption of the modem device.",
                      MakeTraceSourceAccessor (&AcousticModemEnergyModel::m_totalEnergyConsumption),
-                     "ns3::TracedValue::DoubleCallback")
+                     "ns3::TracedValueCallback::Double")
   ;
   return tid;
 }
diff -Naur ns-3.23/src/uan/model/uan-mac-aloha.cc ns-3.24/src/uan/model/uan-mac-aloha.cc
--- ns-3.23/src/uan/model/uan-mac-aloha.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-mac-aloha.cc	2015-09-15 11:18:44.000000000 -0700
@@ -70,7 +70,7 @@
 UanMacAloha::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanMacAloha")
-    .SetParent<Object> ()
+    .SetParent<UanMac> ()
     .SetGroupName ("Uan")
     .AddConstructor<UanMacAloha> ()
   ;
diff -Naur ns-3.23/src/uan/model/uan-mac-cw.cc ns-3.24/src/uan/model/uan-mac-cw.cc
--- ns-3.23/src/uan/model/uan-mac-cw.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-mac-cw.cc	2015-09-15 11:18:44.000000000 -0700
@@ -77,7 +77,7 @@
 UanMacCw::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanMacCw")
-    .SetParent<Object> ()
+    .SetParent<UanMac> ()
     .SetGroupName ("Uan")
     .AddConstructor<UanMacCw> ()
     .AddAttribute ("CW",
diff -Naur ns-3.23/src/uan/model/uan-mac-cw.h ns-3.24/src/uan/model/uan-mac-cw.h
--- ns-3.23/src/uan/model/uan-mac-cw.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-mac-cw.h	2015-09-15 11:18:44.000000000 -0700
@@ -107,7 +107,7 @@
    * \param [in] proto The protocol number.
    */
   typedef void (* QueueTracedCallback)
-    (const Ptr<const Packet> packet, const uint16_t proto);
+    (Ptr<const Packet> packet, uint16_t proto);
 
 private:
   /** Enum defining possible Phy states. */
diff -Naur ns-3.23/src/uan/model/uan-mac.h ns-3.24/src/uan/model/uan-mac.h
--- ns-3.23/src/uan/model/uan-mac.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-mac.h	2015-09-15 11:18:44.000000000 -0700
@@ -123,7 +123,7 @@
    * \param [in] mode The UanTxMode.
    */
   typedef void (* PacketModeTracedCallback)
-    (const Ptr<const Packet> packet, const UanTxMode & mode);
+    (Ptr<const Packet> packet, UanTxMode mode);
 
 };  // class UanMac
 
diff -Naur ns-3.23/src/uan/model/uan-mac-rc.cc ns-3.24/src/uan/model/uan-mac-rc.cc
--- ns-3.23/src/uan/model/uan-mac-rc.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-mac-rc.cc	2015-09-15 11:18:44.000000000 -0700
@@ -254,11 +254,11 @@
     .AddTraceSource ("Enqueue",
                      "A  (data) packet arrived at MAC for transmission.",
                      MakeTraceSourceAccessor (&UanMacRc::m_enqueueLogger),
-                     "ns3::UanMac::PacketModeTracedCallback")
+                     "ns3::UanMacRc::QueueTracedCallback")
     .AddTraceSource ("Dequeue",
                      "A  (data) packet was passed down to PHY from MAC.",
                      MakeTraceSourceAccessor (&UanMacRc::m_dequeueLogger),
-                     "ns3::UanMac::PacketModeTracedCallback")
+                     "ns3::UanMacRc::QueueTracedCallback")
     .AddTraceSource ("RX",
                      "A packet was destined for and received at this MAC layer.",
                      MakeTraceSourceAccessor (&UanMacRc::m_rxLogger),
diff -Naur ns-3.23/src/uan/model/uan-mac-rc-gw.h ns-3.24/src/uan/model/uan-mac-rc-gw.h
--- ns-3.23/src/uan/model/uan-mac-rc-gw.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-mac-rc-gw.h	2015-09-15 11:18:44.000000000 -0700
@@ -89,10 +89,8 @@
    * \param [in] actualX Current retry rate.
    */
   typedef void (* CycleCallback)
-    (const Time now, const Time delay,
-     const uint32_t numRts, const uint32_t totalBytes,
-     const double secs, const uint32_t ctlRate,
-     const double actualX);
+    (Time now, Time delay, uint32_t numRts, uint32_t totalBytes,
+     double secs, uint32_t ctlRate, double actualX);
 
   
 private:
diff -Naur ns-3.23/src/uan/model/uan-mac-rc.h ns-3.24/src/uan/model/uan-mac-rc.h
--- ns-3.23/src/uan/model/uan-mac-rc.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-mac-rc.h	2015-09-15 11:18:44.000000000 -0700
@@ -192,6 +192,15 @@
   virtual void Clear (void);
   int64_t AssignStreams (int64_t stream);
 
+  /**
+   *  TracedCallback signature for dequeue of a packet.
+   *
+   * \param [in] packet The Packet being received.
+   * \param [in] proto The protocol number.
+   */
+  typedef void (* QueueTracedCallback)
+    (Ptr<const Packet> packet, uint32_t proto);
+  
 private:
   /** MAC state. */
   enum State {
@@ -235,11 +244,11 @@
   Callback<void, Ptr<Packet>, const UanAddress& > m_forwardUpCb;
 
   /** A packet was destined for and received at this MAC layer. */
-  TracedCallback<Ptr<const Packet>, UanTxMode &> m_rxLogger;
+  TracedCallback<Ptr<const Packet>, UanTxMode > m_rxLogger;
   /** A packet arrived at the MAC for transmission. */
-  TracedCallback<Ptr<const Packet>, uint16_t > m_enqueueLogger;
+  TracedCallback<Ptr<const Packet>, uint32_t > m_enqueueLogger;
   /** A was passed down to the PHY from the MAC. */
-  TracedCallback<Ptr<const Packet>, uint16_t > m_dequeueLogger;
+  TracedCallback<Ptr<const Packet>, uint32_t > m_dequeueLogger;
 
   /** The RTS event. */
   EventId m_rtsEvent;
diff -Naur ns-3.23/src/uan/model/uan-net-device.h ns-3.24/src/uan/model/uan-net-device.h
--- ns-3.23/src/uan/model/uan-net-device.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -154,7 +154,7 @@
    * \param [in] address The source address.
    */
   typedef void (* RxTxTracedCallback)
-    (const Ptr<const Packet> packet, const UanAddress address);
+    (Ptr<const Packet> packet, UanAddress address);
   
 private:
   /**
diff -Naur ns-3.23/src/uan/model/uan-noise-model-default.cc ns-3.24/src/uan/model/uan-noise-model-default.cc
--- ns-3.23/src/uan/model/uan-noise-model-default.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-noise-model-default.cc	2015-09-15 11:18:44.000000000 -0700
@@ -40,7 +40,7 @@
 UanNoiseModelDefault::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanNoiseModelDefault")
-    .SetParent<Object> ()
+    .SetParent<UanNoiseModel> ()
     .SetGroupName ("Uan")
     .AddConstructor<UanNoiseModelDefault> ()
     .AddAttribute ("Wind", "Wind speed in m/s.",
diff -Naur ns-3.23/src/uan/model/uan-phy-dual.cc ns-3.24/src/uan/model/uan-phy-dual.cc
--- ns-3.23/src/uan/model/uan-phy-dual.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-phy-dual.cc	2015-09-15 11:18:44.000000000 -0700
@@ -58,7 +58,7 @@
 UanPhyCalcSinrDual::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanPhyCalcSinrDual")
-    .SetParent<Object> ()
+    .SetParent<UanPhyCalcSinr> ()
     .SetGroupName ("Uan")
     .AddConstructor<UanPhyCalcSinrDual> ()
   ;
@@ -498,7 +498,7 @@
   return m_phy1->GetChannel ();
 }
 Ptr<UanNetDevice>
-UanPhyDual::GetDevice (void)
+UanPhyDual::GetDevice (void) const
 {
   return m_phy1->GetDevice ();
 }
diff -Naur ns-3.23/src/uan/model/uan-phy-dual.h ns-3.24/src/uan/model/uan-phy-dual.h
--- ns-3.23/src/uan/model/uan-phy-dual.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-phy-dual.h	2015-09-15 11:18:44.000000000 -0700
@@ -126,7 +126,7 @@
   virtual bool IsStateTx (void);
   virtual bool IsStateCcaBusy (void);
   virtual Ptr<UanChannel> GetChannel (void) const;
-  virtual Ptr<UanNetDevice> GetDevice (void);
+  virtual Ptr<UanNetDevice> GetDevice (void) const;
   virtual void SetChannel (Ptr<UanChannel> channel);
   virtual void SetDevice (Ptr<UanNetDevice> device);
   virtual void SetMac (Ptr<UanMac> mac);
diff -Naur ns-3.23/src/uan/model/uan-phy-gen.cc ns-3.24/src/uan/model/uan-phy-gen.cc
--- ns-3.23/src/uan/model/uan-phy-gen.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-phy-gen.cc	2015-09-15 11:18:44.000000000 -0700
@@ -62,7 +62,7 @@
 UanPhyCalcSinrDefault::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanPhyCalcSinrDefault")
-    .SetParent<Object> ()
+    .SetParent<UanPhyCalcSinr> ()
     .SetGroupName ("Uan")
     .AddConstructor<UanPhyCalcSinrDefault> ()
   ;
@@ -110,7 +110,7 @@
 UanPhyCalcSinrFhFsk::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanPhyCalcSinrFhFsk")
-    .SetParent<Object> ()
+    .SetParent<UanPhyCalcSinr> ()
     .SetGroupName ("Uan")
     .AddConstructor<UanPhyCalcSinrFhFsk> ()
     .AddAttribute ("NumberOfHops",
@@ -217,7 +217,7 @@
 UanPhyPerGenDefault::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanPhyPerGenDefault")
-    .SetParent<Object> ()
+    .SetParent<UanPhyPer> ()
     .SetGroupName ("Uan")
     .AddConstructor<UanPhyPerGenDefault> ()
     .AddAttribute ("Threshold", "SINR cutoff for good packet reception.",
@@ -256,7 +256,7 @@
 TypeId UanPhyPerUmodem::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanPhyPerUmodem")
-    .SetParent<Object> ()
+    .SetParent<UanPhyPer> ()
     .SetGroupName ("Uan")
     .AddConstructor<UanPhyPerUmodem> ()
   ;
@@ -809,7 +809,7 @@
 }
 
 Ptr<UanNetDevice>
-UanPhyGen::GetDevice (void)
+UanPhyGen::GetDevice (void) const
 {
   return m_device;
 }
diff -Naur ns-3.23/src/uan/model/uan-phy-gen.h ns-3.24/src/uan/model/uan-phy-gen.h
--- ns-3.23/src/uan/model/uan-phy-gen.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-phy-gen.h	2015-09-15 11:18:44.000000000 -0700
@@ -260,7 +260,7 @@
   virtual double GetRxThresholdDb (void);
   virtual double GetCcaThresholdDb (void);
   virtual Ptr<UanChannel> GetChannel (void) const;
-  virtual Ptr<UanNetDevice> GetDevice (void);
+  virtual Ptr<UanNetDevice> GetDevice (void) const;
   virtual Ptr<UanTransducer> GetTransducer (void);
   virtual void SetChannel (Ptr<UanChannel> channel);
   virtual void SetDevice (Ptr<UanNetDevice> device);
diff -Naur ns-3.23/src/uan/model/uan-phy.h ns-3.24/src/uan/model/uan-phy.h
--- ns-3.23/src/uan/model/uan-phy.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -210,7 +210,7 @@
    * \param [in] mode The channel mode.
    */
   typedef void (* TracedCallback)
-    (const Ptr<const Packet> pkt, const double sinr, const UanTxMode mode);
+    (Ptr<const Packet> pkt, double sinr, UanTxMode mode);
 
   
   /**
@@ -345,7 +345,7 @@
    *
    * \return The net device.
    */
-  virtual Ptr<UanNetDevice> GetDevice (void) = 0;
+  virtual Ptr<UanNetDevice> GetDevice (void) const = 0;
 
   /**
    * Attach to a channel.
diff -Naur ns-3.23/src/uan/model/uan-prop-model-thorp.cc ns-3.24/src/uan/model/uan-prop-model-thorp.cc
--- ns-3.23/src/uan/model/uan-prop-model-thorp.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-prop-model-thorp.cc	2015-09-15 11:18:44.000000000 -0700
@@ -40,7 +40,7 @@
 UanPropModelThorp::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanPropModelThorp")
-    .SetParent<Object> ()
+    .SetParent<UanPropModel> ()
     .SetGroupName ("Uan")
     .AddConstructor<UanPropModelThorp> ()
     .AddAttribute ("SpreadCoef",
diff -Naur ns-3.23/src/uan/model/uan-transducer-hd.cc ns-3.24/src/uan/model/uan-transducer-hd.cc
--- ns-3.23/src/uan/model/uan-transducer-hd.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/model/uan-transducer-hd.cc	2015-09-15 11:18:44.000000000 -0700
@@ -88,7 +88,7 @@
 UanTransducerHd::GetTypeId ()
 {
   static TypeId tid = TypeId ("ns3::UanTransducerHd")
-    .SetParent<Object> ()
+    .SetParent<UanTransducer> ()
     .SetGroupName ("Uan")
     .AddConstructor<UanTransducerHd> ()
   ;
diff -Naur ns-3.23/src/uan/wscript ns-3.24/src/uan/wscript
--- ns-3.23/src/uan/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/uan/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -1,7 +1,7 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 def build(bld):
-    module = bld.create_ns3_module('uan', ['network', 'energy'])
+    module = bld.create_ns3_module('uan', ['network', 'energy', 'mobility'])
     module.source = [
         'model/uan-channel.cc',
         'model/uan-phy-gen.cc',
diff -Naur ns-3.23/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py ns-3.24/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -58,6 +58,10 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## 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]
@@ -154,6 +158,10 @@
     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'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -238,6 +246,7 @@
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     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'])
@@ -283,6 +292,8 @@
     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_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     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'])
@@ -417,17 +428,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -449,11 +460,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -463,16 +469,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -710,14 +706,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -778,11 +778,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -1242,6 +1237,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -1499,7 +1566,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2205,11 +2272,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2422,6 +2499,46 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
diff -Naur ns-3.23/src/virtual-net-device/bindings/modulegen__gcc_LP64.py ns-3.24/src/virtual-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/virtual-net-device/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/virtual-net-device/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -58,6 +58,10 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## 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]
@@ -154,6 +158,10 @@
     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'])
+    ## 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]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -238,6 +246,7 @@
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     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'])
@@ -283,6 +292,8 @@
     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_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     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'])
@@ -417,17 +428,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -449,11 +460,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -463,16 +469,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -710,14 +706,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -778,11 +778,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -1242,6 +1237,78 @@
                    is_const=True)
     return
 
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
 def register_Ns3ObjectBase_methods(root_module, cls):
     ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
     cls.add_constructor([])
@@ -1499,7 +1566,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2205,11 +2272,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -2422,6 +2499,46 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
diff -Naur ns-3.23/src/visualizer/bindings/modulegen__gcc_ILP32.py ns-3.24/src/visualizer/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/visualizer/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/visualizer/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -130,6 +130,8 @@
     module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
     module.add_class('TagBuffer', import_from_module='ns.network')
+    ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
+    module.add_class('TimeWithUnit', import_from_module='ns.core')
     ## 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]
@@ -142,6 +144,8 @@
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t [class]
     module.add_class('int64x64_t', import_from_module='ns.core')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
+    module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
     ## chunk.h (module 'network'): ns3::Chunk [class]
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
@@ -284,17 +288,17 @@
     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'])
-    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< ns3::TypeId >', 'ns3::TypeId', container_type='set')
-    module.add_container('std::vector< ns3::PyViz::TransmissionSample >', 'ns3::PyViz::TransmissionSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::PacketDropSample >', 'ns3::PyViz::PacketDropSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::NetDeviceStatistics >', 'ns3::PyViz::NetDeviceStatistics', container_type='vector')
-    module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
-    module.add_container('std::set< unsigned int >', 'unsigned int', container_type='set')
-    module.add_container('std::vector< ns3::PyViz::NodeStatistics >', 'ns3::PyViz::NodeStatistics', container_type='vector')
-    module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
+    module.add_container('std::vector< ns3::PyViz::RxPacketSample >', 'ns3::PyViz::RxPacketSample', container_type=u'vector')
+    module.add_container('std::vector< ns3::PyViz::TxPacketSample >', 'ns3::PyViz::TxPacketSample', container_type=u'vector')
+    module.add_container('std::vector< ns3::PyViz::PacketSample >', 'ns3::PyViz::PacketSample', container_type=u'vector')
+    module.add_container('std::set< ns3::TypeId >', 'ns3::TypeId', container_type=u'set')
+    module.add_container('std::vector< ns3::PyViz::TransmissionSample >', 'ns3::PyViz::TransmissionSample', container_type=u'vector')
+    module.add_container('std::vector< ns3::PyViz::PacketDropSample >', 'ns3::PyViz::PacketDropSample', container_type=u'vector')
+    module.add_container('std::vector< ns3::PyViz::NetDeviceStatistics >', 'ns3::PyViz::NetDeviceStatistics', container_type=u'vector')
+    module.add_container('std::vector< std::string >', 'std::string', container_type=u'vector')
+    module.add_container('std::set< unsigned int >', 'unsigned int', container_type=u'set')
+    module.add_container('std::vector< ns3::PyViz::NodeStatistics >', 'ns3::PyViz::NodeStatistics', container_type=u'vector')
+    module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type=u'map')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -307,6 +311,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -317,12 +327,12 @@
     
     ## hash-function.h (module 'core'): ns3::Hash::Implementation [class]
     module.add_class('Implementation', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
-    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash32Function_ptr')
-    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash32Function_ptr*')
-    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash32Function_ptr&')
-    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash64Function_ptr')
-    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash64Function_ptr*')
-    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash64Function_ptr&')
+    typehandlers.add_type_alias(u'uint32_t ( * ) ( char const *, size_t ) *', u'ns3::Hash::Hash32Function_ptr')
+    typehandlers.add_type_alias(u'uint32_t ( * ) ( char const *, size_t ) **', u'ns3::Hash::Hash32Function_ptr*')
+    typehandlers.add_type_alias(u'uint32_t ( * ) ( char const *, size_t ) *&', u'ns3::Hash::Hash32Function_ptr&')
+    typehandlers.add_type_alias(u'uint64_t ( * ) ( char const *, size_t ) *', u'ns3::Hash::Hash64Function_ptr')
+    typehandlers.add_type_alias(u'uint64_t ( * ) ( char const *, size_t ) **', u'ns3::Hash::Hash64Function_ptr*')
+    typehandlers.add_type_alias(u'uint64_t ( * ) ( char const *, size_t ) *&', u'ns3::Hash::Hash64Function_ptr&')
     
     ## Register a nested module for the namespace Function
     
@@ -342,6 +352,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -388,6 +405,7 @@
     register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
+    register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
     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'])
@@ -581,17 +599,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -613,11 +631,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -627,16 +640,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -708,6 +711,10 @@
     cls.add_method('Next', 
                    'void', 
                    [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::PeekU8() [member function]
+    cls.add_method('PeekU8', 
+                   'uint8_t', 
+                   [])
     ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev() [member function]
     cls.add_method('Prev', 
                    'void', 
@@ -720,6 +727,10 @@
     cls.add_method('Read', 
                    'void', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(ns3::Buffer::Iterator start, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint32_t', 'size')])
     ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadLsbtohU16() [member function]
     cls.add_method('ReadLsbtohU16', 
                    'uint16_t', 
@@ -866,14 +877,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -934,11 +949,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -1672,10 +1682,10 @@
                    'void', 
                    [param('std::string', 'name'), param('ns3::AttributeValue &', 'value')], 
                    is_const=True)
-    ## object-base.h (module 'core'): bool ns3::ObjectBase::GetAttributeFailSafe(std::string name, ns3::AttributeValue & attribute) const [member function]
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::GetAttributeFailSafe(std::string name, ns3::AttributeValue & value) const [member function]
     cls.add_method('GetAttributeFailSafe', 
                    'bool', 
-                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'attribute')], 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'value')], 
                    is_const=True)
     ## object-base.h (module 'core'): ns3::TypeId ns3::ObjectBase::GetInstanceTypeId() const [member function]
     cls.add_method('GetInstanceTypeId', 
@@ -1955,7 +1965,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2226,10 +2236,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -2328,6 +2338,14 @@
                    [param('uint8_t', 'v')])
     return
 
+def register_Ns3TimeWithUnit_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nstime.h (module 'core'): ns3::TimeWithUnit::TimeWithUnit(ns3::TimeWithUnit const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TimeWithUnit const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::TimeWithUnit::TimeWithUnit(ns3::Time const time, ns3::Time::Unit const unit) [constructor]
+    cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
+    return
+
 def register_Ns3TypeId_methods(root_module, cls):
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('!=')
@@ -2350,7 +2368,12 @@
     ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddTraceSource(std::string name, std::string help, ns3::Ptr<ns3::TraceSourceAccessor const> accessor) [member function]
     cls.add_method('AddTraceSource', 
                    'ns3::TypeId', 
-                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor')])
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor')], 
+                   deprecated=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddTraceSource(std::string name, std::string help, ns3::Ptr<ns3::TraceSourceAccessor const> accessor, std::string callback) [member function]
+    cls.add_method('AddTraceSource', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor'), param('std::string', 'callback')])
     ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation ns3::TypeId::GetAttribute(uint32_t i) const [member function]
     cls.add_method('GetAttribute', 
                    'ns3::TypeId::AttributeInformation', 
@@ -2401,6 +2424,11 @@
                    'uint32_t', 
                    [], 
                    is_static=True)
+    ## type-id.h (module 'core'): std::size_t ns3::TypeId::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation ns3::TypeId::GetTraceSource(uint32_t i) const [member function]
     cls.add_method('GetTraceSource', 
                    'ns3::TypeId::TraceSourceInformation', 
@@ -2477,6 +2505,10 @@
     cls.add_method('SetParent', 
                    'ns3::TypeId', 
                    [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetSize(std::size_t size) [member function]
+    cls.add_method('SetSize', 
+                   'ns3::TypeId', 
+                   [param('std::size_t', 'size')])
     ## type-id.h (module 'core'): void ns3::TypeId::SetUid(uint16_t tid) [member function]
     cls.add_method('SetUid', 
                    'void', 
@@ -2511,6 +2543,8 @@
     cls.add_constructor([param('ns3::TypeId::TraceSourceInformation const &', 'arg0')])
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::accessor [variable]
     cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::TraceSourceAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::callback [variable]
+    cls.add_instance_attribute('callback', 'std::string', is_const=False)
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::help [variable]
     cls.add_instance_attribute('help', 'std::string', is_const=False)
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::name [variable]
@@ -2525,62 +2559,18 @@
     return
 
 def register_Ns3Int64x64_t_methods(root_module, cls):
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', u'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', u'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', u'right'))
     cls.add_unary_numeric_operator('-')
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', u'right'))
     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_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', u'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', u'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', u'right'))
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', u'right'))
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2589,6 +2579,8 @@
     cls.add_constructor([])
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(double v) [constructor]
     cls.add_constructor([param('double', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long double v) [constructor]
+    cls.add_constructor([param('long double', 'v')])
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int v) [constructor]
     cls.add_constructor([param('int', 'v')])
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long int v) [constructor]
@@ -2629,6 +2621,8 @@
     cls.add_method('MulByInvert', 
                    'void', 
                    [param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::implementation [variable]
+    cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
 
 def register_Ns3Chunk_methods(root_module, cls):
@@ -3680,13 +3674,15 @@
     return
 
 def register_Ns3Time_methods(root_module, cls):
-    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', u'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', u'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', u'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', u'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('>')
     cls.add_binary_comparison_operator('!=')
-    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', u'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', u'right'))
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -3709,34 +3705,39 @@
     cls.add_constructor([param('long unsigned int', 'v')])
     ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
     cls.add_constructor([param('long long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & v) [constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'v')])
     ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
     cls.add_constructor([param('std::string const &', 's')])
-    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & value) [constructor]
-    cls.add_constructor([param('ns3::int64x64_t const &', 'value')])
+    ## nstime.h (module 'core'): ns3::TimeWithUnit ns3::Time::As(ns3::Time::Unit const unit) const [member function]
+    cls.add_method('As', 
+                   'ns3::TimeWithUnit', 
+                   [param('ns3::Time::Unit const', 'unit')], 
+                   is_const=True)
     ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
     cls.add_method('Compare', 
                    'int', 
                    [param('ns3::Time const &', 'o')], 
                    is_const=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & from, ns3::Time::Unit timeUnit) [member function]
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
     cls.add_method('From', 
                    'ns3::Time', 
-                   [param('ns3::int64x64_t const &', 'from'), param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('ns3::int64x64_t const &', 'value')], 
                    is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value, ns3::Time::Unit unit) [member function]
     cls.add_method('From', 
                    'ns3::Time', 
-                   [param('ns3::int64x64_t const &', 'value')], 
+                   [param('ns3::int64x64_t const &', 'value'), param('ns3::Time::Unit', 'unit')], 
                    is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit timeUnit) [member function]
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit unit) [member function]
     cls.add_method('FromDouble', 
                    'ns3::Time', 
-                   [param('double', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('double', 'value'), param('ns3::Time::Unit', 'unit')], 
                    is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit timeUnit) [member function]
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit unit) [member function]
     cls.add_method('FromInteger', 
                    'ns3::Time', 
-                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'unit')], 
                    is_static=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
     cls.add_method('GetDays', 
@@ -3853,20 +3854,20 @@
                    'bool', 
                    [], 
                    is_static=True)
-    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit timeUnit) const [member function]
+    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit unit) const [member function]
     cls.add_method('To', 
                    'ns3::int64x64_t', 
-                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('ns3::Time::Unit', 'unit')], 
                    is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit timeUnit) const [member function]
+    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit unit) const [member function]
     cls.add_method('ToDouble', 
                    'double', 
-                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('ns3::Time::Unit', 'unit')], 
                    is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit timeUnit) const [member function]
+    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit unit) const [member function]
     cls.add_method('ToInteger', 
                    'int64_t', 
-                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('ns3::Time::Unit', 'unit')], 
                    is_const=True)
     return
 
@@ -4033,11 +4034,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4463,6 +4474,11 @@
                    'bool', 
                    [param('uint32_t', 'i')], 
                    is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::IsUnicast(ns3::Ipv4Address ad) const [member function]
+    cls.add_method('IsUnicast', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'ad')], 
+                   is_const=True)
     ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::IsUp(uint32_t i) const [member function]
     cls.add_method('IsUp', 
                    'bool', 
@@ -4623,11 +4639,6 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): uint32_t ns3::Ipv4MulticastRoute::GetOutputTtl(uint32_t oif) [member function]
-    cls.add_method('GetOutputTtl', 
-                   'uint32_t', 
-                   [param('uint32_t', 'oif')], 
-                   deprecated=True)
     ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
@@ -5296,11 +5307,6 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
-    ## packet.h (module 'network'): uint8_t const * ns3::Packet::PeekData() const [member function]
-    cls.add_method('PeekData', 
-                   'uint8_t const *', 
-                   [], 
-                   deprecated=True, is_const=True)
     ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
     cls.add_method('PeekHeader', 
                    'uint32_t', 
@@ -5367,10 +5373,15 @@
                    '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> arg0) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'arg0')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
+    cls.add_method('ToString', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
     return
 
 def register_Ns3TimeValue_methods(root_module, cls):
@@ -5595,6 +5606,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5607,6 +5619,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/visualizer/bindings/modulegen__gcc_LP64.py ns-3.24/src/visualizer/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/visualizer/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/visualizer/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -130,6 +130,8 @@
     module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
     module.add_class('TagBuffer', import_from_module='ns.network')
+    ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
+    module.add_class('TimeWithUnit', import_from_module='ns.core')
     ## 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]
@@ -142,6 +144,8 @@
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t [class]
     module.add_class('int64x64_t', import_from_module='ns.core')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
+    module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
     ## chunk.h (module 'network'): ns3::Chunk [class]
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
@@ -284,17 +288,17 @@
     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'])
-    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< ns3::TypeId >', 'ns3::TypeId', container_type='set')
-    module.add_container('std::vector< ns3::PyViz::TransmissionSample >', 'ns3::PyViz::TransmissionSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::PacketDropSample >', 'ns3::PyViz::PacketDropSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::NetDeviceStatistics >', 'ns3::PyViz::NetDeviceStatistics', container_type='vector')
-    module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
-    module.add_container('std::set< unsigned int >', 'unsigned int', container_type='set')
-    module.add_container('std::vector< ns3::PyViz::NodeStatistics >', 'ns3::PyViz::NodeStatistics', container_type='vector')
-    module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
+    module.add_container('std::vector< ns3::PyViz::RxPacketSample >', 'ns3::PyViz::RxPacketSample', container_type=u'vector')
+    module.add_container('std::vector< ns3::PyViz::TxPacketSample >', 'ns3::PyViz::TxPacketSample', container_type=u'vector')
+    module.add_container('std::vector< ns3::PyViz::PacketSample >', 'ns3::PyViz::PacketSample', container_type=u'vector')
+    module.add_container('std::set< ns3::TypeId >', 'ns3::TypeId', container_type=u'set')
+    module.add_container('std::vector< ns3::PyViz::TransmissionSample >', 'ns3::PyViz::TransmissionSample', container_type=u'vector')
+    module.add_container('std::vector< ns3::PyViz::PacketDropSample >', 'ns3::PyViz::PacketDropSample', container_type=u'vector')
+    module.add_container('std::vector< ns3::PyViz::NetDeviceStatistics >', 'ns3::PyViz::NetDeviceStatistics', container_type=u'vector')
+    module.add_container('std::vector< std::string >', 'std::string', container_type=u'vector')
+    module.add_container('std::set< unsigned int >', 'unsigned int', container_type=u'set')
+    module.add_container('std::vector< ns3::PyViz::NodeStatistics >', 'ns3::PyViz::NodeStatistics', container_type=u'vector')
+    module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type=u'map')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -307,6 +311,12 @@
     nested_module = module.add_cpp_namespace('Hash')
     register_types_ns3_Hash(nested_module)
     
+    
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
 
 def register_types_ns3_FatalImpl(module):
     root_module = module.get_root()
@@ -317,12 +327,12 @@
     
     ## hash-function.h (module 'core'): ns3::Hash::Implementation [class]
     module.add_class('Implementation', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
-    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash32Function_ptr')
-    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash32Function_ptr*')
-    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash32Function_ptr&')
-    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash64Function_ptr')
-    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash64Function_ptr*')
-    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash64Function_ptr&')
+    typehandlers.add_type_alias(u'uint32_t ( * ) ( char const *, size_t ) *', u'ns3::Hash::Hash32Function_ptr')
+    typehandlers.add_type_alias(u'uint32_t ( * ) ( char const *, size_t ) **', u'ns3::Hash::Hash32Function_ptr*')
+    typehandlers.add_type_alias(u'uint32_t ( * ) ( char const *, size_t ) *&', u'ns3::Hash::Hash32Function_ptr&')
+    typehandlers.add_type_alias(u'uint64_t ( * ) ( char const *, size_t ) *', u'ns3::Hash::Hash64Function_ptr')
+    typehandlers.add_type_alias(u'uint64_t ( * ) ( char const *, size_t ) **', u'ns3::Hash::Hash64Function_ptr*')
+    typehandlers.add_type_alias(u'uint64_t ( * ) ( char const *, size_t ) *&', u'ns3::Hash::Hash64Function_ptr&')
     
     ## Register a nested module for the namespace Function
     
@@ -342,6 +352,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_methods(root_module):
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
@@ -388,6 +405,7 @@
     register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
+    register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
     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'])
@@ -581,17 +599,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -613,11 +631,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -627,16 +640,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -708,6 +711,10 @@
     cls.add_method('Next', 
                    'void', 
                    [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::PeekU8() [member function]
+    cls.add_method('PeekU8', 
+                   'uint8_t', 
+                   [])
     ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev() [member function]
     cls.add_method('Prev', 
                    'void', 
@@ -720,6 +727,10 @@
     cls.add_method('Read', 
                    'void', 
                    [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(ns3::Buffer::Iterator start, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint32_t', 'size')])
     ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadLsbtohU16() [member function]
     cls.add_method('ReadLsbtohU16', 
                    'uint16_t', 
@@ -866,14 +877,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -934,11 +949,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3EventId_methods(root_module, cls):
@@ -1672,10 +1682,10 @@
                    'void', 
                    [param('std::string', 'name'), param('ns3::AttributeValue &', 'value')], 
                    is_const=True)
-    ## object-base.h (module 'core'): bool ns3::ObjectBase::GetAttributeFailSafe(std::string name, ns3::AttributeValue & attribute) const [member function]
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::GetAttributeFailSafe(std::string name, ns3::AttributeValue & value) const [member function]
     cls.add_method('GetAttributeFailSafe', 
                    'bool', 
-                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'attribute')], 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'value')], 
                    is_const=True)
     ## object-base.h (module 'core'): ns3::TypeId ns3::ObjectBase::GetInstanceTypeId() const [member function]
     cls.add_method('GetInstanceTypeId', 
@@ -1955,7 +1965,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -2226,10 +2236,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -2328,6 +2338,14 @@
                    [param('uint8_t', 'v')])
     return
 
+def register_Ns3TimeWithUnit_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nstime.h (module 'core'): ns3::TimeWithUnit::TimeWithUnit(ns3::TimeWithUnit const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TimeWithUnit const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::TimeWithUnit::TimeWithUnit(ns3::Time const time, ns3::Time::Unit const unit) [constructor]
+    cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
+    return
+
 def register_Ns3TypeId_methods(root_module, cls):
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('!=')
@@ -2350,7 +2368,12 @@
     ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddTraceSource(std::string name, std::string help, ns3::Ptr<ns3::TraceSourceAccessor const> accessor) [member function]
     cls.add_method('AddTraceSource', 
                    'ns3::TypeId', 
-                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor')])
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor')], 
+                   deprecated=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddTraceSource(std::string name, std::string help, ns3::Ptr<ns3::TraceSourceAccessor const> accessor, std::string callback) [member function]
+    cls.add_method('AddTraceSource', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor'), param('std::string', 'callback')])
     ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation ns3::TypeId::GetAttribute(uint32_t i) const [member function]
     cls.add_method('GetAttribute', 
                    'ns3::TypeId::AttributeInformation', 
@@ -2401,6 +2424,11 @@
                    'uint32_t', 
                    [], 
                    is_static=True)
+    ## type-id.h (module 'core'): std::size_t ns3::TypeId::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation ns3::TypeId::GetTraceSource(uint32_t i) const [member function]
     cls.add_method('GetTraceSource', 
                    'ns3::TypeId::TraceSourceInformation', 
@@ -2477,6 +2505,10 @@
     cls.add_method('SetParent', 
                    'ns3::TypeId', 
                    [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetSize(std::size_t size) [member function]
+    cls.add_method('SetSize', 
+                   'ns3::TypeId', 
+                   [param('std::size_t', 'size')])
     ## type-id.h (module 'core'): void ns3::TypeId::SetUid(uint16_t tid) [member function]
     cls.add_method('SetUid', 
                    'void', 
@@ -2511,6 +2543,8 @@
     cls.add_constructor([param('ns3::TypeId::TraceSourceInformation const &', 'arg0')])
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::accessor [variable]
     cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::TraceSourceAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::callback [variable]
+    cls.add_instance_attribute('callback', 'std::string', is_const=False)
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::help [variable]
     cls.add_instance_attribute('help', 'std::string', is_const=False)
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::name [variable]
@@ -2525,62 +2559,18 @@
     return
 
 def register_Ns3Int64x64_t_methods(root_module, cls):
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
-    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', u'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', u'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', u'right'))
     cls.add_unary_numeric_operator('-')
-    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', u'right'))
     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_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', u'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', u'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', u'right'))
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', u'right'))
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2589,6 +2579,8 @@
     cls.add_constructor([])
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(double v) [constructor]
     cls.add_constructor([param('double', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long double v) [constructor]
+    cls.add_constructor([param('long double', 'v')])
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int v) [constructor]
     cls.add_constructor([param('int', 'v')])
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long int v) [constructor]
@@ -2629,6 +2621,8 @@
     cls.add_method('MulByInvert', 
                    'void', 
                    [param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::implementation [variable]
+    cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
 
 def register_Ns3Chunk_methods(root_module, cls):
@@ -3680,13 +3674,15 @@
     return
 
 def register_Ns3Time_methods(root_module, cls):
-    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', u'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', u'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', u'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', u'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('>')
     cls.add_binary_comparison_operator('!=')
-    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', u'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', u'right'))
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -3709,34 +3705,39 @@
     cls.add_constructor([param('long unsigned int', 'v')])
     ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
     cls.add_constructor([param('long long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & v) [constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'v')])
     ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
     cls.add_constructor([param('std::string const &', 's')])
-    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & value) [constructor]
-    cls.add_constructor([param('ns3::int64x64_t const &', 'value')])
+    ## nstime.h (module 'core'): ns3::TimeWithUnit ns3::Time::As(ns3::Time::Unit const unit) const [member function]
+    cls.add_method('As', 
+                   'ns3::TimeWithUnit', 
+                   [param('ns3::Time::Unit const', 'unit')], 
+                   is_const=True)
     ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
     cls.add_method('Compare', 
                    'int', 
                    [param('ns3::Time const &', 'o')], 
                    is_const=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & from, ns3::Time::Unit timeUnit) [member function]
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
     cls.add_method('From', 
                    'ns3::Time', 
-                   [param('ns3::int64x64_t const &', 'from'), param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('ns3::int64x64_t const &', 'value')], 
                    is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value, ns3::Time::Unit unit) [member function]
     cls.add_method('From', 
                    'ns3::Time', 
-                   [param('ns3::int64x64_t const &', 'value')], 
+                   [param('ns3::int64x64_t const &', 'value'), param('ns3::Time::Unit', 'unit')], 
                    is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit timeUnit) [member function]
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit unit) [member function]
     cls.add_method('FromDouble', 
                    'ns3::Time', 
-                   [param('double', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('double', 'value'), param('ns3::Time::Unit', 'unit')], 
                    is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit timeUnit) [member function]
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit unit) [member function]
     cls.add_method('FromInteger', 
                    'ns3::Time', 
-                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'unit')], 
                    is_static=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
     cls.add_method('GetDays', 
@@ -3853,20 +3854,20 @@
                    'bool', 
                    [], 
                    is_static=True)
-    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit timeUnit) const [member function]
+    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit unit) const [member function]
     cls.add_method('To', 
                    'ns3::int64x64_t', 
-                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('ns3::Time::Unit', 'unit')], 
                    is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit timeUnit) const [member function]
+    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit unit) const [member function]
     cls.add_method('ToDouble', 
                    'double', 
-                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('ns3::Time::Unit', 'unit')], 
                    is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit timeUnit) const [member function]
+    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit unit) const [member function]
     cls.add_method('ToInteger', 
                    'int64_t', 
-                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   [param('ns3::Time::Unit', 'unit')], 
                    is_const=True)
     return
 
@@ -4033,11 +4034,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -4463,6 +4474,11 @@
                    'bool', 
                    [param('uint32_t', 'i')], 
                    is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::IsUnicast(ns3::Ipv4Address ad) const [member function]
+    cls.add_method('IsUnicast', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'ad')], 
+                   is_const=True)
     ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::IsUp(uint32_t i) const [member function]
     cls.add_method('IsUp', 
                    'bool', 
@@ -4623,11 +4639,6 @@
                    'ns3::Ipv4Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): uint32_t ns3::Ipv4MulticastRoute::GetOutputTtl(uint32_t oif) [member function]
-    cls.add_method('GetOutputTtl', 
-                   'uint32_t', 
-                   [param('uint32_t', 'oif')], 
-                   deprecated=True)
     ## ipv4-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int> > > ns3::Ipv4MulticastRoute::GetOutputTtlMap() const [member function]
     cls.add_method('GetOutputTtlMap', 
                    'std::map< unsigned int, unsigned int >', 
@@ -5296,11 +5307,6 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
-    ## packet.h (module 'network'): uint8_t const * ns3::Packet::PeekData() const [member function]
-    cls.add_method('PeekData', 
-                   'uint8_t const *', 
-                   [], 
-                   deprecated=True, is_const=True)
     ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
     cls.add_method('PeekHeader', 
                    'uint32_t', 
@@ -5367,10 +5373,15 @@
                    '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> arg0) [member function]
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
     cls.add_method('SetNixVector', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'arg0')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
+    cls.add_method('ToString', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
     return
 
 def register_Ns3TimeValue_methods(root_module, cls):
@@ -5595,6 +5606,7 @@
     module = root_module
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     return
 
 def register_functions_ns3_FatalImpl(module, root_module):
@@ -5607,6 +5619,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def main():
     out = FileCodeSink(sys.stdout)
     root_module = module_init()
diff -Naur ns-3.23/src/visualizer/model/visual-simulator-impl.cc ns-3.24/src/visualizer/model/visual-simulator-impl.cc
--- ns-3.23/src/visualizer/model/visual-simulator-impl.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/visualizer/model/visual-simulator-impl.cc	2015-09-15 11:18:44.000000000 -0700
@@ -141,24 +141,24 @@
 }
 
 void 
-VisualSimulatorImpl::Stop (Time const &time)
+VisualSimulatorImpl::Stop (Time const &delay)
 {
-  m_simulator->Stop (time);
+  m_simulator->Stop (delay);
 }
 
 //
 // Schedule an event for a _relative_ time in the future.
 //
 EventId
-VisualSimulatorImpl::Schedule (Time const &time, EventImpl *event)
+VisualSimulatorImpl::Schedule (Time const &delay, EventImpl *event)
 {
-  return m_simulator->Schedule (time, event);
+  return m_simulator->Schedule (delay, event);
 }
 
 void
-VisualSimulatorImpl::ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event)
+VisualSimulatorImpl::ScheduleWithContext (uint32_t context, Time const &delay, EventImpl *event)
 {
-  m_simulator->ScheduleWithContext (context, time, event);
+  m_simulator->ScheduleWithContext (context, delay, event);
 }
 
 EventId
diff -Naur ns-3.23/src/visualizer/model/visual-simulator-impl.h ns-3.24/src/visualizer/model/visual-simulator-impl.h
--- ns-3.23/src/visualizer/model/visual-simulator-impl.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/visualizer/model/visual-simulator-impl.h	2015-09-15 11:18:44.000000000 -0700
@@ -52,9 +52,9 @@
   virtual void Destroy ();
   virtual bool IsFinished (void) const;
   virtual void Stop (void);
-  virtual void Stop (Time const &time);
-  virtual EventId Schedule (Time const &time, EventImpl *event);
-  virtual void ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event);
+  virtual void Stop (Time const &delay);
+  virtual EventId Schedule (Time const &delay, EventImpl *event);
+  virtual void ScheduleWithContext (uint32_t context, Time const &delay, EventImpl *event);
   virtual EventId ScheduleNow (EventImpl *event);
   virtual EventId ScheduleDestroy (EventImpl *event);
   virtual void Remove (const EventId &id);
diff -Naur ns-3.23/src/wave/bindings/modulegen__gcc_ILP32.py ns-3.24/src/wave/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/wave/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -23,11 +23,11 @@
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
     module.add_enum('WifiMacType', ['WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_CTLWRAPPER', '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-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'], import_from_module='ns.wifi')
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT'], import_from_module='ns.wifi')
     ## wifi-phy-standard.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_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211ac'], 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_UNDEF'], import_from_module='ns.wifi')
     ## channel-scheduler.h (module 'wave'): ns3::ChannelAccess [enumeration]
@@ -98,6 +98,10 @@
     module.add_class('InetSocketAddress', import_from_module='ns.network')
     ## inet-socket-address.h (module 'network'): ns3::InetSocketAddress [class]
     root_module['ns3::InetSocketAddress'].implicitly_converts_to(root_module['ns3::Address'])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper [class]
+    module.add_class('InterferenceHelper', import_from_module='ns.wifi')
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer [struct]
+    module.add_class('SnrPer', import_from_module='ns.wifi', outer_class=root_module['ns3::InterferenceHelper'])
     ## 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]
@@ -172,12 +176,14 @@
     module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
     module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters [struct]
+    module.add_class('Parameters', import_from_module='ns.wifi')
     ## pcap-file.h (module 'network'): ns3::PcapFile [class]
     module.add_class('PcapFile', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -256,6 +262,10 @@
     module.add_class('int64x64_t', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
     module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo [struct]
+    module.add_class('mpduInfo', import_from_module='ns.wifi')
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm [struct]
+    module.add_class('signalNoiseDbm', import_from_module='ns.wifi')
     ## chunk.h (module 'network'): ns3::Chunk [class]
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
@@ -316,6 +326,8 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::InterferenceHelper::Event', 'ns3::empty', 'ns3::DefaultDeleter<ns3::InterferenceHelper::Event>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
@@ -406,6 +418,8 @@
     module.add_class('WifiRemoteStationManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## wave-helper.h (module 'wave'): ns3::YansWavePhyHelper [class]
     module.add_class('YansWavePhyHelper', parent=root_module['ns3::YansWifiPhyHelper'])
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy [class]
+    module.add_class('YansWifiPhy', import_from_module='ns.wifi', parent=root_module['ns3::WifiPhy'])
     ## 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]
@@ -584,6 +598,12 @@
     module.add_class('Vector3DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## vector.h (module 'core'): ns3::Vector3DValue [class]
     module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities [class]
+    module.add_class('VhtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker [class]
+    module.add_class('VhtCapabilitiesChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue [class]
+    module.add_class('VhtCapabilitiesValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
     ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow [class]
     module.add_class('WaveMacLow', parent=root_module['ns3::MacLow'])
     ## wave-net-device.h (module 'wave'): ns3::WaveNetDevice [class]
@@ -609,15 +629,11 @@
     module.add_container('std::vector< int >', 'int', container_type=u'vector')
     module.add_container('std::vector< unsigned int >', 'unsigned int', container_type=u'vector')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type=u'vector')
-    module.add_container('ns3::WifiMcsList', 'unsigned char', container_type=u'vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type=u'map')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::AmpduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::AmpduSubframeHeader >', container_type=u'list')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::AmsduSubframeHeader >', container_type=u'list')
     module.add_container('std::map< unsigned int, ns3::Ptr< ns3::OcbWifiMac > >', ('unsigned int', 'ns3::Ptr< ns3::OcbWifiMac >'), container_type=u'map')
     module.add_container('std::vector< ns3::Ptr< ns3::WifiPhy > >', 'ns3::Ptr< ns3::WifiPhy >', container_type=u'vector')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >', u'ns3::WifiMcsList')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >*', u'ns3::WifiMcsList*')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >&', u'ns3::WifiMcsList&')
     typehandlers.add_type_alias(u'uint8_t', u'ns3::WifiInformationElementId')
     typehandlers.add_type_alias(u'uint8_t*', u'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias(u'uint8_t&', u'ns3::WifiInformationElementId&')
@@ -627,9 +643,6 @@
     typehandlers.add_type_alias(u'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 >', u'ns3::VscCallback')
     typehandlers.add_type_alias(u'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 >*', u'ns3::VscCallback*')
     typehandlers.add_type_alias(u'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 >&', u'ns3::VscCallback&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     typehandlers.add_type_alias(u'ns3::Vector3D', u'ns3::Vector')
     typehandlers.add_type_alias(u'ns3::Vector3D*', u'ns3::Vector*')
     typehandlers.add_type_alias(u'ns3::Vector3D&', u'ns3::Vector&')
@@ -645,12 +658,12 @@
     typehandlers.add_type_alias(u'ns3::Vector3DChecker*', u'ns3::VectorChecker*')
     typehandlers.add_type_alias(u'ns3::Vector3DChecker&', u'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     typehandlers.add_type_alias(u'std::_Rb_tree_const_iterator< std::pair< ns3::AcIndex const, ns3::EdcaParameter > >', u'ns3::EdcaParameterSetI')
     typehandlers.add_type_alias(u'std::_Rb_tree_const_iterator< std::pair< ns3::AcIndex const, ns3::EdcaParameter > >*', u'ns3::EdcaParameterSetI*')
     typehandlers.add_type_alias(u'std::_Rb_tree_const_iterator< std::pair< ns3::AcIndex const, ns3::EdcaParameter > >&', u'ns3::EdcaParameterSetI&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', u'ns3::WifiMcsListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', u'ns3::WifiMcsListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', u'ns3::WifiMcsListIterator&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -664,6 +677,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -704,6 +723,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -735,6 +761,8 @@
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
+    register_Ns3InterferenceHelper_methods(root_module, root_module['ns3::InterferenceHelper'])
+    register_Ns3InterferenceHelperSnrPer_methods(root_module, root_module['ns3::InterferenceHelper::SnrPer'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
@@ -762,6 +790,7 @@
     register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
     register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
     register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3Parameters_methods(root_module, root_module['ns3::Parameters'])
     register_Ns3PcapFile_methods(root_module, root_module['ns3::PcapFile'])
     register_Ns3PcapHelper_methods(root_module, root_module['ns3::PcapHelper'])
     register_Ns3PcapHelperForDevice_methods(root_module, root_module['ns3::PcapHelperForDevice'])
@@ -799,6 +828,8 @@
     register_Ns3YansWifiPhyHelper_methods(root_module, root_module['ns3::YansWifiPhyHelper'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
+    register_Ns3MpduInfo_methods(root_module, root_module['ns3::mpduInfo'])
+    register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::signalNoiseDbm'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3HigherLayerTxVectorTag_methods(root_module, root_module['ns3::HigherLayerTxVectorTag'])
@@ -826,6 +857,7 @@
     register_Ns3SimpleRefCount__Ns3ChannelCoordinationListener_Ns3Empty_Ns3DefaultDeleter__lt__ns3ChannelCoordinationListener__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener> >'])
     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__Ns3InterferenceHelperEvent_Ns3Empty_Ns3DefaultDeleter__lt__ns3InterferenceHelperEvent__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> >'])
     register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >'])
     register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >'])
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
@@ -859,6 +891,7 @@
     register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
     register_Ns3YansWavePhyHelper_methods(root_module, root_module['ns3::YansWavePhyHelper'])
+    register_Ns3YansWifiPhy_methods(root_module, root_module['ns3::YansWifiPhy'])
     register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
     register_Ns3AmpduSubframeHeader_methods(root_module, root_module['ns3::AmpduSubframeHeader'])
@@ -945,6 +978,9 @@
     register_Ns3Vector2DValue_methods(root_module, root_module['ns3::Vector2DValue'])
     register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
     register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
+    register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
+    register_Ns3VhtCapabilitiesChecker_methods(root_module, root_module['ns3::VhtCapabilitiesChecker'])
+    register_Ns3VhtCapabilitiesValue_methods(root_module, root_module['ns3::VhtCapabilitiesValue'])
     register_Ns3WaveMacLow_methods(root_module, root_module['ns3::WaveMacLow'])
     register_Ns3WaveNetDevice_methods(root_module, root_module['ns3::WaveNetDevice'])
     register_Ns3WifiChannel_methods(root_module, root_module['ns3::WifiChannel'])
@@ -1459,6 +1495,10 @@
     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', 
@@ -1662,17 +1702,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1694,11 +1734,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1708,16 +1743,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1955,14 +1980,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -2023,11 +2052,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CapabilityInformation_methods(root_module, cls):
@@ -2242,6 +2266,70 @@
                    [param('uint16_t', 'port')])
     return
 
+def register_Ns3InterferenceHelper_methods(root_module, cls):
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper(ns3::InterferenceHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
+    cls.add_constructor([])
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::InterferenceHelper::Event> ns3::InterferenceHelper::Add(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::Time duration, double rxPower) [member function]
+    cls.add_method('Add', 
+                   'ns3::Ptr< ns3::InterferenceHelper::Event >', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::Time', 'duration'), param('double', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePlcpHeaderSnrPer(ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
+    cls.add_method('CalculatePlcpHeaderSnrPer', 
+                   'ns3::InterferenceHelper::SnrPer', 
+                   [param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePlcpPayloadSnrPer(ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
+    cls.add_method('CalculatePlcpPayloadSnrPer', 
+                   'ns3::InterferenceHelper::SnrPer', 
+                   [param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')])
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::EraseEvents() [member function]
+    cls.add_method('EraseEvents', 
+                   'void', 
+                   [])
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW) [member function]
+    cls.add_method('GetEnergyDuration', 
+                   'ns3::Time', 
+                   [param('double', 'energyW')])
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::InterferenceHelper::GetErrorRateModel() const [member function]
+    cls.add_method('GetErrorRateModel', 
+                   'ns3::Ptr< ns3::ErrorRateModel >', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::GetNoiseFigure() const [member function]
+    cls.add_method('GetNoiseFigure', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd() [member function]
+    cls.add_method('NotifyRxEnd', 
+                   'void', 
+                   [])
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxStart() [member function]
+    cls.add_method('NotifyRxStart', 
+                   'void', 
+                   [])
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> rate) [member function]
+    cls.add_method('SetErrorRateModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorRateModel >', 'rate')])
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::SetNoiseFigure(double value) [member function]
+    cls.add_method('SetNoiseFigure', 
+                   'void', 
+                   [param('double', 'value')])
+    return
+
+def register_Ns3InterferenceHelperSnrPer_methods(root_module, cls):
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer() [constructor]
+    cls.add_constructor([])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer(ns3::InterferenceHelper::SnrPer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::InterferenceHelper::SnrPer const &', 'arg0')])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::per [variable]
+    cls.add_instance_attribute('per', 'double', is_const=False)
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
+    return
+
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
@@ -3772,13 +3860,30 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
     cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
     return
 
+def register_Ns3Parameters_methods(root_module, cls):
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::Parameters() [constructor]
+    cls.add_constructor([])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::Parameters(ns3::Parameters const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Parameters const &', 'arg0')])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::aMpdu [variable]
+    cls.add_instance_attribute('aMpdu', 'ns3::mpduInfo', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::duration [variable]
+    cls.add_instance_attribute('duration', 'ns3::Time', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::preamble [variable]
+    cls.add_instance_attribute('preamble', 'ns3::WifiPreamble', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::rxPowerDbm [variable]
+    cls.add_instance_attribute('rxPowerDbm', 'double', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::txVector [variable]
+    cls.add_instance_attribute('txVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
 def register_Ns3PcapFile_methods(root_module, cls):
     ## pcap-file.h (module 'network'): ns3::PcapFile::PcapFile() [constructor]
     cls.add_constructor([])
@@ -3790,10 +3895,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -3857,10 +3962,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -4098,10 +4203,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4712,24 +4817,24 @@
     cls.add_constructor([])
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
     cls.add_constructor([param('std::string', 'name')])
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate(uint8_t nss) const [member function]
     cls.add_method('GetCodeRate', 
                    'ns3::WifiCodeRate', 
-                   [], 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint16_t ns3::WifiMode::GetConstellationSize(uint8_t nss) const [member function]
     cls.add_method('GetConstellationSize', 
-                   'uint8_t', 
-                   [], 
+                   'uint16_t', 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetMcsValue() const [member function]
+    cls.add_method('GetMcsValue', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
@@ -4737,10 +4842,10 @@
                    'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [], 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -4762,10 +4867,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    cls.add_method('CreateWifiMcs', 
+                   'ns3::WifiMode', 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   is_static=True)
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
                    is_static=True)
     return
 
@@ -4870,6 +4980,10 @@
     cls.add_constructor([param('ns3::WifiRemoteStationState const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_address [variable]
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
+    cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
+    cls.add_instance_attribute('m_channelWidth', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_greenfield [variable]
     cls.add_instance_attribute('m_greenfield', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_info [variable]
@@ -4877,7 +4991,7 @@
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
-    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiMcsList', is_const=False)
+    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
     cls.add_instance_attribute('m_operationalRateSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_rx [variable]
@@ -4896,8 +5010,13 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## 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, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, uint32_t channelWidth, bool aggregation, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint32_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): uint32_t ns3::WifiTxVector::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -4923,6 +5042,11 @@
                    '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::IsShortGuardInterval() const [member function]
     cls.add_method('IsShortGuardInterval', 
                    'bool', 
@@ -4933,6 +5057,14 @@
                    '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::SetChannelWidth(uint32_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelWidth')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -5118,6 +5250,28 @@
     cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
 
+def register_Ns3MpduInfo_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo(ns3::mpduInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::mpduInfo const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::packetType [variable]
+    cls.add_instance_attribute('packetType', 'uint8_t', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::referenceNumber [variable]
+    cls.add_instance_attribute('referenceNumber', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3SignalNoiseDbm_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm(ns3::signalNoiseDbm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::signalNoiseDbm const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::noise [variable]
+    cls.add_instance_attribute('noise', 'double', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signal [variable]
+    cls.add_instance_attribute('signal', 'double', is_const=False)
+    return
+
 def register_Ns3Chunk_methods(root_module, cls):
     ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
     cls.add_constructor([])
@@ -5816,6 +5970,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5842,6 +6001,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtAssocResponseHeader_methods(root_module, cls):
@@ -5882,6 +6045,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5904,6 +6072,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtDelBaHeader_methods(root_module, cls):
@@ -6005,6 +6177,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -6027,6 +6204,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtProbeResponseHeader_methods(root_module, cls):
@@ -6078,6 +6259,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -6104,6 +6290,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3NqosWifiMacHelper_methods(root_module, cls):
@@ -6232,10 +6422,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -6475,6 +6665,18 @@
                    is_static=True)
     return
 
+def register_Ns3SimpleRefCount__Ns3InterferenceHelperEvent_Ns3Empty_Ns3DefaultDeleter__lt__ns3InterferenceHelperEvent__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> >::SimpleRefCount(ns3::SimpleRefCount<ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter< ns3::InterferenceHelper::Event > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    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]
     cls.add_constructor([])
@@ -7643,6 +7845,11 @@
     cls.add_method('GetTxPktCount', 
                    'int', 
                    [])
+    ## wave-bsm-stats.h (module 'wave'): static ns3::TypeId ns3::WaveBsmStats::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wave-bsm-stats.h (module 'wave'): void ns3::WaveBsmStats::IncExpectedRxPktCount(int index) [member function]
     cls.add_method('IncExpectedRxPktCount', 
                    'void', 
@@ -8491,6 +8698,10 @@
     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::SetQosNoAck() [member function]
     cls.add_method('SetQosNoAck', 
                    'void', 
@@ -8503,6 +8714,10 @@
     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::SetQosNormalAck() [member function]
     cls.add_method('SetQosNormalAck', 
                    'void', 
@@ -8639,19 +8854,19 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuration(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('CalculatePlcpDuration', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpPreambleAndHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('CalculatePlcpPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
                    [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('ConfigureStandard', 
                    'void', 
@@ -8667,11 +8882,6 @@
                    'ns3::Ptr< ns3::WifiChannel >', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint16_t', 
@@ -8682,6 +8892,11 @@
                    'ns3::Time', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -8762,328 +8977,328 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetMFPlcpHeaderMode', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
+    cls.add_method('GetHtMcs0', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
-    cls.add_method('GetMembershipSelectorModes', 
-                   'ns3::WifiModeList', 
-                   [param('uint32_t', 'selector')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
-    cls.add_method('GetMode', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
+    cls.add_method('GetHtMcs1', 
                    'ns3::WifiMode', 
-                   [param('uint32_t', 'mode')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
-    cls.add_method('GetNumberOfReceiveAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
-    cls.add_method('GetNumberOfTransmitAntennas', 
-                   'uint32_t', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
+    cls.add_method('GetHtMcs10', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
+    cls.add_method('GetHtMcs11', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
+    cls.add_method('GetHtMcs12', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
+    cls.add_method('GetHtMcs13', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
+    cls.add_method('GetHtMcs14', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
+    cls.add_method('GetHtMcs15', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
+    cls.add_method('GetHtMcs16', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
+    cls.add_method('GetHtMcs17', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
+    cls.add_method('GetHtMcs18', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
+    cls.add_method('GetHtMcs19', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
+    cls.add_method('GetHtMcs2', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
+    cls.add_method('GetHtMcs20', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
+    cls.add_method('GetHtMcs21', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
+    cls.add_method('GetHtMcs22', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
+    cls.add_method('GetHtMcs23', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
+    cls.add_method('GetHtMcs24', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
+    cls.add_method('GetHtMcs25', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
+    cls.add_method('GetHtMcs26', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
+    cls.add_method('GetHtMcs27', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
+    cls.add_method('GetHtMcs28', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
+    cls.add_method('GetHtMcs29', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
+    cls.add_method('GetHtMcs3', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
+    cls.add_method('GetHtMcs30', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
+    cls.add_method('GetHtMcs31', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
+    cls.add_method('GetHtMcs4', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
+    cls.add_method('GetHtMcs5', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
+    cls.add_method('GetHtMcs6', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
+    cls.add_method('GetHtMcs7', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
+    cls.add_method('GetHtMcs8', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
+    cls.add_method('GetHtMcs9', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetHtPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [], 
+                   [param('ns3::WifiMode', 'payloadMode')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'mcs')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
                    'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
+    cls.add_method('GetOfdmRate12Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
+    cls.add_method('GetOfdmRate18Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
+    cls.add_method('GetOfdmRate24Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
+    cls.add_method('GetOfdmRate36Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
+    cls.add_method('GetOfdmRate48Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
+    cls.add_method('GetOfdmRate54Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
@@ -9102,34 +9317,49 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
                    [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHtTrainingSymbolDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpPreambleDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA1Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA1Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA2Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA2Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigBDuration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
     cls.add_method('GetStateDuration', 
@@ -9156,6 +9386,61 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
+    cls.add_method('GetVhtMcs0', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
+    cls.add_method('GetVhtMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
+    cls.add_method('GetVhtMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
+    cls.add_method('GetVhtMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
+    cls.add_method('GetVhtMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
+    cls.add_method('GetVhtMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
+    cls.add_method('GetVhtMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
+    cls.add_method('GetVhtMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
+    cls.add_method('GetVhtMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
+    cls.add_method('GetVhtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetVhtPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
@@ -9196,19 +9481,14 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu, ns3::signalNoiseDbm signalNoise) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::signalNoiseDbm', 'signalNoise')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu) [member function]
     cls.add_method('NotifyMonitorSniffTx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('NotifyRxBegin', 
                    'void', 
@@ -9243,21 +9523,21 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
     cls.add_method('SendPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
                    [param('uint16_t', 'id')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
@@ -9313,11 +9593,6 @@
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
@@ -9329,10 +9604,10 @@
     cls.add_method('AddAllSupportedModes', 
                    'void', 
                    [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
+                   [param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
     cls.add_method('AddBasicMode', 
                    'void', 
@@ -9341,10 +9616,14 @@
     cls.add_method('AddStationHtCapabilities', 
                    'void', 
                    [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htcapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtcapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
     cls.add_method('AddSupportedMcs', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'mcs')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
     cls.add_method('AddSupportedMode', 
                    'void', 
@@ -9357,9 +9636,9 @@
     cls.add_method('GetAckTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
     cls.add_method('GetBasicMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint32_t', 'i')], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint32_t i) const [member function]
@@ -9383,9 +9662,9 @@
     cls.add_method('GetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
     cls.add_method('GetDefaultMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
@@ -9468,6 +9747,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::HasVhtSupported() const [member function]
+    cls.add_method('HasVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
     cls.add_method('IsAssociated', 
                    'bool', 
@@ -9587,6 +9871,10 @@
     cls.add_method('SetRtsCtsThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetupMac', 
                    'void', 
@@ -9597,11 +9885,25 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
+    cls.add_method('UpdateFragmentationThreshold', 
+                   'void', 
+                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAggregation', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetGreenfield', 
                    'bool', 
@@ -9617,9 +9919,9 @@
                    'ns3::Ptr< ns3::WifiMac >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
     cls.add_method('GetMcsSupported', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
                    is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
@@ -9677,6 +9979,11 @@
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
     cls.add_method('DoGetAckTxGuardInterval', 
                    'bool', 
@@ -9702,6 +10009,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetBlockAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetBlockAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
     cls.add_method('DoGetBlockAckTxGuardInterval', 
                    'bool', 
@@ -9727,6 +10039,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetCtsTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
     cls.add_method('DoGetCtsTxGuardInterval', 
                    'bool', 
@@ -9790,59 +10107,441 @@
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr) [member function]
     cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLowLatency() const [member function]
+    cls.add_method('IsLowLatency', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3YansWavePhyHelper_methods(root_module, cls):
+    ## wave-helper.h (module 'wave'): ns3::YansWavePhyHelper::YansWavePhyHelper() [constructor]
+    cls.add_constructor([])
+    ## wave-helper.h (module 'wave'): ns3::YansWavePhyHelper::YansWavePhyHelper(ns3::YansWavePhyHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::YansWavePhyHelper const &', 'arg0')])
+    ## wave-helper.h (module 'wave'): static ns3::YansWavePhyHelper ns3::YansWavePhyHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::YansWavePhyHelper', 
+                   [], 
+                   is_static=True)
+    ## wave-helper.h (module 'wave'): void ns3::YansWavePhyHelper::EnableAsciiInternal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool explicitFilename) [member function]
+    cls.add_method('EnableAsciiInternal', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'explicitFilename')], 
+                   visibility='private', is_virtual=True)
+    ## wave-helper.h (module 'wave'): void ns3::YansWavePhyHelper::EnablePcapInternal(std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool promiscuous, bool explicitFilename) [member function]
+    cls.add_method('EnablePcapInternal', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'promiscuous'), param('bool', 'explicitFilename')], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3YansWifiPhy_methods(root_module, cls):
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy(ns3::YansWifiPhy const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::YansWifiPhy const &', 'arg0')])
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy() [constructor]
+    cls.add_constructor([])
+    ## yans-wifi-phy.h (module 'wifi'): int64_t ns3::YansWifiPhy::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
+    cls.add_method('CalculateSnr', 
+                   'double', 
+                   [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetBssMembershipSelector(uint32_t selector) const [member function]
+    cls.add_method('GetBssMembershipSelector', 
+                   'uint32_t', 
+                   [param('uint32_t', 'selector')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetCcaMode1Threshold() const [member function]
+    cls.add_method('GetCcaMode1Threshold', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiChannel> ns3::YansWifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::WifiChannel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetChannelFrequencyMhz() const [member function]
+    cls.add_method('GetChannelFrequencyMhz', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint16_t ns3::YansWifiPhy::GetChannelNumber() const [member function]
+    cls.add_method('GetChannelNumber', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetChannelSwitchDelay() const [member function]
+    cls.add_method('GetChannelSwitchDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetDelayUntilIdle() [member function]
+    cls.add_method('GetDelayUntilIdle', 
+                   'ns3::Time', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::YansWifiPhy::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetEdThreshold() const [member function]
+    cls.add_method('GetEdThreshold', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::YansWifiPhy::GetErrorRateModel() const [member function]
+    cls.add_method('GetErrorRateModel', 
+                   'ns3::Ptr< ns3::ErrorRateModel >', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGreenfield() const [member function]
+    cls.add_method('GetGreenfield', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::YansWifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::YansWifiPhy::GetMobility() [member function]
+    cls.add_method('GetMobility', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
+                   [])
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxGain() const [member function]
+    cls.add_method('GetRxGain', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxNoiseFigure() const [member function]
+    cls.add_method('GetRxNoiseFigure', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetStateDuration() [member function]
+    cls.add_method('GetStateDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetStbc() const [member function]
+    cls.add_method('GetStbc', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxGain() const [member function]
+    cls.add_method('GetTxGain', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerEnd() const [member function]
+    cls.add_method('GetTxPowerEnd', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerStart() const [member function]
+    cls.add_method('GetTxPowerStart', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::YansWifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsMcsSupported(ns3::WifiMode mcs) [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('ns3::WifiMode', 'mcs')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
+    cls.add_method('IsModeSupported', 
+                   'bool', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateBusy() [member function]
+    cls.add_method('IsStateBusy', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateCcaBusy() [member function]
+    cls.add_method('IsStateCcaBusy', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateIdle() [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateRx() [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateSleep() [member function]
+    cls.add_method('IsStateSleep', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateSwitching() [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateTx() [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::ResumeFromSleep() [member function]
+    cls.add_method('ResumeFromSleep', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
+    cls.add_method('SendPacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetCcaMode1Threshold(double threshold) [member function]
+    cls.add_method('SetCcaMode1Threshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannel(ns3::Ptr<ns3::YansWifiChannel> channel) [member function]
+    cls.add_method('SetChannel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::YansWifiChannel >', 'channel')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelNumber(uint16_t id) [member function]
+    cls.add_method('SetChannelNumber', 
+                   'void', 
+                   [param('uint16_t', 'id')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetEdThreshold(double threshold) [member function]
+    cls.add_method('SetEdThreshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> rate) [member function]
+    cls.add_method('SetErrorRateModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorRateModel >', 'rate')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetFrequency(uint32_t freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('uint32_t', 'freq')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGreenfield(bool greenfield) [member function]
+    cls.add_method('SetGreenfield', 
+                   'void', 
+                   [param('bool', 'greenfield')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGuardInterval(bool guardInterval) [member function]
+    cls.add_method('SetGuardInterval', 
+                   'void', 
+                   [param('bool', 'guardInterval')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetLdpc(bool ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('bool', 'ldpc')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> mobility) [member function]
+    cls.add_method('SetMobility', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'mobility')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNTxPower(uint32_t n) [member function]
+    cls.add_method('SetNTxPower', 
+                   'void', 
+                   [param('uint32_t', 'n')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
+    cls.add_method('SetNumberOfReceiveAntennas', 
+                   'void', 
+                   [param('uint32_t', 'rx')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNumberOfTransmitAntennas(uint32_t tx) [member function]
+    cls.add_method('SetNumberOfTransmitAntennas', 
+                   'void', 
+                   [param('uint32_t', 'tx')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveErrorCallback(ns3::Callback<void,ns3::Ptr<const ns3::Packet>,double,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveOkCallback(ns3::Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiTxVector,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxGain(double gain) [member function]
+    cls.add_method('SetRxGain', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('double', 'gain')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
+    cls.add_method('SetRxNoiseFigure', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('double', 'noiseFigureDb')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetSleepMode() [member function]
+    cls.add_method('SetSleepMode', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLowLatency() const [member function]
-    cls.add_method('IsLowLatency', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
-    return
-
-def register_Ns3YansWavePhyHelper_methods(root_module, cls):
-    ## wave-helper.h (module 'wave'): ns3::YansWavePhyHelper::YansWavePhyHelper() [constructor]
-    cls.add_constructor([])
-    ## wave-helper.h (module 'wave'): ns3::YansWavePhyHelper::YansWavePhyHelper(ns3::YansWavePhyHelper const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::YansWavePhyHelper const &', 'arg0')])
-    ## wave-helper.h (module 'wave'): static ns3::YansWavePhyHelper ns3::YansWavePhyHelper::Default() [member function]
-    cls.add_method('Default', 
-                   'ns3::YansWavePhyHelper', 
                    [], 
-                   is_static=True)
-    ## wave-helper.h (module 'wave'): void ns3::YansWavePhyHelper::EnableAsciiInternal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool explicitFilename) [member function]
-    cls.add_method('EnableAsciiInternal', 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetStbc(bool stbc) [member function]
+    cls.add_method('SetStbc', 
                    'void', 
-                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'explicitFilename')], 
+                   [param('bool', 'stbc')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxGain(double gain) [member function]
+    cls.add_method('SetTxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerEnd(double end) [member function]
+    cls.add_method('SetTxPowerEnd', 
+                   'void', 
+                   [param('double', 'end')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerStart(double start) [member function]
+    cls.add_method('SetTxPowerStart', 
+                   'void', 
+                   [param('double', 'start')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
+    cls.add_method('StartReceivePacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePreambleAndHeader(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreambleAndHeader', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Time', 'rxDuration')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('UnregisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
                    visibility='private', is_virtual=True)
-    ## wave-helper.h (module 'wave'): void ns3::YansWavePhyHelper::EnablePcapInternal(std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool promiscuous, bool explicitFilename) [member function]
-    cls.add_method('EnablePcapInternal', 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'promiscuous'), param('bool', 'explicitFilename')], 
+                   [], 
                    visibility='private', is_virtual=True)
     return
 
@@ -9932,6 +10631,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::GetEof() const [member function]
+    cls.add_method('GetEof', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ampdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmpduSubframeHeader::GetInstanceTypeId() const [member function]
     cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
@@ -9971,6 +10675,10 @@
     cls.add_method('SetCrc', 
                    'void', 
                    [param('uint8_t', 'crc')])
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetEof(bool eof) [member function]
+    cls.add_method('SetEof', 
+                   'void', 
+                   [param('bool', 'eof')])
     ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetLength(uint16_t length) [member function]
     cls.add_method('SetLength', 
                    'void', 
@@ -10234,11 +10942,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -11327,10 +12045,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -11563,6 +12281,16 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
+    cls.add_method('GetAntennaSelectionCapabilities', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
+    cls.add_method('GetExtendedHtCapabilities', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
     cls.add_method('GetGreenfield', 
                    'uint8_t', 
@@ -11578,11 +12306,31 @@
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLSigProtectionSupport() const [member function]
+    cls.add_method('GetLSigProtectionSupport', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
     cls.add_method('GetLdpc', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
+    cls.add_method('GetMaxAmsduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetRxHighestSupportedDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t * ns3::HtCapabilities::GetRxMcsBitmask() [member function]
     cls.add_method('GetRxMcsBitmask', 
                    'uint8_t *', 
@@ -11597,6 +12345,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval40() const [member function]
+    cls.add_method('GetShortGuardInterval40', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
     cls.add_method('GetSupportedChannelWidth', 
                    'uint8_t', 
@@ -11612,6 +12365,21 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
+    cls.add_method('GetTxBfCapabilities', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMaxNSpatialStreams() const [member function]
+    cls.add_method('GetTxMaxNSpatialStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMcsSetDefined() const [member function]
+    cls.add_method('GetTxMcsSetDefined', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) [member function]
     cls.add_method('IsSupportedMcs', 
                    'bool', 
@@ -11630,6 +12398,14 @@
     cls.add_method('SetAmpduParameters', 
                    'void', 
                    [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
+    cls.add_method('SetAntennaSelectionCapabilities', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
+    cls.add_method('SetExtendedHtCapabilities', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
     cls.add_method('SetGreenfield', 
                    'void', 
@@ -11642,10 +12418,26 @@
     cls.add_method('SetHtSupported', 
                    'void', 
                    [param('uint8_t', 'htsupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lsigprotection) [member function]
+    cls.add_method('SetLSigProtectionSupport', 
+                   'void', 
+                   [param('uint8_t', 'lsigprotection')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint8_t maxampdulength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxampdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint8_t maxamsdulength) [member function]
+    cls.add_method('SetMaxAmsduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxamsdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxsupportedrate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxsupportedrate')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
     cls.add_method('SetRxMcsBitmask', 
                    'void', 
@@ -11654,6 +12446,10 @@
     cls.add_method('SetShortGuardInterval20', 
                    'void', 
                    [param('uint8_t', 'shortguardinterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardInterval40', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedchannelwidth) [member function]
     cls.add_method('SetSupportedChannelWidth', 
                    'void', 
@@ -11662,6 +12458,18 @@
     cls.add_method('SetSupportedMcsSet', 
                    'void', 
                    [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
+    cls.add_method('SetTxBfCapabilities', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxtxspatialstreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxtxspatialstreams')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txmcssetdefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txmcssetdefined')])
     return
 
 def register_Ns3HtCapabilitiesChecker_methods(root_module, cls):
@@ -12981,6 +13789,10 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MpduAggregator> ns3::MacLow::GetMpduAggregator() [member function]
+    cls.add_method('GetMpduAggregator', 
+                   'ns3::Ptr< ns3::MpduAggregator >', 
+                   [])
     ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::MacLow::GetPhy() const [member function]
     cls.add_method('GetPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
@@ -13006,6 +13818,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## mac-low.h (module 'wifi'): static ns3::TypeId ns3::MacLow::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
     cls.add_method('IsPromisc', 
                    'bool', 
@@ -13130,6 +13947,11 @@
     cls.add_constructor([])
     ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtBeaconHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     return
 
 def register_Ns3MobilityModel_methods(root_module, cls):
@@ -13202,16 +14024,21 @@
     cls.add_constructor([])
     ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator(ns3::MpduAggregator const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MpduAggregator const &', 'arg0')])
-    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last) [member function]
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last, bool vhtSingleMpdu) [member function]
     cls.add_method('AddHeaderAndPad', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last'), param('bool', 'vhtSingleMpdu')], 
                    is_pure_virtual=True, is_virtual=True)
     ## mpdu-aggregator.h (module 'wifi'): bool ns3::MpduAggregator::Aggregate(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
     cls.add_method('Aggregate', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AggregateVhtSingleMpdu(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
+    cls.add_method('AggregateVhtSingleMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## mpdu-aggregator.h (module 'wifi'): uint32_t ns3::MpduAggregator::CalculatePadding(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('CalculatePadding', 
                    'uint32_t', 
@@ -14252,6 +15079,16 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
     return
 
 def register_Ns3Ssid_methods(root_module, cls):
@@ -14587,6 +15424,237 @@
                    [param('ns3::Vector3D const &', 'value')])
     return
 
+def register_Ns3VhtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::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)
+    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxAmpduLengthExponent() const [member function]
+    cls.add_method('GetMaxAmpduLengthExponent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
+    cls.add_method('GetMaxMpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
+    cls.add_method('GetRxLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxMcsMap() const [member function]
+    cls.add_method('GetRxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
+    cls.add_method('GetRxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor160Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor160Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor80Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor80Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
+    cls.add_method('GetSupportedMcsAndNssSet', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetTxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxMcsMap() const [member function]
+    cls.add_method('GetTxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
+    cls.add_method('GetTxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
+    cls.add_method('GetVhtCapabilitiesInfo', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t Nss) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'Nss')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLengthExponent(uint8_t exponent) [member function]
+    cls.add_method('SetMaxAmpduLengthExponent', 
+                   'void', 
+                   [param('uint8_t', 'exponent')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint8_t length) [member function]
+    cls.add_method('SetMaxMpduLength', 
+                   'void', 
+                   [param('uint8_t', 'length')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetRxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxldpc) [member function]
+    cls.add_method('SetRxLdpc', 
+                   'void', 
+                   [param('uint8_t', 'rxldpc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxstbc) [member function]
+    cls.add_method('SetRxStbc', 
+                   'void', 
+                   [param('uint8_t', 'rxstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor160Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor80Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelwidthset) [member function]
+    cls.add_method('SetSupportedChannelWidthSet', 
+                   'void', 
+                   [param('uint8_t', 'channelwidthset')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNssSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetTxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txstbc) [member function]
+    cls.add_method('SetTxStbc', 
+                   'void', 
+                   [param('uint8_t', 'txstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
+    cls.add_method('SetVhtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtsupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtsupported')])
+    return
+
+def register_Ns3VhtCapabilitiesChecker_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker(ns3::VhtCapabilitiesChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesChecker const &', 'arg0')])
+    return
+
+def register_Ns3VhtCapabilitiesValue_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilitiesValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesValue const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilities const & value) [constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'value')])
+    ## vht-capabilities.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::VhtCapabilitiesValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilitiesValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities ns3::VhtCapabilitiesValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): std::string ns3::VhtCapabilitiesValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilitiesValue::Set(ns3::VhtCapabilities const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::VhtCapabilities const &', 'value')])
+    return
+
 def register_Ns3WaveMacLow_methods(root_module, cls):
     ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow::WaveMacLow(ns3::WaveMacLow const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WaveMacLow const &', 'arg0')])
@@ -14939,10 +16007,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, ns3::Time duration) const [member function]
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Time duration) const [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('ns3::Time', 'duration')], 
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Time', 'duration')], 
                    is_const=True)
     ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
@@ -15289,6 +16357,7 @@
                         [])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -15302,6 +16371,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/wave/bindings/modulegen__gcc_LP64.py ns-3.24/src/wave/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/wave/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -23,11 +23,11 @@
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
     module.add_enum('WifiMacType', ['WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_CTLWRAPPER', '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-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT', 'WIFI_PREAMBLE_NONE'], import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'], import_from_module='ns.wifi')
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT'], import_from_module='ns.wifi')
     ## wifi-phy-standard.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_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211ac'], 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_UNDEF'], import_from_module='ns.wifi')
     ## channel-scheduler.h (module 'wave'): ns3::ChannelAccess [enumeration]
@@ -98,6 +98,10 @@
     module.add_class('InetSocketAddress', import_from_module='ns.network')
     ## inet-socket-address.h (module 'network'): ns3::InetSocketAddress [class]
     root_module['ns3::InetSocketAddress'].implicitly_converts_to(root_module['ns3::Address'])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper [class]
+    module.add_class('InterferenceHelper', import_from_module='ns.wifi')
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer [struct]
+    module.add_class('SnrPer', import_from_module='ns.wifi', outer_class=root_module['ns3::InterferenceHelper'])
     ## 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]
@@ -172,12 +176,14 @@
     module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
     module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters [struct]
+    module.add_class('Parameters', import_from_module='ns.wifi')
     ## pcap-file.h (module 'network'): ns3::PcapFile [class]
     module.add_class('PcapFile', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -256,6 +262,10 @@
     module.add_class('int64x64_t', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
     module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo [struct]
+    module.add_class('mpduInfo', import_from_module='ns.wifi')
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm [struct]
+    module.add_class('signalNoiseDbm', import_from_module='ns.wifi')
     ## chunk.h (module 'network'): ns3::Chunk [class]
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
@@ -316,6 +326,8 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::InterferenceHelper::Event', 'ns3::empty', 'ns3::DefaultDeleter<ns3::InterferenceHelper::Event>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
@@ -406,6 +418,8 @@
     module.add_class('WifiRemoteStationManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## wave-helper.h (module 'wave'): ns3::YansWavePhyHelper [class]
     module.add_class('YansWavePhyHelper', parent=root_module['ns3::YansWifiPhyHelper'])
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy [class]
+    module.add_class('YansWifiPhy', import_from_module='ns.wifi', parent=root_module['ns3::WifiPhy'])
     ## 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]
@@ -584,6 +598,12 @@
     module.add_class('Vector3DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## vector.h (module 'core'): ns3::Vector3DValue [class]
     module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities [class]
+    module.add_class('VhtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker [class]
+    module.add_class('VhtCapabilitiesChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue [class]
+    module.add_class('VhtCapabilitiesValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
     ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow [class]
     module.add_class('WaveMacLow', parent=root_module['ns3::MacLow'])
     ## wave-net-device.h (module 'wave'): ns3::WaveNetDevice [class]
@@ -609,15 +629,11 @@
     module.add_container('std::vector< int >', 'int', container_type=u'vector')
     module.add_container('std::vector< unsigned int >', 'unsigned int', container_type=u'vector')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type=u'vector')
-    module.add_container('ns3::WifiMcsList', 'unsigned char', container_type=u'vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type=u'map')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::AmpduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::AmpduSubframeHeader >', container_type=u'list')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::AmsduSubframeHeader >', container_type=u'list')
     module.add_container('std::map< unsigned int, ns3::Ptr< ns3::OcbWifiMac > >', ('unsigned int', 'ns3::Ptr< ns3::OcbWifiMac >'), container_type=u'map')
     module.add_container('std::vector< ns3::Ptr< ns3::WifiPhy > >', 'ns3::Ptr< ns3::WifiPhy >', container_type=u'vector')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >', u'ns3::WifiMcsList')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >*', u'ns3::WifiMcsList*')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >&', u'ns3::WifiMcsList&')
     typehandlers.add_type_alias(u'uint8_t', u'ns3::WifiInformationElementId')
     typehandlers.add_type_alias(u'uint8_t*', u'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias(u'uint8_t&', u'ns3::WifiInformationElementId&')
@@ -627,9 +643,6 @@
     typehandlers.add_type_alias(u'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 >', u'ns3::VscCallback')
     typehandlers.add_type_alias(u'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 >*', u'ns3::VscCallback*')
     typehandlers.add_type_alias(u'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 >&', u'ns3::VscCallback&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     typehandlers.add_type_alias(u'ns3::Vector3D', u'ns3::Vector')
     typehandlers.add_type_alias(u'ns3::Vector3D*', u'ns3::Vector*')
     typehandlers.add_type_alias(u'ns3::Vector3D&', u'ns3::Vector&')
@@ -645,12 +658,12 @@
     typehandlers.add_type_alias(u'ns3::Vector3DChecker*', u'ns3::VectorChecker*')
     typehandlers.add_type_alias(u'ns3::Vector3DChecker&', u'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     typehandlers.add_type_alias(u'std::_Rb_tree_const_iterator< std::pair< ns3::AcIndex const, ns3::EdcaParameter > >', u'ns3::EdcaParameterSetI')
     typehandlers.add_type_alias(u'std::_Rb_tree_const_iterator< std::pair< ns3::AcIndex const, ns3::EdcaParameter > >*', u'ns3::EdcaParameterSetI*')
     typehandlers.add_type_alias(u'std::_Rb_tree_const_iterator< std::pair< ns3::AcIndex const, ns3::EdcaParameter > >&', u'ns3::EdcaParameterSetI&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', u'ns3::WifiMcsListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', u'ns3::WifiMcsListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', u'ns3::WifiMcsListIterator&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -664,6 +677,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -704,6 +723,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -735,6 +761,8 @@
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
+    register_Ns3InterferenceHelper_methods(root_module, root_module['ns3::InterferenceHelper'])
+    register_Ns3InterferenceHelperSnrPer_methods(root_module, root_module['ns3::InterferenceHelper::SnrPer'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
@@ -762,6 +790,7 @@
     register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
     register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
     register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3Parameters_methods(root_module, root_module['ns3::Parameters'])
     register_Ns3PcapFile_methods(root_module, root_module['ns3::PcapFile'])
     register_Ns3PcapHelper_methods(root_module, root_module['ns3::PcapHelper'])
     register_Ns3PcapHelperForDevice_methods(root_module, root_module['ns3::PcapHelperForDevice'])
@@ -799,6 +828,8 @@
     register_Ns3YansWifiPhyHelper_methods(root_module, root_module['ns3::YansWifiPhyHelper'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
+    register_Ns3MpduInfo_methods(root_module, root_module['ns3::mpduInfo'])
+    register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::signalNoiseDbm'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3HigherLayerTxVectorTag_methods(root_module, root_module['ns3::HigherLayerTxVectorTag'])
@@ -826,6 +857,7 @@
     register_Ns3SimpleRefCount__Ns3ChannelCoordinationListener_Ns3Empty_Ns3DefaultDeleter__lt__ns3ChannelCoordinationListener__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::ChannelCoordinationListener, ns3::empty, ns3::DefaultDeleter<ns3::ChannelCoordinationListener> >'])
     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__Ns3InterferenceHelperEvent_Ns3Empty_Ns3DefaultDeleter__lt__ns3InterferenceHelperEvent__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> >'])
     register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >'])
     register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >'])
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
@@ -859,6 +891,7 @@
     register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
     register_Ns3YansWavePhyHelper_methods(root_module, root_module['ns3::YansWavePhyHelper'])
+    register_Ns3YansWifiPhy_methods(root_module, root_module['ns3::YansWifiPhy'])
     register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
     register_Ns3AmpduSubframeHeader_methods(root_module, root_module['ns3::AmpduSubframeHeader'])
@@ -945,6 +978,9 @@
     register_Ns3Vector2DValue_methods(root_module, root_module['ns3::Vector2DValue'])
     register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
     register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
+    register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
+    register_Ns3VhtCapabilitiesChecker_methods(root_module, root_module['ns3::VhtCapabilitiesChecker'])
+    register_Ns3VhtCapabilitiesValue_methods(root_module, root_module['ns3::VhtCapabilitiesValue'])
     register_Ns3WaveMacLow_methods(root_module, root_module['ns3::WaveMacLow'])
     register_Ns3WaveNetDevice_methods(root_module, root_module['ns3::WaveNetDevice'])
     register_Ns3WifiChannel_methods(root_module, root_module['ns3::WifiChannel'])
@@ -1459,6 +1495,10 @@
     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', 
@@ -1662,17 +1702,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1694,11 +1734,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1708,16 +1743,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1955,14 +1980,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -2023,11 +2052,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CapabilityInformation_methods(root_module, cls):
@@ -2242,6 +2266,70 @@
                    [param('uint16_t', 'port')])
     return
 
+def register_Ns3InterferenceHelper_methods(root_module, cls):
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper(ns3::InterferenceHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
+    cls.add_constructor([])
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::InterferenceHelper::Event> ns3::InterferenceHelper::Add(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::Time duration, double rxPower) [member function]
+    cls.add_method('Add', 
+                   'ns3::Ptr< ns3::InterferenceHelper::Event >', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::Time', 'duration'), param('double', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePlcpHeaderSnrPer(ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
+    cls.add_method('CalculatePlcpHeaderSnrPer', 
+                   'ns3::InterferenceHelper::SnrPer', 
+                   [param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePlcpPayloadSnrPer(ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
+    cls.add_method('CalculatePlcpPayloadSnrPer', 
+                   'ns3::InterferenceHelper::SnrPer', 
+                   [param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')])
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::EraseEvents() [member function]
+    cls.add_method('EraseEvents', 
+                   'void', 
+                   [])
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW) [member function]
+    cls.add_method('GetEnergyDuration', 
+                   'ns3::Time', 
+                   [param('double', 'energyW')])
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::InterferenceHelper::GetErrorRateModel() const [member function]
+    cls.add_method('GetErrorRateModel', 
+                   'ns3::Ptr< ns3::ErrorRateModel >', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::GetNoiseFigure() const [member function]
+    cls.add_method('GetNoiseFigure', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd() [member function]
+    cls.add_method('NotifyRxEnd', 
+                   'void', 
+                   [])
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxStart() [member function]
+    cls.add_method('NotifyRxStart', 
+                   'void', 
+                   [])
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> rate) [member function]
+    cls.add_method('SetErrorRateModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorRateModel >', 'rate')])
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::SetNoiseFigure(double value) [member function]
+    cls.add_method('SetNoiseFigure', 
+                   'void', 
+                   [param('double', 'value')])
+    return
+
+def register_Ns3InterferenceHelperSnrPer_methods(root_module, cls):
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer() [constructor]
+    cls.add_constructor([])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer(ns3::InterferenceHelper::SnrPer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::InterferenceHelper::SnrPer const &', 'arg0')])
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::per [variable]
+    cls.add_instance_attribute('per', 'double', is_const=False)
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
+    return
+
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
@@ -3772,13 +3860,30 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
     cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
     return
 
+def register_Ns3Parameters_methods(root_module, cls):
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::Parameters() [constructor]
+    cls.add_constructor([])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::Parameters(ns3::Parameters const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Parameters const &', 'arg0')])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::aMpdu [variable]
+    cls.add_instance_attribute('aMpdu', 'ns3::mpduInfo', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::duration [variable]
+    cls.add_instance_attribute('duration', 'ns3::Time', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::preamble [variable]
+    cls.add_instance_attribute('preamble', 'ns3::WifiPreamble', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::rxPowerDbm [variable]
+    cls.add_instance_attribute('rxPowerDbm', 'double', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::txVector [variable]
+    cls.add_instance_attribute('txVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
 def register_Ns3PcapFile_methods(root_module, cls):
     ## pcap-file.h (module 'network'): ns3::PcapFile::PcapFile() [constructor]
     cls.add_constructor([])
@@ -3790,10 +3895,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -3857,10 +3962,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -4098,10 +4203,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -4712,24 +4817,24 @@
     cls.add_constructor([])
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
     cls.add_constructor([param('std::string', 'name')])
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate(uint8_t nss) const [member function]
     cls.add_method('GetCodeRate', 
                    'ns3::WifiCodeRate', 
-                   [], 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint16_t ns3::WifiMode::GetConstellationSize(uint8_t nss) const [member function]
     cls.add_method('GetConstellationSize', 
-                   'uint8_t', 
-                   [], 
+                   'uint16_t', 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetMcsValue() const [member function]
+    cls.add_method('GetMcsValue', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
@@ -4737,10 +4842,10 @@
                    'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [], 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -4762,10 +4867,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    cls.add_method('CreateWifiMcs', 
+                   'ns3::WifiMode', 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   is_static=True)
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
                    is_static=True)
     return
 
@@ -4870,6 +4980,10 @@
     cls.add_constructor([param('ns3::WifiRemoteStationState const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_address [variable]
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
+    cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
+    cls.add_instance_attribute('m_channelWidth', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_greenfield [variable]
     cls.add_instance_attribute('m_greenfield', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_info [variable]
@@ -4877,7 +4991,7 @@
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
-    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiMcsList', is_const=False)
+    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
     cls.add_instance_attribute('m_operationalRateSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_rx [variable]
@@ -4896,8 +5010,13 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## 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, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, uint32_t channelWidth, bool aggregation, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint32_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): uint32_t ns3::WifiTxVector::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -4923,6 +5042,11 @@
                    '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::IsShortGuardInterval() const [member function]
     cls.add_method('IsShortGuardInterval', 
                    'bool', 
@@ -4933,6 +5057,14 @@
                    '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::SetChannelWidth(uint32_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelWidth')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -5118,6 +5250,28 @@
     cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
 
+def register_Ns3MpduInfo_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo(ns3::mpduInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::mpduInfo const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::packetType [variable]
+    cls.add_instance_attribute('packetType', 'uint8_t', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::referenceNumber [variable]
+    cls.add_instance_attribute('referenceNumber', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3SignalNoiseDbm_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm(ns3::signalNoiseDbm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::signalNoiseDbm const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::noise [variable]
+    cls.add_instance_attribute('noise', 'double', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signal [variable]
+    cls.add_instance_attribute('signal', 'double', is_const=False)
+    return
+
 def register_Ns3Chunk_methods(root_module, cls):
     ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
     cls.add_constructor([])
@@ -5816,6 +5970,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5842,6 +6001,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtAssocResponseHeader_methods(root_module, cls):
@@ -5882,6 +6045,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5904,6 +6072,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtDelBaHeader_methods(root_module, cls):
@@ -6005,6 +6177,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -6027,6 +6204,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtProbeResponseHeader_methods(root_module, cls):
@@ -6078,6 +6259,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -6104,6 +6290,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3NqosWifiMacHelper_methods(root_module, cls):
@@ -6232,10 +6422,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -6475,6 +6665,18 @@
                    is_static=True)
     return
 
+def register_Ns3SimpleRefCount__Ns3InterferenceHelperEvent_Ns3Empty_Ns3DefaultDeleter__lt__ns3InterferenceHelperEvent__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> >::SimpleRefCount(ns3::SimpleRefCount<ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter< ns3::InterferenceHelper::Event > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::InterferenceHelper::Event, ns3::empty, ns3::DefaultDeleter<ns3::InterferenceHelper::Event> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    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]
     cls.add_constructor([])
@@ -7643,6 +7845,11 @@
     cls.add_method('GetTxPktCount', 
                    'int', 
                    [])
+    ## wave-bsm-stats.h (module 'wave'): static ns3::TypeId ns3::WaveBsmStats::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wave-bsm-stats.h (module 'wave'): void ns3::WaveBsmStats::IncExpectedRxPktCount(int index) [member function]
     cls.add_method('IncExpectedRxPktCount', 
                    'void', 
@@ -8491,6 +8698,10 @@
     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::SetQosNoAck() [member function]
     cls.add_method('SetQosNoAck', 
                    'void', 
@@ -8503,6 +8714,10 @@
     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::SetQosNormalAck() [member function]
     cls.add_method('SetQosNormalAck', 
                    'void', 
@@ -8639,19 +8854,19 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuration(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('CalculatePlcpDuration', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpPreambleAndHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('CalculatePlcpPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
                    [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('ConfigureStandard', 
                    'void', 
@@ -8667,11 +8882,6 @@
                    'ns3::Ptr< ns3::WifiChannel >', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint16_t', 
@@ -8682,6 +8892,11 @@
                    'ns3::Time', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -8762,328 +8977,328 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetMFPlcpHeaderMode', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
+    cls.add_method('GetHtMcs0', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
-    cls.add_method('GetMembershipSelectorModes', 
-                   'ns3::WifiModeList', 
-                   [param('uint32_t', 'selector')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
-    cls.add_method('GetMode', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
+    cls.add_method('GetHtMcs1', 
                    'ns3::WifiMode', 
-                   [param('uint32_t', 'mode')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
-    cls.add_method('GetNumberOfReceiveAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
-    cls.add_method('GetNumberOfTransmitAntennas', 
-                   'uint32_t', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
+    cls.add_method('GetHtMcs10', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
+    cls.add_method('GetHtMcs11', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
+    cls.add_method('GetHtMcs12', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
+    cls.add_method('GetHtMcs13', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
+    cls.add_method('GetHtMcs14', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
+    cls.add_method('GetHtMcs15', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
+    cls.add_method('GetHtMcs16', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
+    cls.add_method('GetHtMcs17', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
+    cls.add_method('GetHtMcs18', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
+    cls.add_method('GetHtMcs19', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
+    cls.add_method('GetHtMcs2', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
+    cls.add_method('GetHtMcs20', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
+    cls.add_method('GetHtMcs21', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
+    cls.add_method('GetHtMcs22', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
+    cls.add_method('GetHtMcs23', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
+    cls.add_method('GetHtMcs24', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
+    cls.add_method('GetHtMcs25', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
+    cls.add_method('GetHtMcs26', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
+    cls.add_method('GetHtMcs27', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
+    cls.add_method('GetHtMcs28', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
+    cls.add_method('GetHtMcs29', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
+    cls.add_method('GetHtMcs3', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
+    cls.add_method('GetHtMcs30', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
+    cls.add_method('GetHtMcs31', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
+    cls.add_method('GetHtMcs4', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
+    cls.add_method('GetHtMcs5', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
+    cls.add_method('GetHtMcs6', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
+    cls.add_method('GetHtMcs7', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
+    cls.add_method('GetHtMcs8', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
+    cls.add_method('GetHtMcs9', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetHtPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [], 
+                   [param('ns3::WifiMode', 'payloadMode')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'mcs')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
                    'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
+    cls.add_method('GetOfdmRate12Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
+    cls.add_method('GetOfdmRate18Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
+    cls.add_method('GetOfdmRate24Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
+    cls.add_method('GetOfdmRate36Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
+    cls.add_method('GetOfdmRate48Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
+    cls.add_method('GetOfdmRate54Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
@@ -9102,34 +9317,49 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
                    [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHtTrainingSymbolDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpPreambleDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA1Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA1Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA2Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA2Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigBDuration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
     cls.add_method('GetStateDuration', 
@@ -9156,6 +9386,61 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
+    cls.add_method('GetVhtMcs0', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
+    cls.add_method('GetVhtMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
+    cls.add_method('GetVhtMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
+    cls.add_method('GetVhtMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
+    cls.add_method('GetVhtMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
+    cls.add_method('GetVhtMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
+    cls.add_method('GetVhtMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
+    cls.add_method('GetVhtMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
+    cls.add_method('GetVhtMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
+    cls.add_method('GetVhtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetVhtPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
@@ -9196,19 +9481,14 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu, ns3::signalNoiseDbm signalNoise) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::signalNoiseDbm', 'signalNoise')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu) [member function]
     cls.add_method('NotifyMonitorSniffTx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('NotifyRxBegin', 
                    'void', 
@@ -9243,21 +9523,21 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
     cls.add_method('SendPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
                    [param('uint16_t', 'id')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
@@ -9313,11 +9593,6 @@
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
@@ -9329,10 +9604,10 @@
     cls.add_method('AddAllSupportedModes', 
                    'void', 
                    [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
+                   [param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
     cls.add_method('AddBasicMode', 
                    'void', 
@@ -9341,10 +9616,14 @@
     cls.add_method('AddStationHtCapabilities', 
                    'void', 
                    [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htcapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtcapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
     cls.add_method('AddSupportedMcs', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'mcs')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
     cls.add_method('AddSupportedMode', 
                    'void', 
@@ -9357,9 +9636,9 @@
     cls.add_method('GetAckTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
     cls.add_method('GetBasicMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint32_t', 'i')], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint32_t i) const [member function]
@@ -9383,9 +9662,9 @@
     cls.add_method('GetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
     cls.add_method('GetDefaultMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
@@ -9468,6 +9747,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::HasVhtSupported() const [member function]
+    cls.add_method('HasVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
     cls.add_method('IsAssociated', 
                    'bool', 
@@ -9587,6 +9871,10 @@
     cls.add_method('SetRtsCtsThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetupMac', 
                    'void', 
@@ -9597,11 +9885,25 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
+    cls.add_method('UpdateFragmentationThreshold', 
+                   'void', 
+                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAggregation', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetGreenfield', 
                    'bool', 
@@ -9617,9 +9919,9 @@
                    'ns3::Ptr< ns3::WifiMac >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
     cls.add_method('GetMcsSupported', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
                    is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
@@ -9677,6 +9979,11 @@
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
     cls.add_method('DoGetAckTxGuardInterval', 
                    'bool', 
@@ -9702,6 +10009,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetBlockAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetBlockAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
     cls.add_method('DoGetBlockAckTxGuardInterval', 
                    'bool', 
@@ -9727,6 +10039,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetCtsTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
     cls.add_method('DoGetCtsTxGuardInterval', 
                    'bool', 
@@ -9790,59 +10107,441 @@
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr) [member function]
     cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLowLatency() const [member function]
+    cls.add_method('IsLowLatency', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3YansWavePhyHelper_methods(root_module, cls):
+    ## wave-helper.h (module 'wave'): ns3::YansWavePhyHelper::YansWavePhyHelper() [constructor]
+    cls.add_constructor([])
+    ## wave-helper.h (module 'wave'): ns3::YansWavePhyHelper::YansWavePhyHelper(ns3::YansWavePhyHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::YansWavePhyHelper const &', 'arg0')])
+    ## wave-helper.h (module 'wave'): static ns3::YansWavePhyHelper ns3::YansWavePhyHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::YansWavePhyHelper', 
+                   [], 
+                   is_static=True)
+    ## wave-helper.h (module 'wave'): void ns3::YansWavePhyHelper::EnableAsciiInternal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool explicitFilename) [member function]
+    cls.add_method('EnableAsciiInternal', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'explicitFilename')], 
+                   visibility='private', is_virtual=True)
+    ## wave-helper.h (module 'wave'): void ns3::YansWavePhyHelper::EnablePcapInternal(std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool promiscuous, bool explicitFilename) [member function]
+    cls.add_method('EnablePcapInternal', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'promiscuous'), param('bool', 'explicitFilename')], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3YansWifiPhy_methods(root_module, cls):
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy(ns3::YansWifiPhy const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::YansWifiPhy const &', 'arg0')])
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy() [constructor]
+    cls.add_constructor([])
+    ## yans-wifi-phy.h (module 'wifi'): int64_t ns3::YansWifiPhy::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
+    cls.add_method('CalculateSnr', 
+                   'double', 
+                   [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetBssMembershipSelector(uint32_t selector) const [member function]
+    cls.add_method('GetBssMembershipSelector', 
+                   'uint32_t', 
+                   [param('uint32_t', 'selector')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetCcaMode1Threshold() const [member function]
+    cls.add_method('GetCcaMode1Threshold', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiChannel> ns3::YansWifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::WifiChannel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetChannelFrequencyMhz() const [member function]
+    cls.add_method('GetChannelFrequencyMhz', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint16_t ns3::YansWifiPhy::GetChannelNumber() const [member function]
+    cls.add_method('GetChannelNumber', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetChannelSwitchDelay() const [member function]
+    cls.add_method('GetChannelSwitchDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetDelayUntilIdle() [member function]
+    cls.add_method('GetDelayUntilIdle', 
+                   'ns3::Time', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::YansWifiPhy::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetEdThreshold() const [member function]
+    cls.add_method('GetEdThreshold', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::YansWifiPhy::GetErrorRateModel() const [member function]
+    cls.add_method('GetErrorRateModel', 
+                   'ns3::Ptr< ns3::ErrorRateModel >', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGreenfield() const [member function]
+    cls.add_method('GetGreenfield', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::YansWifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::YansWifiPhy::GetMobility() [member function]
+    cls.add_method('GetMobility', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
+                   [])
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxGain() const [member function]
+    cls.add_method('GetRxGain', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxNoiseFigure() const [member function]
+    cls.add_method('GetRxNoiseFigure', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetStateDuration() [member function]
+    cls.add_method('GetStateDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetStbc() const [member function]
+    cls.add_method('GetStbc', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxGain() const [member function]
+    cls.add_method('GetTxGain', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerEnd() const [member function]
+    cls.add_method('GetTxPowerEnd', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerStart() const [member function]
+    cls.add_method('GetTxPowerStart', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::YansWifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsMcsSupported(ns3::WifiMode mcs) [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('ns3::WifiMode', 'mcs')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
+    cls.add_method('IsModeSupported', 
+                   'bool', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateBusy() [member function]
+    cls.add_method('IsStateBusy', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateCcaBusy() [member function]
+    cls.add_method('IsStateCcaBusy', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateIdle() [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateRx() [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateSleep() [member function]
+    cls.add_method('IsStateSleep', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateSwitching() [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateTx() [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::ResumeFromSleep() [member function]
+    cls.add_method('ResumeFromSleep', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
+    cls.add_method('SendPacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetCcaMode1Threshold(double threshold) [member function]
+    cls.add_method('SetCcaMode1Threshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannel(ns3::Ptr<ns3::YansWifiChannel> channel) [member function]
+    cls.add_method('SetChannel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::YansWifiChannel >', 'channel')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelNumber(uint16_t id) [member function]
+    cls.add_method('SetChannelNumber', 
+                   'void', 
+                   [param('uint16_t', 'id')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetEdThreshold(double threshold) [member function]
+    cls.add_method('SetEdThreshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> rate) [member function]
+    cls.add_method('SetErrorRateModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorRateModel >', 'rate')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetFrequency(uint32_t freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('uint32_t', 'freq')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGreenfield(bool greenfield) [member function]
+    cls.add_method('SetGreenfield', 
+                   'void', 
+                   [param('bool', 'greenfield')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGuardInterval(bool guardInterval) [member function]
+    cls.add_method('SetGuardInterval', 
+                   'void', 
+                   [param('bool', 'guardInterval')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetLdpc(bool ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('bool', 'ldpc')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> mobility) [member function]
+    cls.add_method('SetMobility', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'mobility')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNTxPower(uint32_t n) [member function]
+    cls.add_method('SetNTxPower', 
+                   'void', 
+                   [param('uint32_t', 'n')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
+    cls.add_method('SetNumberOfReceiveAntennas', 
+                   'void', 
+                   [param('uint32_t', 'rx')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNumberOfTransmitAntennas(uint32_t tx) [member function]
+    cls.add_method('SetNumberOfTransmitAntennas', 
+                   'void', 
+                   [param('uint32_t', 'tx')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveErrorCallback(ns3::Callback<void,ns3::Ptr<const ns3::Packet>,double,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveOkCallback(ns3::Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiTxVector,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxGain(double gain) [member function]
+    cls.add_method('SetRxGain', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('double', 'gain')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
+    cls.add_method('SetRxNoiseFigure', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('double', 'noiseFigureDb')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetSleepMode() [member function]
+    cls.add_method('SetSleepMode', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLowLatency() const [member function]
-    cls.add_method('IsLowLatency', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
-    return
-
-def register_Ns3YansWavePhyHelper_methods(root_module, cls):
-    ## wave-helper.h (module 'wave'): ns3::YansWavePhyHelper::YansWavePhyHelper() [constructor]
-    cls.add_constructor([])
-    ## wave-helper.h (module 'wave'): ns3::YansWavePhyHelper::YansWavePhyHelper(ns3::YansWavePhyHelper const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::YansWavePhyHelper const &', 'arg0')])
-    ## wave-helper.h (module 'wave'): static ns3::YansWavePhyHelper ns3::YansWavePhyHelper::Default() [member function]
-    cls.add_method('Default', 
-                   'ns3::YansWavePhyHelper', 
                    [], 
-                   is_static=True)
-    ## wave-helper.h (module 'wave'): void ns3::YansWavePhyHelper::EnableAsciiInternal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool explicitFilename) [member function]
-    cls.add_method('EnableAsciiInternal', 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetStbc(bool stbc) [member function]
+    cls.add_method('SetStbc', 
                    'void', 
-                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'explicitFilename')], 
+                   [param('bool', 'stbc')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxGain(double gain) [member function]
+    cls.add_method('SetTxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerEnd(double end) [member function]
+    cls.add_method('SetTxPowerEnd', 
+                   'void', 
+                   [param('double', 'end')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerStart(double start) [member function]
+    cls.add_method('SetTxPowerStart', 
+                   'void', 
+                   [param('double', 'start')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
+    cls.add_method('StartReceivePacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePreambleAndHeader(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreambleAndHeader', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Time', 'rxDuration')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('UnregisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
                    visibility='private', is_virtual=True)
-    ## wave-helper.h (module 'wave'): void ns3::YansWavePhyHelper::EnablePcapInternal(std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool promiscuous, bool explicitFilename) [member function]
-    cls.add_method('EnablePcapInternal', 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'promiscuous'), param('bool', 'explicitFilename')], 
+                   [], 
                    visibility='private', is_virtual=True)
     return
 
@@ -9932,6 +10631,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::GetEof() const [member function]
+    cls.add_method('GetEof', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ampdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmpduSubframeHeader::GetInstanceTypeId() const [member function]
     cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
@@ -9971,6 +10675,10 @@
     cls.add_method('SetCrc', 
                    'void', 
                    [param('uint8_t', 'crc')])
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetEof(bool eof) [member function]
+    cls.add_method('SetEof', 
+                   'void', 
+                   [param('bool', 'eof')])
     ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetLength(uint16_t length) [member function]
     cls.add_method('SetLength', 
                    'void', 
@@ -10234,11 +10942,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -11327,10 +12045,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -11563,6 +12281,16 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
+    cls.add_method('GetAntennaSelectionCapabilities', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
+    cls.add_method('GetExtendedHtCapabilities', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
     cls.add_method('GetGreenfield', 
                    'uint8_t', 
@@ -11578,11 +12306,31 @@
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLSigProtectionSupport() const [member function]
+    cls.add_method('GetLSigProtectionSupport', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
     cls.add_method('GetLdpc', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
+    cls.add_method('GetMaxAmsduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetRxHighestSupportedDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t * ns3::HtCapabilities::GetRxMcsBitmask() [member function]
     cls.add_method('GetRxMcsBitmask', 
                    'uint8_t *', 
@@ -11597,6 +12345,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval40() const [member function]
+    cls.add_method('GetShortGuardInterval40', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
     cls.add_method('GetSupportedChannelWidth', 
                    'uint8_t', 
@@ -11612,6 +12365,21 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
+    cls.add_method('GetTxBfCapabilities', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMaxNSpatialStreams() const [member function]
+    cls.add_method('GetTxMaxNSpatialStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMcsSetDefined() const [member function]
+    cls.add_method('GetTxMcsSetDefined', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) [member function]
     cls.add_method('IsSupportedMcs', 
                    'bool', 
@@ -11630,6 +12398,14 @@
     cls.add_method('SetAmpduParameters', 
                    'void', 
                    [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
+    cls.add_method('SetAntennaSelectionCapabilities', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
+    cls.add_method('SetExtendedHtCapabilities', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
     cls.add_method('SetGreenfield', 
                    'void', 
@@ -11642,10 +12418,26 @@
     cls.add_method('SetHtSupported', 
                    'void', 
                    [param('uint8_t', 'htsupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lsigprotection) [member function]
+    cls.add_method('SetLSigProtectionSupport', 
+                   'void', 
+                   [param('uint8_t', 'lsigprotection')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint8_t maxampdulength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxampdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint8_t maxamsdulength) [member function]
+    cls.add_method('SetMaxAmsduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxamsdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxsupportedrate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxsupportedrate')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
     cls.add_method('SetRxMcsBitmask', 
                    'void', 
@@ -11654,6 +12446,10 @@
     cls.add_method('SetShortGuardInterval20', 
                    'void', 
                    [param('uint8_t', 'shortguardinterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardInterval40', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedchannelwidth) [member function]
     cls.add_method('SetSupportedChannelWidth', 
                    'void', 
@@ -11662,6 +12458,18 @@
     cls.add_method('SetSupportedMcsSet', 
                    'void', 
                    [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
+    cls.add_method('SetTxBfCapabilities', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxtxspatialstreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxtxspatialstreams')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txmcssetdefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txmcssetdefined')])
     return
 
 def register_Ns3HtCapabilitiesChecker_methods(root_module, cls):
@@ -12981,6 +13789,10 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MpduAggregator> ns3::MacLow::GetMpduAggregator() [member function]
+    cls.add_method('GetMpduAggregator', 
+                   'ns3::Ptr< ns3::MpduAggregator >', 
+                   [])
     ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::MacLow::GetPhy() const [member function]
     cls.add_method('GetPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
@@ -13006,6 +13818,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## mac-low.h (module 'wifi'): static ns3::TypeId ns3::MacLow::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
     cls.add_method('IsPromisc', 
                    'bool', 
@@ -13130,6 +13947,11 @@
     cls.add_constructor([])
     ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtBeaconHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     return
 
 def register_Ns3MobilityModel_methods(root_module, cls):
@@ -13202,16 +14024,21 @@
     cls.add_constructor([])
     ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator(ns3::MpduAggregator const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MpduAggregator const &', 'arg0')])
-    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last) [member function]
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last, bool vhtSingleMpdu) [member function]
     cls.add_method('AddHeaderAndPad', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last'), param('bool', 'vhtSingleMpdu')], 
                    is_pure_virtual=True, is_virtual=True)
     ## mpdu-aggregator.h (module 'wifi'): bool ns3::MpduAggregator::Aggregate(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
     cls.add_method('Aggregate', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AggregateVhtSingleMpdu(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
+    cls.add_method('AggregateVhtSingleMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## mpdu-aggregator.h (module 'wifi'): uint32_t ns3::MpduAggregator::CalculatePadding(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('CalculatePadding', 
                    'uint32_t', 
@@ -14252,6 +15079,16 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
     return
 
 def register_Ns3Ssid_methods(root_module, cls):
@@ -14587,6 +15424,237 @@
                    [param('ns3::Vector3D const &', 'value')])
     return
 
+def register_Ns3VhtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::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)
+    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxAmpduLengthExponent() const [member function]
+    cls.add_method('GetMaxAmpduLengthExponent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
+    cls.add_method('GetMaxMpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
+    cls.add_method('GetRxLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxMcsMap() const [member function]
+    cls.add_method('GetRxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
+    cls.add_method('GetRxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor160Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor160Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor80Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor80Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
+    cls.add_method('GetSupportedMcsAndNssSet', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetTxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxMcsMap() const [member function]
+    cls.add_method('GetTxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
+    cls.add_method('GetTxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
+    cls.add_method('GetVhtCapabilitiesInfo', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t Nss) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'Nss')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLengthExponent(uint8_t exponent) [member function]
+    cls.add_method('SetMaxAmpduLengthExponent', 
+                   'void', 
+                   [param('uint8_t', 'exponent')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint8_t length) [member function]
+    cls.add_method('SetMaxMpduLength', 
+                   'void', 
+                   [param('uint8_t', 'length')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetRxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxldpc) [member function]
+    cls.add_method('SetRxLdpc', 
+                   'void', 
+                   [param('uint8_t', 'rxldpc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxstbc) [member function]
+    cls.add_method('SetRxStbc', 
+                   'void', 
+                   [param('uint8_t', 'rxstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor160Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor80Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelwidthset) [member function]
+    cls.add_method('SetSupportedChannelWidthSet', 
+                   'void', 
+                   [param('uint8_t', 'channelwidthset')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNssSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetTxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txstbc) [member function]
+    cls.add_method('SetTxStbc', 
+                   'void', 
+                   [param('uint8_t', 'txstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
+    cls.add_method('SetVhtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtsupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtsupported')])
+    return
+
+def register_Ns3VhtCapabilitiesChecker_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker(ns3::VhtCapabilitiesChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesChecker const &', 'arg0')])
+    return
+
+def register_Ns3VhtCapabilitiesValue_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilitiesValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesValue const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilities const & value) [constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'value')])
+    ## vht-capabilities.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::VhtCapabilitiesValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilitiesValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities ns3::VhtCapabilitiesValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): std::string ns3::VhtCapabilitiesValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilitiesValue::Set(ns3::VhtCapabilities const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::VhtCapabilities const &', 'value')])
+    return
+
 def register_Ns3WaveMacLow_methods(root_module, cls):
     ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow::WaveMacLow(ns3::WaveMacLow const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WaveMacLow const &', 'arg0')])
@@ -14939,10 +16007,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, ns3::Time duration) const [member function]
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Time duration) const [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('ns3::Time', 'duration')], 
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Time', 'duration')], 
                    is_const=True)
     ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
@@ -15289,6 +16357,7 @@
                         [])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -15302,6 +16371,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/wave/examples/wave-simple-device.cc ns-3.24/src/wave/examples/wave-simple-device.cc
--- ns-3.23/src/wave/examples/wave-simple-device.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/examples/wave-simple-device.cc	2015-09-15 11:18:44.000000000 -0700
@@ -115,13 +115,6 @@
   seqTs.SetSeq (seq);
   p->AddHeader (seqTs);
   sender->SendX  (p, bssWildcard, WSMP_PROT_NUMBER, txInfo);
-
-  Ptr<Packet> p2  = Create<Packet> (100);
-  SeqTsHeader seqTs2;
-  seqTs2.SetSeq (seq + 1);
-  p2->AddHeader (seqTs2);
-  receiver->SendX  (p2, bssWildcard, WSMP_PROT_NUMBER, txInfo);
-
 }
 
 void
@@ -140,19 +133,19 @@
 
   // send WSMP packets
   // the first packet will be queued currently and be transmitted in next SCH interval
-  //Simulator::Schedule (Seconds (1.0), &WaveNetDeviceExample::SendOneWsmpPacket,  this, SCH1, 1);
+  Simulator::Schedule (Seconds (1.0), &WaveNetDeviceExample::SendOneWsmpPacket,  this, SCH1, 1);
   // the second packet will be queued currently and then be transmitted , because of in the CCH interval.
   Simulator::Schedule (Seconds (1.0), &WaveNetDeviceExample::SendOneWsmpPacket,  this, CCH, 2);
   // the third packet will be dropped because of no channel access for SCH2.
-  //Simulator::Schedule (Seconds (1.0), &WaveNetDeviceExample::SendOneWsmpPacket,  this, SCH2, 3);
+  Simulator::Schedule (Seconds (1.0), &WaveNetDeviceExample::SendOneWsmpPacket,  this, SCH2, 3);
 
   // release SCH access
-  //Simulator::Schedule (Seconds (2.0), &WaveNetDevice::StopSch, sender, SCH1);
-  //Simulator::Schedule (Seconds (2.0), &WaveNetDevice::StopSch, receiver, SCH1);
+  Simulator::Schedule (Seconds (2.0), &WaveNetDevice::StopSch, sender, SCH1);
+  Simulator::Schedule (Seconds (2.0), &WaveNetDevice::StopSch, receiver, SCH1);
   // the fourth packet will be queued and be transmitted because of default CCH access assigned automatically.
-  //Simulator::Schedule (Seconds (3.0), &WaveNetDeviceExample::SendOneWsmpPacket,  this, CCH, 4);
+  Simulator::Schedule (Seconds (3.0), &WaveNetDeviceExample::SendOneWsmpPacket,  this, CCH, 4);
   // the fifth packet will be dropped because of no SCH1 access assigned
-  //Simulator::Schedule (Seconds (3.0), &WaveNetDeviceExample::SendOneWsmpPacket,  this, SCH1, 5);
+  Simulator::Schedule (Seconds (3.0), &WaveNetDeviceExample::SendOneWsmpPacket,  this, SCH1, 5);
 
   Simulator::Stop (Seconds (5.0));
   Simulator::Run ();
diff -Naur ns-3.23/src/wave/helper/wave-bsm-stats.cc ns-3.24/src/wave/helper/wave-bsm-stats.cc
--- ns-3.23/src/wave/helper/wave-bsm-stats.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/helper/wave-bsm-stats.cc	2015-09-15 11:18:44.000000000 -0700
@@ -40,6 +40,18 @@
   m_waveTotalPktInCoverageReceiveCounts.resize (10, 0);
 }
 
+/* static */
+TypeId
+WaveBsmStats::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::WaveBsmStats")
+    .SetParent<Object> ()
+    .SetGroupName ("Stats")
+    .AddConstructor<WaveBsmStats> ()
+    ;
+  return tid;
+}
+  
 void
 WaveBsmStats::IncTxPktCount ()
 {
diff -Naur ns-3.23/src/wave/helper/wave-bsm-stats.h ns-3.24/src/wave/helper/wave-bsm-stats.h
--- ns-3.23/src/wave/helper/wave-bsm-stats.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/helper/wave-bsm-stats.h	2015-09-15 11:18:44.000000000 -0700
@@ -26,15 +26,14 @@
 #include <vector>
 
 namespace ns3 {
-class WaveBsmStats : public Object
 /**
  * \ingroup wave
  * \brief The WaveBsmStats class implements a stats collector for
  * IEEE 1609 WAVE (Wireless Access in Vehicular Environments)
  * Basic Safety Messages (BSMs).  The BSM is a ~200-byte packet that is
  * generally broadcast from every vehicle at a nominal rate of 10 Hz.
- */
-/*
+ *
+ * \internal
  * Note:  This class collects data elements and accessors
  * along with methods that calculate metrics from the data
  * elements.  The data and metrics calculation algorithms
@@ -47,6 +46,7 @@
  * or the algorithms separately into different classes could
  * lead to confusion over usage.
  */
+class WaveBsmStats : public Object
 {
 public:
   /**
@@ -56,6 +56,12 @@
   WaveBsmStats ();
 
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
+  /**
    * \brief Increments the count of transmitted packets
    * \return none
    */
diff -Naur ns-3.23/src/wave/helper/wave-helper.cc ns-3.24/src/wave/helper/wave-helper.cc
--- ns-3.23/src/wave/helper/wave-helper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/helper/wave-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -24,6 +24,7 @@
 #include "ns3/config.h"
 #include "ns3/names.h"
 #include "ns3/abort.h"
+#include "ns3/ampdu-subframe-header.h"
 #include "ns3/wave-net-device.h"
 #include "ns3/minstrel-wifi-manager.h"
 #include "ns3/radiotap-header.h"
@@ -88,12 +89,13 @@
 static void
 PcapSniffTxEvent (
   Ptr<PcapFileWrapper> file,
-  Ptr<const Packet>   packet,
-  uint16_t            channelFreqMhz,
-  uint16_t            channelNumber,
-  uint32_t            rate,
-  bool                isShortPreamble,
-  uint8_t             txPower)
+  Ptr<const Packet>    packet,
+  uint16_t             channelFreqMhz,
+  uint16_t             channelNumber,
+  uint32_t             rate,
+  WifiPreamble         preamble,
+  WifiTxVector         txVector,
+  struct mpduInfo      aMpdu)
 {
   uint32_t dlt = file->GetDataLinkType ();
 
@@ -114,24 +116,29 @@
         uint8_t frameFlags = RadiotapHeader::FRAME_FLAG_NONE;
         header.SetTsft (Simulator::Now ().GetMicroSeconds ());
 
-        // Our capture includes the FCS, so we set the flag to say so.
+        //Our capture includes the FCS, so we set the flag to say so.
         frameFlags |= RadiotapHeader::FRAME_FLAG_FCS_INCLUDED;
 
-        if (isShortPreamble)
+        if (preamble == WIFI_PREAMBLE_SHORT)
           {
             frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE;
           }
 
+        if (txVector.IsShortGuardInterval ())
+          {
+            frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_GUARD;
+          }
+
         header.SetFrameFlags (frameFlags);
         header.SetRate (rate);
 
         uint16_t channelFlags = 0;
         switch (rate)
           {
-          case 2:  // 1Mbps
-          case 4:  // 2Mbps
-          case 10: // 5Mbps
-          case 22: // 11Mbps
+          case 2:  //1Mbps
+          case 4:  //2Mbps
+          case 10: //5Mbps
+          case 22: //11Mbps
             channelFlags |= RadiotapHeader::CHANNEL_FLAG_CCK;
             break;
 
@@ -151,6 +158,117 @@
 
         header.SetChannelFrequencyAndFlags (channelFreqMhz, channelFlags);
 
+        if (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF || preamble == WIFI_PREAMBLE_NONE)
+          {
+            uint8_t mcsRate = 0;
+            uint8_t mcsKnown = RadiotapHeader::MCS_KNOWN_NONE;
+            uint8_t mcsFlags = RadiotapHeader::MCS_FLAGS_NONE;
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_INDEX;
+            mcsRate = rate - 128;
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_BANDWIDTH;
+            if (txVector.GetChannelWidth () == 40000000)
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_BANDWIDTH_40;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_GUARD_INTERVAL;
+            if (txVector.IsShortGuardInterval ())
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_GUARD_INTERVAL;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_HT_FORMAT;
+            if (preamble == WIFI_PREAMBLE_HT_GF)
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_HT_GREENFIELD;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS;
+            if (txVector.GetNess () & 0x01) //bit 1
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_NESS_BIT_0;
+              }
+            if (txVector.GetNess () & 0x02) //bit 2
+              {
+                mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS_BIT_1;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_FEC_TYPE; //only BCC is currently supported
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_STBC;
+            if (txVector.IsStbc ())
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_STBC_STREAMS;
+              }
+
+            header.SetMcsFields (mcsKnown, mcsFlags, mcsRate);
+          }
+
+        if (txVector.IsAggregation ())
+          {
+            uint16_t ampduStatusFlags = RadiotapHeader::A_MPDU_STATUS_NONE;
+            ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_DELIMITER_CRC_KNOWN;
+            ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
+            /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
+            AmpduSubframeHeader hdr;
+            uint32_t extractedLength;
+            p->RemoveHeader (hdr);
+            extractedLength = hdr.GetLength ();
+            p = p->CreateFragment (0, static_cast<uint32_t> (extractedLength));
+            if (aMpdu.packetType == 2 || (hdr.GetEof () == true && hdr.GetLength () > 0))
+              {
+                ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
+              }
+            header.SetAmpduStatus (aMpdu.referenceNumber, ampduStatusFlags, hdr.GetCrc ());
+          }
+
+        if (preamble == WIFI_PREAMBLE_VHT)
+          {
+            uint16_t vhtKnown = RadiotapHeader::VHT_KNOWN_NONE;
+            uint8_t vhtFlags = RadiotapHeader::VHT_FLAGS_NONE;
+            uint8_t vhtBandwidth = 0;
+            uint8_t vhtMcsNss[4] = {0,0,0,0};
+            uint8_t vhtCoding = 0;
+            uint8_t vhtGroupId = 0;
+            uint16_t vhtPartialAid = 0;
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_STBC;
+            if (txVector.IsStbc ())
+              {
+                vhtFlags |= RadiotapHeader::VHT_FLAGS_STBC;
+              }
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_GUARD_INTERVAL;
+            if (txVector.IsShortGuardInterval ())
+              {
+                vhtFlags |= RadiotapHeader::VHT_FLAGS_GUARD_INTERVAL;
+              }
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_BEAMFORMED; //Beamforming is currently not supported
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_BANDWIDTH;
+            //not all bandwidth values are currently supported
+            if (txVector.GetChannelWidth () == 40000000)
+              {
+                vhtBandwidth = 1;
+              }
+            else if (txVector.GetChannelWidth () == 80000000)
+              {
+                vhtBandwidth = 4;
+              }
+            else if (txVector.GetChannelWidth () == 160000000)
+              {
+                vhtBandwidth = 11;
+              }
+
+            //only SU PPDUs are currently supported
+            vhtMcsNss[0] |= (txVector.GetNss () & 0x0f);
+            vhtMcsNss[0] |= (((rate - 128) << 4) & 0xf0);
+
+            header.SetVhtFields (vhtKnown, vhtFlags, vhtBandwidth, vhtMcsNss, vhtCoding, vhtGroupId, vhtPartialAid);
+          }
 
         p->AddHeader (header);
         file->Write (Simulator::Now (), p);
@@ -163,14 +281,15 @@
 
 static void
 PcapSniffRxEvent (
-  Ptr<PcapFileWrapper> file,
-  Ptr<const Packet> packet,
-  uint16_t channelFreqMhz,
-  uint16_t channelNumber,
-  uint32_t rate,
-  bool isShortPreamble,
-  double signalDbm,
-  double noiseDbm)
+  Ptr<PcapFileWrapper>  file,
+  Ptr<const Packet>     packet,
+  uint16_t              channelFreqMhz,
+  uint16_t              channelNumber,
+  uint32_t              rate,
+  WifiPreamble          preamble,
+  WifiTxVector          txVector,
+  struct mpduInfo       aMpdu,
+  struct signalNoiseDbm signalNoise)
 {
   uint32_t dlt = file->GetDataLinkType ();
 
@@ -191,24 +310,29 @@
         uint8_t frameFlags = RadiotapHeader::FRAME_FLAG_NONE;
         header.SetTsft (Simulator::Now ().GetMicroSeconds ());
 
-        // Our capture includes the FCS, so we set the flag to say so.
+        //Our capture includes the FCS, so we set the flag to say so.
         frameFlags |= RadiotapHeader::FRAME_FLAG_FCS_INCLUDED;
 
-        if (isShortPreamble)
+        if (preamble == WIFI_PREAMBLE_SHORT)
           {
             frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE;
           }
 
+        if (txVector.IsShortGuardInterval ())
+          {
+            frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_GUARD;
+          }
+
         header.SetFrameFlags (frameFlags);
         header.SetRate (rate);
 
         uint16_t channelFlags = 0;
         switch (rate)
           {
-          case 2:  // 1Mbps
-          case 4:  // 2Mbps
-          case 10: // 5Mbps
-          case 22: // 11Mbps
+          case 2:  //1Mbps
+          case 4:  //2Mbps
+          case 10: //5Mbps
+          case 22: //11Mbps
             channelFlags |= RadiotapHeader::CHANNEL_FLAG_CCK;
             break;
 
@@ -228,8 +352,120 @@
 
         header.SetChannelFrequencyAndFlags (channelFreqMhz, channelFlags);
 
-        header.SetAntennaSignalPower (signalDbm);
-        header.SetAntennaNoisePower (noiseDbm);
+        header.SetAntennaSignalPower (signalNoise.signal);
+        header.SetAntennaNoisePower (signalNoise.noise);
+
+        if (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF || preamble == WIFI_PREAMBLE_NONE)
+          {
+            uint8_t mcsRate = 0;
+            uint8_t mcsKnown = RadiotapHeader::MCS_KNOWN_NONE;
+            uint8_t mcsFlags = RadiotapHeader::MCS_FLAGS_NONE;
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_INDEX;
+            mcsRate = rate - 128;
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_BANDWIDTH;
+            if (txVector.GetChannelWidth () == 40000000)
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_BANDWIDTH_40;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_GUARD_INTERVAL;
+            if (txVector.IsShortGuardInterval ())
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_GUARD_INTERVAL;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_HT_FORMAT;
+            if (preamble == WIFI_PREAMBLE_HT_GF)
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_HT_GREENFIELD;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS;
+            if (txVector.GetNess () & 0x01) //bit 1
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_NESS_BIT_0;
+              }
+            if (txVector.GetNess () & 0x02) //bit 2
+              {
+                mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS_BIT_1;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_FEC_TYPE; //only BCC is currently supported
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_STBC;
+            if (txVector.IsStbc ())
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_STBC_STREAMS;
+              }
+
+            header.SetMcsFields (mcsKnown, mcsFlags, mcsRate);
+          }
+
+        if (txVector.IsAggregation ())
+          {
+            uint16_t ampduStatusFlags = 0;
+            ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_DELIMITER_CRC_KNOWN;
+            ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
+            /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
+            AmpduSubframeHeader hdr;
+            uint32_t extractedLength;
+            p->RemoveHeader (hdr);
+            extractedLength = hdr.GetLength ();
+            p = p->CreateFragment (0, static_cast<uint32_t> (extractedLength));
+            if (aMpdu.packetType == 2 || (hdr.GetEof () == true && hdr.GetLength () > 0))
+              {
+                ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
+              }
+            header.SetAmpduStatus (aMpdu.referenceNumber, ampduStatusFlags, hdr.GetCrc ());
+          }
+
+        if (preamble == WIFI_PREAMBLE_VHT)
+          {
+            uint16_t vhtKnown = RadiotapHeader::VHT_KNOWN_NONE;
+            uint8_t vhtFlags = RadiotapHeader::VHT_FLAGS_NONE;
+            uint8_t vhtBandwidth = 0;
+            uint8_t vhtMcsNss[4] = {0,0,0,0};
+            uint8_t vhtCoding = 0;
+            uint8_t vhtGroupId = 0;
+            uint16_t vhtPartialAid = 0;
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_STBC;
+            if (txVector.IsStbc ())
+              {
+                vhtFlags |= RadiotapHeader::VHT_FLAGS_STBC;
+              }
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_GUARD_INTERVAL;
+            if (txVector.IsShortGuardInterval ())
+              {
+                vhtFlags |= RadiotapHeader::VHT_FLAGS_GUARD_INTERVAL;
+              }
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_BEAMFORMED; //Beamforming is currently not supported
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_BANDWIDTH;
+            //not all bandwidth values are currently supported
+            if (txVector.GetChannelWidth () == 40000000)
+              {
+                vhtBandwidth = 1;
+              }
+            else if (txVector.GetChannelWidth () == 80000000)
+              {
+                vhtBandwidth = 4;
+              }
+            else if (txVector.GetChannelWidth () == 160000000)
+              {
+                vhtBandwidth = 11;
+              }
+
+            //only SU PPDUs are currently supported
+            vhtMcsNss[0] |= (txVector.GetNss () & 0x0f);
+            vhtMcsNss[0] |= (((rate - 128) << 4) & 0xf0);
+
+            header.SetVhtFields (vhtKnown, vhtFlags, vhtBandwidth, vhtMcsNss, vhtCoding, vhtGroupId, vhtPartialAid);
+          }
 
         p->AddHeader (header);
         file->Write (Simulator::Now (), p);
diff -Naur ns-3.23/src/wave/model/bsm-application.cc ns-3.24/src/wave/model/bsm-application.cc
--- ns-3.23/src/wave/model/bsm-application.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/model/bsm-application.cc	2015-09-15 11:18:44.000000000 -0700
@@ -21,7 +21,6 @@
 
 #include "ns3/bsm-application.h"
 #include "ns3/log.h"
-#include "ns3/seq-ts-header.h"
 #include "ns3/wave-net-device.h"
 #include "ns3/wave-mac-helper.h"
 #include "ns3/wave-helper.h"
diff -Naur ns-3.23/src/wave/model/default-channel-scheduler.cc ns-3.24/src/wave/model/default-channel-scheduler.cc
--- ns-3.23/src/wave/model/default-channel-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/model/default-channel-scheduler.cc	2015-09-15 11:18:44.000000000 -0700
@@ -157,9 +157,9 @@
         }
     }
 
-  // if we need immediately switch SCH in CCHI, or we are in SCHI now,
+  // if we need immediately switch to AlternatingAccess,
   // we switch to specific SCH.
-  if ((immediate || m_coordinator->IsSchInterval ()))
+  if ((immediate && m_coordinator->IsSchInterval ()))
     {
       NS_ASSERT (m_channelNumber == CCH);
       SwitchToNextChannel (CCH, sch);
@@ -329,7 +329,12 @@
     }
   // CCH MAC is to attach single-PHY device and wake up for transmission.
   Ptr<OcbWifiMac> cchMacEntity = m_device->GetMac (CCH);
-  m_phy->SetChannelNumber (CCH);
+  if (Now ().GetMilliSeconds() != 0)
+    {
+	  m_phy->SetChannelNumber (CCH);
+	  Time switchTime = m_phy->GetChannelSwitchDelay ();
+	  cchMacEntity->MakeVirtualBusy (switchTime);
+    }
   cchMacEntity->SetWifiPhy (m_phy);
   cchMacEntity->Resume ();
 
diff -Naur ns-3.23/src/wave/model/ocb-wifi-mac.cc ns-3.24/src/wave/model/ocb-wifi-mac.cc
--- ns-3.23/src/wave/model/ocb-wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/model/ocb-wifi-mac.cc	2015-09-15 11:18:44.000000000 -0700
@@ -190,7 +190,7 @@
       // Any value greater than 7 is invalid and likely indicates that
       // the packet had no QoS tag, so we revert to zero, which'll
       // mean that AC_BE is used.
-      if (tid >= 7)
+      if (tid > 7)
         {
           tid = 0;
         }
diff -Naur ns-3.23/src/wave/model/vsa-manager.cc ns-3.24/src/wave/model/vsa-manager.cc
--- ns-3.23/src/wave/model/vsa-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/model/vsa-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -174,6 +174,7 @@
   vsc->AddPacketTag (qosTag);
 
   WifiTxVector txVector;
+  txVector.SetChannelWidth (10);
   txVector.SetTxPowerLevel (manager->GetManagementPowerLevel (channel));
   txVector.SetMode (manager->GetManagementDataRate (channel));
   HigherLayerTxVectorTag tag = HigherLayerTxVectorTag (txVector, manager->GetManagementAdaptable (channel));
diff -Naur ns-3.23/src/wave/model/wave-mac-low.cc ns-3.24/src/wave/model/wave-mac-low.cc
--- ns-3.23/src/wave/model/wave-mac-low.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/model/wave-mac-low.cc	2015-09-15 11:18:44.000000000 -0700
@@ -82,9 +82,10 @@
   WifiTxVector txHigher = datatag.GetTxVector ();
   WifiTxVector txMac = MacLow::GetDataTxVector (packet, hdr);
   WifiTxVector txAdapter;
+  txAdapter.SetChannelWidth (10);
   // the DataRate set by higher layer is the minimum data rate
   // which is the lower bound for the actual data rate.
-  if (txHigher.GetMode ().GetDataRate () > txMac.GetMode ().GetDataRate ())
+  if (txHigher.GetMode ().GetDataRate (txHigher.GetChannelWidth (), txHigher.IsShortGuardInterval (), 1) > txMac.GetMode ().GetDataRate (txMac.GetChannelWidth (), txMac.IsShortGuardInterval (), 1))
     {
       txAdapter.SetMode (txHigher.GetMode ());
     }
diff -Naur ns-3.23/src/wave/model/wave-net-device.cc ns-3.24/src/wave/model/wave-net-device.cc
--- ns-3.23/src/wave/model/wave-net-device.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/model/wave-net-device.cc	2015-09-15 11:18:44.000000000 -0700
@@ -408,6 +408,7 @@
             }
         }
       WifiTxVector txVector;
+      txVector.SetChannelWidth (10);
       txVector.SetTxPowerLevel (txInfo.txPowerLevel);
       txVector.SetMode (txInfo.dataRate);
       HigherLayerTxVectorTag tag = HigherLayerTxVectorTag (txVector, false);
diff -Naur ns-3.23/src/wave/model/wave-net-device.h ns-3.24/src/wave/model/wave-net-device.h
--- ns-3.23/src/wave/model/wave-net-device.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/model/wave-net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -352,6 +352,10 @@
   Ptr<ChannelCoordinator> m_channelCoordinator;
   Ptr<VsaManager> m_vsaManager;
   TxProfile *m_txProfile;
+  /**
+   * \todo The Address arguments should be passed
+   * by const reference, since they are large.
+   */
   TracedCallback<Address, Address> m_addressChange;
 
   // copy from WifiNetDevice
diff -Naur ns-3.23/src/wave/test/mac-extension-test-suite.cc ns-3.24/src/wave/test/mac-extension-test-suite.cc
--- ns-3.23/src/wave/test/mac-extension-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/test/mac-extension-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -23,7 +23,6 @@
 #include "ns3/mobility-model.h"
 #include "ns3/yans-wifi-helper.h"
 #include "ns3/mobility-helper.h"
-#include "ns3/seq-ts-header.h"
 #include "ns3/wave-net-device.h"
 #include "ns3/wave-mac-helper.h"
 #include "ns3/wave-helper.h"
@@ -189,7 +188,7 @@
   Simulator::Schedule (MilliSeconds (5), &ChannelCoordinationTestCase::TestIntervalAfter, this, true, false, false);
   Simulator::Schedule (MilliSeconds (50), &ChannelCoordinationTestCase::TestIntervalAfter, this, false, true, true);
   Simulator::Schedule (MilliSeconds (51), &ChannelCoordinationTestCase::TestIntervalAfter, this, false, true, true);
-  Simulator::Schedule (MilliSeconds (53), &ChannelCoordinationTestCase:: TestIntervalAfter, this, false, true, true);
+  Simulator::Schedule (MilliSeconds (53), &ChannelCoordinationTestCase::TestIntervalAfter, this, false, true, true);
   Simulator::Schedule (MilliSeconds (54), &ChannelCoordinationTestCase::TestIntervalAfter, this, false, true, false);
   Simulator::Schedule (MilliSeconds (55), &ChannelCoordinationTestCase::TestIntervalAfter, this, false, true, false);
   Simulator::Schedule (MilliSeconds (100), &ChannelCoordinationTestCase::TestIntervalAfter, this, true, false, true);
@@ -200,7 +199,7 @@
   Simulator::Schedule (MilliSeconds (205), &ChannelCoordinationTestCase::TestIntervalAfter, this, true, false, false);
   Simulator::Schedule (MilliSeconds (250), &ChannelCoordinationTestCase::TestIntervalAfter, this, false, true, true);
   Simulator::Schedule (MilliSeconds (251), &ChannelCoordinationTestCase::TestIntervalAfter, this, false, true, true);
-  Simulator::Schedule (MilliSeconds (253), &ChannelCoordinationTestCase:: TestIntervalAfter, this, false, true, true);
+  Simulator::Schedule (MilliSeconds (253), &ChannelCoordinationTestCase::TestIntervalAfter, this, false, true, true);
   Simulator::Schedule (MilliSeconds (254), &ChannelCoordinationTestCase::TestIntervalAfter, this, false, true, false);
   Simulator::Schedule (MilliSeconds (255), &ChannelCoordinationTestCase::TestIntervalAfter, this, false, true, false);
   Simulator::Schedule (MilliSeconds (300), &ChannelCoordinationTestCase::TestIntervalAfter, this, true, false, true);
@@ -530,21 +529,67 @@
   const static uint16_t WSMP_PROT_NUMBER = 0x88DC;
   const Mac48Address dest = Mac48Address::GetBroadcast ();
   const TxInfo txInfo = TxInfo (channel);
-  Ptr<Packet> p  = Create<Packet> (100);
-  // the sequence here indicates the node id which should receive transmitted packets.
-  SeqTsHeader seqTs;
-  seqTs.SetSeq (receiverId);
-  p->AddHeader (seqTs);
+
+  uint8_t *data = new uint8_t [112];
+  data [0] = (receiverId >> 24) & 0xFF;
+  data [1] = (receiverId >> 16) & 0xFF;
+  data [2] = (receiverId >> 8) & 0xFF;
+  data [3] = (receiverId >> 0) & 0xFF;
+
+  uint64_t ts = Simulator::Now ().GetTimeStep ();
+  data [4] = (ts >> 56) & 0xFF;
+  data [5] = (ts >> 48) & 0xFF;
+  data [6] = (ts >> 40) & 0xFF;
+  data [7] = (ts >> 32) & 0xFF;
+  data [8] = (ts >> 24) & 0xFF;
+  data [9] = (ts >> 16) & 0xFF;
+  data [10] = (ts >> 8) & 0xFF;
+  data [11] = (ts >> 0) & 0xFF;
+
+  Ptr<Packet> p = Create<Packet> (data, 112);
+
   m_sender->SendX  (p, dest, WSMP_PROT_NUMBER, txInfo);
+
+  delete [] data;
 }
 
 bool
 ChannelAccessTestCase::Receive (Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address &sender)
 {
-  SeqTsHeader seqTs;
-  ConstCast<Packet> (pkt)->RemoveHeader (seqTs);
+  uint8_t *data = new uint8_t [pkt->GetSize ()];
+  pkt->CopyData(data, pkt->GetSize ());
+
+  uint32_t seq = data [0];
+  seq <<= 8;
+  seq |= data [1];
+  seq <<= 8;
+  seq |= data [2];
+  seq <<= 8;
+  seq |= data [3];
+
+  uint64_t ts = data [4];
+  ts <<= 8;
+  ts |= data [5];
+  ts <<= 8;
+  ts |= data [6];
+  ts <<= 8;
+  ts |= data [7];
+  ts <<= 8;
+  ts |= data [8];
+  ts <<= 8;
+  ts |= data [9];
+  ts <<= 8;
+  ts |= data [10];
+  ts <<= 8;
+  ts |= data [11];
+  Time sendTime = TimeStep (ts);
+
+  delete [] data;
+
+//  SeqTsHeader seqTs;
+//  ConstCast<Packet> (pkt)->RemoveHeader (seqTs);
   uint32_t curNodeId =  dev->GetNode ()->GetId ();
-  NS_TEST_EXPECT_MSG_EQ (curNodeId, seqTs.GetSeq (), "fail to assign channel access");
+  NS_TEST_EXPECT_MSG_EQ (curNodeId, seq, "fail to assign channel access");
   m_received++;
   return true;
 }
@@ -879,24 +924,63 @@
 {
   const static uint16_t WSMP_PROT_NUMBER = 0x88DC;
   const Mac48Address dest = Mac48Address::ConvertFrom (m_receiver->GetAddress ());
-//   const Mac48Address dest = Mac48Address::GetBroadcast();
 
+  uint8_t *data = new uint8_t [packetSize];
+  data [0] = (sequence >> 24) & 0xFF;
+  data [1] = (sequence >> 16) & 0xFF;
+  data [2] = (sequence >> 8) & 0xFF;
+  data [3] = (sequence >> 0) & 0xFF;
+
+  uint64_t ts = Simulator::Now ().GetTimeStep ();
+  data [4] = (ts >> 56) & 0xFF;
+  data [5] = (ts >> 48) & 0xFF;
+  data [6] = (ts >> 40) & 0xFF;
+  data [7] = (ts >> 32) & 0xFF;
+  data [8] = (ts >> 24) & 0xFF;
+  data [9] = (ts >> 16) & 0xFF;
+  data [10] = (ts >> 8) & 0xFF;
+  data [11] = (ts >> 0) & 0xFF;
+
+  Ptr<Packet> p = Create<Packet> (data, packetSize);
 
-  Ptr<Packet> p  = Create<Packet> (packetSize - (8 + 4)); // 8+4 : the size of the seqTs header
-  // the sequence here indicates whether the node id which should receive transmitted packets.
-  SeqTsHeader seqTs;
-  seqTs.SetSeq (sequence);
-  p->AddHeader (seqTs);
   m_sender->SendX  (p, dest, WSMP_PROT_NUMBER, txInfo);
+
+  delete [] data;
 }
 
 bool
 AnnexC_TestCase::Receive (Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address &sender)
 {
-  SeqTsHeader seqTs;
-  ConstCast<Packet> (pkt)->RemoveHeader (seqTs);
-  uint32_t seq = seqTs.GetSeq ();
-  Time sendTime =  seqTs.GetTs ();
+  uint8_t *data = new uint8_t [pkt->GetSize ()];
+  pkt->CopyData(data, pkt->GetSize ());
+
+  uint32_t seq = data [0];
+  seq <<= 8;
+  seq |= data [1];
+  seq <<= 8;
+  seq |= data [2];
+  seq <<= 8;
+  seq |= data [3];
+
+  uint64_t ts = data [4];
+  ts <<= 8;
+  ts |= data [5];
+  ts <<= 8;
+  ts |= data [6];
+  ts <<= 8;
+  ts |= data [7];
+  ts <<= 8;
+  ts |= data [8];
+  ts <<= 8;
+  ts |= data [9];
+  ts <<= 8;
+  ts |= data [10];
+  ts <<= 8;
+  ts |= data [11];
+  Time sendTime = TimeStep (ts);
+
+  delete [] data;
+
   Time curTime = Now ();
   Time duration = curTime - sendTime;
 
diff -Naur ns-3.23/src/wave/wscript ns-3.24/src/wave/wscript
--- ns-3.23/src/wave/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wave/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -7,7 +7,7 @@
 #     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', 'applications'])
+    module = bld.create_ns3_module('wave', ['core','wifi', 'propagation', 'internet'])
     module.source = [
         'model/wave-mac-low.cc',
         'model/ocb-wifi-mac.cc',
diff -Naur ns-3.23/src/wifi/bindings/callbacks_list.py ns-3.24/src/wifi/bindings/callbacks_list.py
--- ns-3.23/src/wifi/bindings/callbacks_list.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/bindings/callbacks_list.py	2015-09-15 11:18:44.000000000 -0700
@@ -1,6 +1,8 @@
 callback_classes = [
-    ['void', 'ns3::Ptr<ns3::Packet const>', 'double', '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', 'double', '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', 'ns3::Ptr<ns3::Packet const>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'double', 'ns3::WifiTxVector', 'ns3::WifiPreamble', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['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'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<ns3::Packet const>', 'unsigned short', 'ns3::Address const&', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur ns-3.23/src/wifi/bindings/modulegen__gcc_ILP32.py ns-3.24/src/wifi/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/wifi/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -29,11 +29,11 @@
     ## propagation-environment.h (module 'propagation'): ns3::CitySize [enumeration]
     module.add_enum('CitySize', ['SmallCity', 'MediumCity', 'LargeCity'], import_from_module='ns.propagation')
     ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_NONE'])
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT', 'WIFI_PREAMBLE_NONE'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'])
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT'])
     ## wifi-phy-standard.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_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'])
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211ac'])
     ## qos-tag.h (module 'wifi'): ns3::UserPriority [enumeration]
     module.add_enum('UserPriority', ['UP_BK', 'UP_BE', 'UP_EE', 'UP_CL', 'UP_VI', 'UP_VO', 'UP_NC'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
@@ -86,8 +86,14 @@
     module.add_class('DcfManager')
     ## dcf-manager.h (module 'wifi'): ns3::DcfState [class]
     module.add_class('DcfState', allow_subclassing=True)
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer [class]
+    module.add_class('DeviceEnergyModelContainer', import_from_module='ns.energy')
+    ## energy-model-helper.h (module 'energy'): ns3::DeviceEnergyModelHelper [class]
+    module.add_class('DeviceEnergyModelHelper', allow_subclassing=True, import_from_module='ns.energy')
     ## dsss-error-rate-model.h (module 'wifi'): ns3::DsssErrorRateModel [class]
     module.add_class('DsssErrorRateModel')
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceHelper [class]
+    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')
     ## hash.h (module 'core'): ns3::Hasher [class]
@@ -122,6 +128,8 @@
     module.add_class('MacLowTransmissionParameters')
     ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle [class]
     module.add_class('MacRxMiddle')
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle [class]
+    module.add_class('MacTxMiddle')
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
@@ -154,12 +162,14 @@
     module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
     module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters [struct]
+    module.add_class('Parameters')
     ## pcap-file.h (module 'network'): ns3::PcapFile [class]
     module.add_class('PcapFile', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## propagation-cache.h (module 'propagation'): ns3::PropagationCache<ns3::JakesProcess> [class]
@@ -178,6 +188,8 @@
     module.add_class('TagBuffer', import_from_module='ns.network')
     ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
     module.add_class('TimeWithUnit', import_from_module='ns.core')
+    ## traced-value.h (module 'core'): ns3::TracedValue<double> [class]
+    module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['double'])
     ## 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]
@@ -202,6 +214,10 @@
     module.add_class('WifiPhyHelper', allow_subclassing=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener [class]
     module.add_class('WifiPhyListener', allow_subclassing=True)
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::WifiRadioEnergyModelHelper [class]
+    module.add_class('WifiRadioEnergyModelHelper', parent=root_module['ns3::DeviceEnergyModelHelper'])
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener [class]
+    module.add_class('WifiRadioEnergyModelPhyListener', parent=root_module['ns3::WifiPhyListener'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -224,6 +240,10 @@
     module.add_class('int64x64_t', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
     module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo [struct]
+    module.add_class('mpduInfo')
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm [struct]
+    module.add_class('signalNoiseDbm')
     ## ampdu-tag.h (module 'wifi'): ns3::AmpduTag [class]
     module.add_class('AmpduTag', parent=root_module['ns3::Tag'])
     ## chunk.h (module 'network'): ns3::Chunk [class]
@@ -314,6 +334,8 @@
     module.add_class('TwoRayGroundPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
     module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## vht-wifi-mac-helper.h (module 'wifi'): ns3::VhtWifiMacHelper [class]
+    module.add_class('VhtWifiMacHelper', parent=root_module['ns3::QosWifiMacHelper'])
     ## 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]
@@ -354,6 +376,8 @@
     module.add_class('WifiPhyStateHelper', parent=root_module['ns3::Object'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
     module.add_class('WifiRemoteStationManager', parent=root_module['ns3::Object'])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel [class]
+    module.add_class('WifiTxCurrentModel', parent=root_module['ns3::Object'])
     ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy [class]
     module.add_class('YansWifiPhy', parent=root_module['ns3::WifiPhy'])
     ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable [class]
@@ -384,6 +408,10 @@
     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> >'])
+    ## 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]
+    module.add_class('BooleanValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## callback.h (module 'core'): ns3::CallbackChecker [class]
     module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## callback.h (module 'core'): ns3::CallbackImplBase [class]
@@ -410,6 +438,8 @@
     module.add_class('Dcf', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable [class]
     module.add_class('DeterministicRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel [class]
+    module.add_class('DeviceEnergyModel', import_from_module='ns.energy', parent=root_module['ns3::Object'])
     ## double.h (module 'core'): ns3::DoubleValue [class]
     module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## edca-txop-n.h (module 'wifi'): ns3::EdcaTxopN [class]
@@ -418,6 +448,16 @@
     module.add_class('EmpiricalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
     module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester [class]
+    module.add_class('EnergyHarvester', import_from_module='ns.energy', parent=root_module['ns3::Object'])
+    ## energy-source.h (module 'energy'): ns3::EnergySource [class]
+    module.add_class('EnergySource', import_from_module='ns.energy', parent=root_module['ns3::Object'])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer [class]
+    module.add_class('EnergySourceContainer', import_from_module='ns.energy', parent=root_module['ns3::Object'])
+    ## enum.h (module 'core'): ns3::EnumChecker [class]
+    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'])
     ## error-rate-model.h (module 'wifi'): ns3::ErrorRateModel [class]
@@ -444,6 +484,8 @@
     module.add_class('HtWifiMacHelper', parent=root_module['ns3::QosWifiMacHelper'])
     ## ideal-wifi-manager.h (module 'wifi'): ns3::IdealWifiManager [class]
     module.add_class('IdealWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
+    ## integer.h (module 'core'): ns3::IntegerValue [class]
+    module.add_class('IntegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
     module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
@@ -470,6 +512,8 @@
     module.add_class('JakesPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): ns3::Kun2600MhzPropagationLossModel [class]
     module.add_class('Kun2600MhzPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel [class]
+    module.add_class('LinearWifiTxCurrentModel', parent=root_module['ns3::WifiTxCurrentModel'])
     ## propagation-loss-model.h (module 'propagation'): ns3::LogDistancePropagationLossModel [class]
     module.add_class('LogDistancePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable [class]
@@ -536,6 +580,10 @@
     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'])
+    ## string.h (module 'core'): ns3::StringChecker [class]
+    module.add_class('StringChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## string.h (module 'core'): ns3::StringValue [class]
+    module.add_class('StringValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## supported-rates.h (module 'wifi'): ns3::SupportedRates [class]
     module.add_class('SupportedRates', parent=root_module['ns3::WifiInformationElement'])
     ## nstime.h (module 'core'): ns3::TimeValue [class]
@@ -554,6 +602,12 @@
     module.add_class('Vector3DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## vector.h (module 'core'): ns3::Vector3DValue [class]
     module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities [class]
+    module.add_class('VhtCapabilities', parent=root_module['ns3::WifiInformationElement'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker [class]
+    module.add_class('VhtCapabilitiesChecker', parent=root_module['ns3::AttributeChecker'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue [class]
+    module.add_class('VhtCapabilitiesValue', parent=root_module['ns3::AttributeValue'])
     ## wifi-channel.h (module 'wifi'): ns3::WifiChannel [class]
     module.add_class('WifiChannel', parent=root_module['ns3::Channel'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker [class]
@@ -562,6 +616,8 @@
     module.add_class('WifiModeValue', parent=root_module['ns3::AttributeValue'])
     ## wifi-net-device.h (module 'wifi'): ns3::WifiNetDevice [class]
     module.add_class('WifiNetDevice', parent=root_module['ns3::NetDevice'])
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel [class]
+    module.add_class('WifiRadioEnergyModel', parent=root_module['ns3::DeviceEnergyModel'])
     ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel [class]
     module.add_class('YansErrorRateModel', parent=root_module['ns3::ErrorRateModel'])
     ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel [class]
@@ -577,21 +633,14 @@
     ## dca-txop.h (module 'wifi'): ns3::DcaTxop [class]
     module.add_class('DcaTxop', parent=root_module['ns3::Dcf'])
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type=u'vector')
-    module.add_container('ns3::WifiMcsList', 'unsigned char', container_type=u'vector')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::AmpduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::AmpduSubframeHeader >', container_type=u'list')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::AmsduSubframeHeader >', container_type=u'list')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >', u'ns3::WifiMcsList')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >*', u'ns3::WifiMcsList*')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >&', u'ns3::WifiMcsList&')
     typehandlers.add_type_alias(u'std::vector< ns3::RateInfo, std::allocator< ns3::RateInfo > >', u'ns3::MinstrelRate')
     typehandlers.add_type_alias(u'std::vector< ns3::RateInfo, std::allocator< ns3::RateInfo > >*', u'ns3::MinstrelRate*')
     typehandlers.add_type_alias(u'std::vector< ns3::RateInfo, std::allocator< ns3::RateInfo > >&', u'ns3::MinstrelRate&')
     typehandlers.add_type_alias(u'uint8_t', u'ns3::WifiInformationElementId')
     typehandlers.add_type_alias(u'uint8_t*', u'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias(u'uint8_t&', u'ns3::WifiInformationElementId&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     typehandlers.add_type_alias(u'ns3::Vector3D', u'ns3::Vector')
     typehandlers.add_type_alias(u'ns3::Vector3D*', u'ns3::Vector*')
     typehandlers.add_type_alias(u'ns3::Vector3D&', u'ns3::Vector&')
@@ -610,9 +659,9 @@
     typehandlers.add_type_alias(u'ns3::Vector3DChecker*', u'ns3::VectorChecker*')
     typehandlers.add_type_alias(u'ns3::Vector3DChecker&', u'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', u'ns3::WifiMcsListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', u'ns3::WifiMcsListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', u'ns3::WifiMcsListIterator&')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -626,6 +675,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -666,6 +721,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -692,7 +778,10 @@
     register_Ns3CapabilityInformation_methods(root_module, root_module['ns3::CapabilityInformation'])
     register_Ns3DcfManager_methods(root_module, root_module['ns3::DcfManager'])
     register_Ns3DcfState_methods(root_module, root_module['ns3::DcfState'])
+    register_Ns3DeviceEnergyModelContainer_methods(root_module, root_module['ns3::DeviceEnergyModelContainer'])
+    register_Ns3DeviceEnergyModelHelper_methods(root_module, root_module['ns3::DeviceEnergyModelHelper'])
     register_Ns3DsssErrorRateModel_methods(root_module, root_module['ns3::DsssErrorRateModel'])
+    register_Ns3EnergySourceHelper_methods(root_module, root_module['ns3::EnergySourceHelper'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3InterferenceHelper_methods(root_module, root_module['ns3::InterferenceHelper'])
@@ -707,6 +796,7 @@
     register_Ns3MacLowTransmissionListener_methods(root_module, root_module['ns3::MacLowTransmissionListener'])
     register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
     register_Ns3MacRxMiddle_methods(root_module, root_module['ns3::MacRxMiddle'])
+    register_Ns3MacTxMiddle_methods(root_module, root_module['ns3::MacTxMiddle'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -720,6 +810,7 @@
     register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
     register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
     register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3Parameters_methods(root_module, root_module['ns3::Parameters'])
     register_Ns3PcapFile_methods(root_module, root_module['ns3::PcapFile'])
     register_Ns3PcapHelper_methods(root_module, root_module['ns3::PcapHelper'])
     register_Ns3PcapHelperForDevice_methods(root_module, root_module['ns3::PcapHelperForDevice'])
@@ -731,6 +822,7 @@
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
+    register_Ns3TracedValue__Double_methods(root_module, root_module['ns3::TracedValue< double >'])
     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'])
@@ -742,6 +834,8 @@
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
     register_Ns3WifiPhyHelper_methods(root_module, root_module['ns3::WifiPhyHelper'])
     register_Ns3WifiPhyListener_methods(root_module, root_module['ns3::WifiPhyListener'])
+    register_Ns3WifiRadioEnergyModelHelper_methods(root_module, root_module['ns3::WifiRadioEnergyModelHelper'])
+    register_Ns3WifiRadioEnergyModelPhyListener_methods(root_module, root_module['ns3::WifiRadioEnergyModelPhyListener'])
     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'])
@@ -750,6 +844,8 @@
     register_Ns3YansWifiPhyHelper_methods(root_module, root_module['ns3::YansWifiPhyHelper'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
+    register_Ns3MpduInfo_methods(root_module, root_module['ns3::mpduInfo'])
+    register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::signalNoiseDbm'])
     register_Ns3AmpduTag_methods(root_module, root_module['ns3::AmpduTag'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
@@ -793,6 +889,7 @@
     register_Ns3TriangularRandomVariable_methods(root_module, root_module['ns3::TriangularRandomVariable'])
     register_Ns3TwoRayGroundPropagationLossModel_methods(root_module, root_module['ns3::TwoRayGroundPropagationLossModel'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
+    register_Ns3VhtWifiMacHelper_methods(root_module, root_module['ns3::VhtWifiMacHelper'])
     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'])
@@ -805,6 +902,7 @@
     register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
     register_Ns3WifiPhyStateHelper_methods(root_module, root_module['ns3::WifiPhyStateHelper'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
+    register_Ns3WifiTxCurrentModel_methods(root_module, root_module['ns3::WifiTxCurrentModel'])
     register_Ns3YansWifiPhy_methods(root_module, root_module['ns3::YansWifiPhy'])
     register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
@@ -819,6 +917,8 @@
     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_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'])
@@ -832,10 +932,16 @@
     register_Ns3CtrlBAckResponseHeader_methods(root_module, root_module['ns3::CtrlBAckResponseHeader'])
     register_Ns3Dcf_methods(root_module, root_module['ns3::Dcf'])
     register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
+    register_Ns3DeviceEnergyModel_methods(root_module, root_module['ns3::DeviceEnergyModel'])
     register_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
     register_Ns3EdcaTxopN_methods(root_module, root_module['ns3::EdcaTxopN'])
     register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
+    register_Ns3EnergyHarvester_methods(root_module, root_module['ns3::EnergyHarvester'])
+    register_Ns3EnergySource_methods(root_module, root_module['ns3::EnergySource'])
+    register_Ns3EnergySourceContainer_methods(root_module, root_module['ns3::EnergySourceContainer'])
+    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_Ns3ErrorRateModel_methods(root_module, root_module['ns3::ErrorRateModel'])
     register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
@@ -849,6 +955,7 @@
     register_Ns3HtCapabilitiesValue_methods(root_module, root_module['ns3::HtCapabilitiesValue'])
     register_Ns3HtWifiMacHelper_methods(root_module, root_module['ns3::HtWifiMacHelper'])
     register_Ns3IdealWifiManager_methods(root_module, root_module['ns3::IdealWifiManager'])
+    register_Ns3IntegerValue_methods(root_module, root_module['ns3::IntegerValue'])
     register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
     register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
     register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
@@ -862,6 +969,7 @@
     register_Ns3JakesProcess_methods(root_module, root_module['ns3::JakesProcess'])
     register_Ns3JakesPropagationLossModel_methods(root_module, root_module['ns3::JakesPropagationLossModel'])
     register_Ns3Kun2600MhzPropagationLossModel_methods(root_module, root_module['ns3::Kun2600MhzPropagationLossModel'])
+    register_Ns3LinearWifiTxCurrentModel_methods(root_module, root_module['ns3::LinearWifiTxCurrentModel'])
     register_Ns3LogDistancePropagationLossModel_methods(root_module, root_module['ns3::LogDistancePropagationLossModel'])
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
@@ -894,6 +1002,8 @@
     register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
     register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
     register_Ns3StaWifiMac_methods(root_module, root_module['ns3::StaWifiMac'])
+    register_Ns3StringChecker_methods(root_module, root_module['ns3::StringChecker'])
+    register_Ns3StringValue_methods(root_module, root_module['ns3::StringValue'])
     register_Ns3SupportedRates_methods(root_module, root_module['ns3::SupportedRates'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
@@ -903,10 +1013,14 @@
     register_Ns3Vector2DValue_methods(root_module, root_module['ns3::Vector2DValue'])
     register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
     register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
+    register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
+    register_Ns3VhtCapabilitiesChecker_methods(root_module, root_module['ns3::VhtCapabilitiesChecker'])
+    register_Ns3VhtCapabilitiesValue_methods(root_module, root_module['ns3::VhtCapabilitiesValue'])
     register_Ns3WifiChannel_methods(root_module, root_module['ns3::WifiChannel'])
     register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
     register_Ns3WifiNetDevice_methods(root_module, root_module['ns3::WifiNetDevice'])
+    register_Ns3WifiRadioEnergyModel_methods(root_module, root_module['ns3::WifiRadioEnergyModel'])
     register_Ns3YansErrorRateModel_methods(root_module, root_module['ns3::YansErrorRateModel'])
     register_Ns3YansWifiChannel_methods(root_module, root_module['ns3::YansWifiChannel'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
@@ -1270,6 +1384,10 @@
     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', 
@@ -1473,17 +1591,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1505,11 +1623,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1519,16 +1632,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1766,14 +1869,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1834,11 +1941,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CapabilityInformation_methods(root_module, cls):
@@ -2066,6 +2168,82 @@
                    is_pure_virtual=True, visibility='private', is_virtual=True)
     return
 
+def register_Ns3DeviceEnergyModelContainer_methods(root_module, cls):
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer::DeviceEnergyModelContainer(ns3::DeviceEnergyModelContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DeviceEnergyModelContainer const &', 'arg0')])
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer::DeviceEnergyModelContainer() [constructor]
+    cls.add_constructor([])
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer::DeviceEnergyModelContainer(ns3::Ptr<ns3::DeviceEnergyModel> model) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::DeviceEnergyModel >', 'model')])
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer::DeviceEnergyModelContainer(std::string modelName) [constructor]
+    cls.add_constructor([param('std::string', 'modelName')])
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer::DeviceEnergyModelContainer(ns3::DeviceEnergyModelContainer const & a, ns3::DeviceEnergyModelContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::DeviceEnergyModelContainer const &', 'a'), param('ns3::DeviceEnergyModelContainer const &', 'b')])
+    ## device-energy-model-container.h (module 'energy'): void ns3::DeviceEnergyModelContainer::Add(ns3::DeviceEnergyModelContainer container) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::DeviceEnergyModelContainer', 'container')])
+    ## device-energy-model-container.h (module 'energy'): void ns3::DeviceEnergyModelContainer::Add(ns3::Ptr<ns3::DeviceEnergyModel> model) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::DeviceEnergyModel >', 'model')])
+    ## device-energy-model-container.h (module 'energy'): void ns3::DeviceEnergyModelContainer::Add(std::string modelName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'modelName')])
+    ## device-energy-model-container.h (module 'energy'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::DeviceEnergyModel>*,std::vector<ns3::Ptr<ns3::DeviceEnergyModel>, std::allocator<ns3::Ptr<ns3::DeviceEnergyModel> > > > ns3::DeviceEnergyModelContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::DeviceEnergyModel > const, std::vector< ns3::Ptr< ns3::DeviceEnergyModel > > >', 
+                   [], 
+                   is_const=True)
+    ## device-energy-model-container.h (module 'energy'): void ns3::DeviceEnergyModelContainer::Clear() [member function]
+    cls.add_method('Clear', 
+                   'void', 
+                   [])
+    ## device-energy-model-container.h (module 'energy'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::DeviceEnergyModel>*,std::vector<ns3::Ptr<ns3::DeviceEnergyModel>, std::allocator<ns3::Ptr<ns3::DeviceEnergyModel> > > > ns3::DeviceEnergyModelContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::DeviceEnergyModel > const, std::vector< ns3::Ptr< ns3::DeviceEnergyModel > > >', 
+                   [], 
+                   is_const=True)
+    ## device-energy-model-container.h (module 'energy'): ns3::Ptr<ns3::DeviceEnergyModel> ns3::DeviceEnergyModelContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::DeviceEnergyModel >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## device-energy-model-container.h (module 'energy'): uint32_t ns3::DeviceEnergyModelContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3DeviceEnergyModelHelper_methods(root_module, cls):
+    ## energy-model-helper.h (module 'energy'): ns3::DeviceEnergyModelHelper::DeviceEnergyModelHelper() [constructor]
+    cls.add_constructor([])
+    ## energy-model-helper.h (module 'energy'): ns3::DeviceEnergyModelHelper::DeviceEnergyModelHelper(ns3::DeviceEnergyModelHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DeviceEnergyModelHelper const &', 'arg0')])
+    ## energy-model-helper.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::DeviceEnergyModelHelper::Install(ns3::Ptr<ns3::NetDevice> device, ns3::Ptr<ns3::EnergySource> source) const [member function]
+    cls.add_method('Install', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::DeviceEnergyModelHelper::Install(ns3::NetDeviceContainer deviceContainer, ns3::EnergySourceContainer sourceContainer) const [member function]
+    cls.add_method('Install', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('ns3::NetDeviceContainer', 'deviceContainer'), param('ns3::EnergySourceContainer', 'sourceContainer')], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): void ns3::DeviceEnergyModelHelper::Set(std::string name, ns3::AttributeValue const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'v')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-model-helper.h (module 'energy'): ns3::Ptr<ns3::DeviceEnergyModel> ns3::DeviceEnergyModelHelper::DoInstall(ns3::Ptr<ns3::NetDevice> device, ns3::Ptr<ns3::EnergySource> source) const [member function]
+    cls.add_method('DoInstall', 
+                   'ns3::Ptr< ns3::DeviceEnergyModel >', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    return
+
 def register_Ns3DsssErrorRateModel_methods(root_module, cls):
     ## dsss-error-rate-model.h (module 'wifi'): ns3::DsssErrorRateModel::DsssErrorRateModel() [constructor]
     cls.add_constructor([])
@@ -2098,6 +2276,43 @@
                    is_static=True)
     return
 
+def register_Ns3EnergySourceHelper_methods(root_module, cls):
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceHelper::EnergySourceHelper() [constructor]
+    cls.add_constructor([])
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceHelper::EnergySourceHelper(ns3::EnergySourceHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnergySourceHelper const &', 'arg0')])
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceContainer ns3::EnergySourceHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
+    cls.add_method('Install', 
+                   'ns3::EnergySourceContainer', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceContainer ns3::EnergySourceHelper::Install(ns3::NodeContainer c) const [member function]
+    cls.add_method('Install', 
+                   'ns3::EnergySourceContainer', 
+                   [param('ns3::NodeContainer', 'c')], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceContainer ns3::EnergySourceHelper::Install(std::string nodeName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::EnergySourceContainer', 
+                   [param('std::string', 'nodeName')], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceContainer ns3::EnergySourceHelper::InstallAll() const [member function]
+    cls.add_method('InstallAll', 
+                   'ns3::EnergySourceContainer', 
+                   [], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): void ns3::EnergySourceHelper::Set(std::string name, ns3::AttributeValue const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'v')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-model-helper.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergySourceHelper::DoInstall(ns3::Ptr<ns3::Node> node) const [member function]
+    cls.add_method('DoInstall', 
+                   'ns3::Ptr< ns3::EnergySource >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    return
+
 def register_Ns3EventId_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('==')
@@ -2177,10 +2392,10 @@
     cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
     cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::InterferenceHelper::Event> ns3::InterferenceHelper::Add(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, ns3::Time duration, double rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::InterferenceHelper::Event> ns3::InterferenceHelper::Add(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::Time duration, double rxPower) [member function]
     cls.add_method('Add', 
                    'ns3::Ptr< ns3::InterferenceHelper::Event >', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::Time', 'duration'), param('double', 'rxPower')])
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::Time', 'duration'), param('double', 'rxPower')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePlcpHeaderSnrPer(ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
     cls.add_method('CalculatePlcpHeaderSnrPer', 
                    'ns3::InterferenceHelper::SnrPer', 
@@ -3042,6 +3257,26 @@
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::WifiMacHeader const *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     return
 
+def register_Ns3MacTxMiddle_methods(root_module, cls):
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle(ns3::MacTxMiddle const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacTxMiddle const &', 'arg0')])
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle() [constructor]
+    cls.add_constructor([])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSeqNumberByTidAndAddress(uint8_t tid, ns3::Mac48Address addr) const [member function]
+    cls.add_method('GetNextSeqNumberByTidAndAddress', 
+                   'uint16_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'addr')], 
+                   is_const=True)
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSequenceNumberfor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('GetNextSequenceNumberfor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::PeekNextSequenceNumberfor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('PeekNextSequenceNumberfor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    return
+
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -3490,13 +3725,30 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
     cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
     return
 
+def register_Ns3Parameters_methods(root_module, cls):
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::Parameters() [constructor]
+    cls.add_constructor([])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::Parameters(ns3::Parameters const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Parameters const &', 'arg0')])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::aMpdu [variable]
+    cls.add_instance_attribute('aMpdu', 'ns3::mpduInfo', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::duration [variable]
+    cls.add_instance_attribute('duration', 'ns3::Time', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::preamble [variable]
+    cls.add_instance_attribute('preamble', 'ns3::WifiPreamble', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::rxPowerDbm [variable]
+    cls.add_instance_attribute('rxPowerDbm', 'double', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::txVector [variable]
+    cls.add_instance_attribute('txVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
 def register_Ns3PcapFile_methods(root_module, cls):
     ## pcap-file.h (module 'network'): ns3::PcapFile::PcapFile() [constructor]
     cls.add_constructor([])
@@ -3508,10 +3760,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -3575,10 +3827,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3763,10 +4015,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3908,6 +4160,40 @@
     cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
     return
 
+def register_Ns3TracedValue__Double_methods(root_module, cls):
+    ## traced-value.h (module 'core'): ns3::TracedValue<double>::TracedValue() [constructor]
+    cls.add_constructor([])
+    ## traced-value.h (module 'core'): ns3::TracedValue<double>::TracedValue(ns3::TracedValue<double> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TracedValue< double > const &', 'o')])
+    ## traced-value.h (module 'core'): ns3::TracedValue<double>::TracedValue(double const & v) [constructor]
+    cls.add_constructor([param('double const &', 'v')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<double>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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<double>::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<double>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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<double>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb')])
+    ## traced-value.h (module 'core'): double ns3::TracedValue<double>::Get() const [member function]
+    cls.add_method('Get', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## traced-value.h (module 'core'): void ns3::TracedValue<double>::Set(double const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('double const &', 'v')])
+    return
+
 def register_Ns3TypeId_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
@@ -4209,24 +4495,24 @@
     cls.add_constructor([])
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
     cls.add_constructor([param('std::string', 'name')])
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate(uint8_t nss) const [member function]
     cls.add_method('GetCodeRate', 
                    'ns3::WifiCodeRate', 
-                   [], 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint16_t ns3::WifiMode::GetConstellationSize(uint8_t nss) const [member function]
     cls.add_method('GetConstellationSize', 
-                   'uint8_t', 
-                   [], 
+                   'uint16_t', 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetMcsValue() const [member function]
+    cls.add_method('GetMcsValue', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
@@ -4234,10 +4520,10 @@
                    'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [], 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -4259,10 +4545,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    cls.add_method('CreateWifiMcs', 
+                   'ns3::WifiMode', 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   is_static=True)
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
                    is_static=True)
     return
 
@@ -4325,6 +4616,90 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3WifiRadioEnergyModelHelper_methods(root_module, cls):
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper(ns3::WifiRadioEnergyModelHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRadioEnergyModelHelper const &', 'arg0')])
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): void ns3::WifiRadioEnergyModelHelper::Set(std::string name, ns3::AttributeValue const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'v')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): void ns3::WifiRadioEnergyModelHelper::SetDepletionCallback(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('SetDepletionCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): void ns3::WifiRadioEnergyModelHelper::SetRechargedCallback(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('SetRechargedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): void ns3::WifiRadioEnergyModelHelper::SetTxCurrentModel(std::string name, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetTxCurrentModel', 
+                   'void', 
+                   [param('std::string', 'name'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::Ptr<ns3::DeviceEnergyModel> ns3::WifiRadioEnergyModelHelper::DoInstall(ns3::Ptr<ns3::NetDevice> device, ns3::Ptr<ns3::EnergySource> source) const [member function]
+    cls.add_method('DoInstall', 
+                   'ns3::Ptr< ns3::DeviceEnergyModel >', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3WifiRadioEnergyModelPhyListener_methods(root_module, cls):
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener::WifiRadioEnergyModelPhyListener(ns3::WifiRadioEnergyModelPhyListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRadioEnergyModelPhyListener const &', 'arg0')])
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener::WifiRadioEnergyModelPhyListener() [constructor]
+    cls.add_constructor([])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyMaybeCcaBusyStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyMaybeCcaBusyStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxEndError() [member function]
+    cls.add_method('NotifyRxEndError', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxEndOk() [member function]
+    cls.add_method('NotifyRxEndOk', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyRxStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifySleep() [member function]
+    cls.add_method('NotifySleep', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifySwitchingStart(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyTxStart(ns3::Time duration, double txPowerDbm) [member function]
+    cls.add_method('NotifyTxStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration'), param('double', 'txPowerDbm')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyWakeup() [member function]
+    cls.add_method('NotifyWakeup', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::SetChangeStateCallback(ns3::Callback<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetChangeStateCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::SetUpdateTxCurrentCallback(ns3::Callback<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetUpdateTxCurrentCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    return
+
 def register_Ns3WifiRemoteStation_methods(root_module, cls):
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation() [constructor]
     cls.add_constructor([])
@@ -4367,6 +4742,10 @@
     cls.add_constructor([param('ns3::WifiRemoteStationState const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_address [variable]
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
+    cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
+    cls.add_instance_attribute('m_channelWidth', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_greenfield [variable]
     cls.add_instance_attribute('m_greenfield', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_info [variable]
@@ -4374,7 +4753,7 @@
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
-    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiMcsList', is_const=False)
+    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
     cls.add_instance_attribute('m_operationalRateSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_rx [variable]
@@ -4393,8 +4772,13 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## 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, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, uint32_t channelWidth, bool aggregation, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint32_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): uint32_t ns3::WifiTxVector::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -4420,6 +4804,11 @@
                    '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::IsShortGuardInterval() const [member function]
     cls.add_method('IsShortGuardInterval', 
                    'bool', 
@@ -4430,6 +4819,14 @@
                    '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::SetChannelWidth(uint32_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelWidth')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -4615,6 +5012,28 @@
     cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
 
+def register_Ns3MpduInfo_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo(ns3::mpduInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::mpduInfo const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::packetType [variable]
+    cls.add_instance_attribute('packetType', 'uint8_t', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::referenceNumber [variable]
+    cls.add_instance_attribute('referenceNumber', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3SignalNoiseDbm_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm(ns3::signalNoiseDbm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::signalNoiseDbm const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::noise [variable]
+    cls.add_instance_attribute('noise', 'double', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signal [variable]
+    cls.add_instance_attribute('signal', 'double', is_const=False)
+    return
+
 def register_Ns3AmpduTag_methods(root_module, cls):
     ## ampdu-tag.h (module 'wifi'): ns3::AmpduTag::AmpduTag(ns3::AmpduTag const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::AmpduTag const &', 'arg0')])
@@ -4960,6 +5379,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4986,6 +5410,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtAssocResponseHeader_methods(root_module, cls):
@@ -5026,6 +5454,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5048,6 +5481,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtDelBaHeader_methods(root_module, cls):
@@ -5149,6 +5586,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5171,6 +5613,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtProbeResponseHeader_methods(root_module, cls):
@@ -5222,6 +5668,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5248,6 +5699,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3NqosWifiMacHelper_methods(root_module, cls):
@@ -5376,10 +5831,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -6314,6 +6769,23 @@
                    is_virtual=True)
     return
 
+def register_Ns3VhtWifiMacHelper_methods(root_module, cls):
+    ## vht-wifi-mac-helper.h (module 'wifi'): ns3::VhtWifiMacHelper::VhtWifiMacHelper(ns3::VhtWifiMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtWifiMacHelper const &', 'arg0')])
+    ## vht-wifi-mac-helper.h (module 'wifi'): ns3::VhtWifiMacHelper::VhtWifiMacHelper() [constructor]
+    cls.add_constructor([])
+    ## vht-wifi-mac-helper.h (module 'wifi'): static ns3::StringValue ns3::VhtWifiMacHelper::DataRateForMcs(int mcs) [member function]
+    cls.add_method('DataRateForMcs', 
+                   'ns3::StringValue', 
+                   [param('int', 'mcs')], 
+                   is_static=True)
+    ## vht-wifi-mac-helper.h (module 'wifi'): static ns3::VhtWifiMacHelper ns3::VhtWifiMacHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::VhtWifiMacHelper', 
+                   [], 
+                   is_static=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', 
@@ -7158,6 +7630,10 @@
     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::SetQosNoAck() [member function]
     cls.add_method('SetQosNoAck', 
                    'void', 
@@ -7170,6 +7646,10 @@
     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::SetQosNormalAck() [member function]
     cls.add_method('SetQosNormalAck', 
                    'void', 
@@ -7343,19 +7823,19 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuration(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('CalculatePlcpDuration', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpPreambleAndHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('CalculatePlcpPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
                    [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('ConfigureStandard', 
                    'void', 
@@ -7371,11 +7851,6 @@
                    'ns3::Ptr< ns3::WifiChannel >', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint16_t', 
@@ -7386,6 +7861,11 @@
                    'ns3::Time', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -7466,328 +7946,328 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
+    cls.add_method('GetHtMcs0', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'bool', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
+    cls.add_method('GetHtMcs1', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetMFPlcpHeaderMode', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
+    cls.add_method('GetHtMcs10', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
-    cls.add_method('GetMembershipSelectorModes', 
-                   'ns3::WifiModeList', 
-                   [param('uint32_t', 'selector')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
-    cls.add_method('GetMode', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
+    cls.add_method('GetHtMcs11', 
                    'ns3::WifiMode', 
-                   [param('uint32_t', 'mode')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint32_t', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
+    cls.add_method('GetHtMcs12', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
-    cls.add_method('GetNumberOfReceiveAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
-    cls.add_method('GetNumberOfTransmitAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
-                   'ns3::WifiMode', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
+    cls.add_method('GetHtMcs13', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
+    cls.add_method('GetHtMcs14', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
+    cls.add_method('GetHtMcs15', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
+    cls.add_method('GetHtMcs16', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
+    cls.add_method('GetHtMcs17', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
+    cls.add_method('GetHtMcs18', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
+    cls.add_method('GetHtMcs19', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
+    cls.add_method('GetHtMcs2', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
+    cls.add_method('GetHtMcs20', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
+    cls.add_method('GetHtMcs21', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
+    cls.add_method('GetHtMcs22', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
+    cls.add_method('GetHtMcs23', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
+    cls.add_method('GetHtMcs24', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
+    cls.add_method('GetHtMcs25', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
+    cls.add_method('GetHtMcs26', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
+    cls.add_method('GetHtMcs27', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
+    cls.add_method('GetHtMcs28', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
+    cls.add_method('GetHtMcs29', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
+    cls.add_method('GetHtMcs3', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
+    cls.add_method('GetHtMcs30', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
+    cls.add_method('GetHtMcs31', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
+    cls.add_method('GetHtMcs4', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
+    cls.add_method('GetHtMcs5', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
+    cls.add_method('GetHtMcs6', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
+    cls.add_method('GetHtMcs7', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
+    cls.add_method('GetHtMcs8', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
+    cls.add_method('GetHtMcs9', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetHtPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [], 
+                   [param('ns3::WifiMode', 'payloadMode')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
                    'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
+                   [param('uint8_t', 'mcs')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
                    'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
+    cls.add_method('GetOfdmRate12Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
+    cls.add_method('GetOfdmRate18Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
+    cls.add_method('GetOfdmRate24Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
+    cls.add_method('GetOfdmRate36Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
+    cls.add_method('GetOfdmRate48Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
+    cls.add_method('GetOfdmRate54Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
@@ -7806,34 +8286,49 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
                    [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHtTrainingSymbolDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpPreambleDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA1Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA1Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA2Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA2Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigBDuration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
     cls.add_method('GetStateDuration', 
@@ -7860,6 +8355,61 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
+    cls.add_method('GetVhtMcs0', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
+    cls.add_method('GetVhtMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
+    cls.add_method('GetVhtMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
+    cls.add_method('GetVhtMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
+    cls.add_method('GetVhtMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
+    cls.add_method('GetVhtMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
+    cls.add_method('GetVhtMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
+    cls.add_method('GetVhtMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
+    cls.add_method('GetVhtMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
+    cls.add_method('GetVhtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetVhtPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
@@ -7900,19 +8450,14 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu, ns3::signalNoiseDbm signalNoise) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::signalNoiseDbm', 'signalNoise')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu) [member function]
     cls.add_method('NotifyMonitorSniffTx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('NotifyRxBegin', 
                    'void', 
@@ -7947,21 +8492,21 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
     cls.add_method('SendPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
                    [param('uint16_t', 'id')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
@@ -8017,11 +8562,6 @@
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
@@ -8140,10 +8680,10 @@
     cls.add_method('AddAllSupportedModes', 
                    'void', 
                    [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
+                   [param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
     cls.add_method('AddBasicMode', 
                    'void', 
@@ -8152,10 +8692,14 @@
     cls.add_method('AddStationHtCapabilities', 
                    'void', 
                    [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htcapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtcapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
     cls.add_method('AddSupportedMcs', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'mcs')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
     cls.add_method('AddSupportedMode', 
                    'void', 
@@ -8168,9 +8712,9 @@
     cls.add_method('GetAckTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
     cls.add_method('GetBasicMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint32_t', 'i')], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint32_t i) const [member function]
@@ -8194,9 +8738,9 @@
     cls.add_method('GetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
     cls.add_method('GetDefaultMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
@@ -8279,6 +8823,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::HasVhtSupported() const [member function]
+    cls.add_method('HasVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
     cls.add_method('IsAssociated', 
                    'bool', 
@@ -8398,6 +8947,10 @@
     cls.add_method('SetRtsCtsThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetupMac', 
                    'void', 
@@ -8408,11 +8961,25 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
+    cls.add_method('UpdateFragmentationThreshold', 
+                   'void', 
+                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAggregation', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetGreenfield', 
                    'bool', 
@@ -8428,9 +8995,9 @@
                    'ns3::Ptr< ns3::WifiMac >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
     cls.add_method('GetMcsSupported', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
                    is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
@@ -8488,6 +9055,11 @@
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
     cls.add_method('DoGetAckTxGuardInterval', 
                    'bool', 
@@ -8513,6 +9085,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetBlockAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetBlockAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
     cls.add_method('DoGetBlockAckTxGuardInterval', 
                    'bool', 
@@ -8538,6 +9115,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetCtsTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
     cls.add_method('DoGetCtsTxGuardInterval', 
                    'bool', 
@@ -8635,6 +9217,28 @@
                    is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
     return
 
+def register_Ns3WifiTxCurrentModel_methods(root_module, cls):
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel(ns3::WifiTxCurrentModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiTxCurrentModel const &', 'arg0')])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::WifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
+    cls.add_method('CalcTxCurrent', 
+                   'double', 
+                   [param('double', 'txPowerDbm')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-tx-current-model.h (module 'wifi'): static double ns3::WifiTxCurrentModel::DbmToW(double dbm) [member function]
+    cls.add_method('DbmToW', 
+                   'double', 
+                   [param('double', 'dbm')], 
+                   is_static=True)
+    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::WifiTxCurrentModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3YansWifiPhy_methods(root_module, cls):
     ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy(ns3::YansWifiPhy const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::YansWifiPhy const &', 'arg0')])
@@ -8670,11 +9274,6 @@
                    'ns3::Ptr< ns3::WifiChannel >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetChannelFrequencyMhz() const [member function]
     cls.add_method('GetChannelFrequencyMhz', 
                    'double', 
@@ -8690,14 +9289,19 @@
                    'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::YansWifiPhy::GetDevice() const [member function]
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::YansWifiPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::Object >', 
+                   'ns3::Ptr< ns3::NetDevice >', 
                    [], 
                    is_const=True)
     ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetEdThreshold() const [member function]
@@ -8735,9 +9339,9 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetMcs(uint8_t mcs) const [member function]
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMcs(uint8_t mcs) const [member function]
     cls.add_method('GetMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint8_t', 'mcs')], 
                    is_const=True, is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::YansWifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
@@ -8745,9 +9349,9 @@
                    'ns3::WifiModeList', 
                    [param('uint32_t', 'selector')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::YansWifiPhy::GetMobility() [member function]
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::YansWifiPhy::GetMobility() [member function]
     cls.add_method('GetMobility', 
-                   'ns3::Ptr< ns3::Object >', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
                    [])
     ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMode(uint32_t mode) const [member function]
     cls.add_method('GetMode', 
@@ -8824,10 +9428,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsMcsSupported(ns3::WifiMode mode) [member function]
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsMcsSupported(ns3::WifiMode mcs) [member function]
     cls.add_method('IsMcsSupported', 
                    'bool', 
-                   [param('ns3::WifiMode', 'mode')], 
+                   [param('ns3::WifiMode', 'mcs')], 
                    is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
@@ -8869,11 +9473,6 @@
                    'bool', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
     cls.add_method('RegisterListener', 
                    'void', 
@@ -8884,10 +9483,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
     cls.add_method('SendPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
                    is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetCcaMode1Threshold(double threshold) [member function]
     cls.add_method('SetCcaMode1Threshold', 
@@ -8897,20 +9496,20 @@
     cls.add_method('SetChannel', 
                    'void', 
                    [param('ns3::Ptr< ns3::YansWifiChannel >', 'channel')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
-                   is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelNumber(uint16_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
                    [param('uint16_t', 'id')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetDevice(ns3::Ptr<ns3::Object> device) [member function]
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Object >', 'device')])
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetEdThreshold(double threshold) [member function]
     cls.add_method('SetEdThreshold', 
                    'void', 
@@ -8939,10 +9538,10 @@
                    'void', 
                    [param('bool', 'ldpc')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetMobility(ns3::Ptr<ns3::Object> mobility) [member function]
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> mobility) [member function]
     cls.add_method('SetMobility', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Object >', 'mobility')])
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'mobility')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNTxPower(uint32_t n) [member function]
     cls.add_method('SetNTxPower', 
                    'void', 
@@ -8997,24 +9596,19 @@
     cls.add_method('SetTxPowerStart', 
                    'void', 
                    [param('double', 'start')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
     cls.add_method('StartReceivePacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePlcp(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, ns3::Time rxDuration) [member function]
-    cls.add_method('StartReceivePlcp', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePreambleAndHeader(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreambleAndHeader', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('ns3::Time', 'rxDuration')])
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Time', 'rxDuration')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
     cls.add_method('UnregisterListener', 
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -9252,6 +9846,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::GetEof() const [member function]
+    cls.add_method('GetEof', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ampdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmpduSubframeHeader::GetInstanceTypeId() const [member function]
     cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
@@ -9291,6 +9890,10 @@
     cls.add_method('SetCrc', 
                    'void', 
                    [param('uint8_t', 'crc')])
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetEof(bool eof) [member function]
+    cls.add_method('SetEof', 
+                   'void', 
+                   [param('bool', 'eof')])
     ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetLength(uint16_t length) [member function]
     cls.add_method('SetLength', 
                    'void', 
@@ -9709,13 +10312,54 @@
     ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3BooleanChecker_methods(root_module, cls):
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker(ns3::BooleanChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanChecker const &', 'arg0')])
+    return
+
+def register_Ns3BooleanValue_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(ns3::BooleanValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanValue const &', 'arg0')])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(bool value) [constructor]
+    cls.add_constructor([param('bool', 'value')])
+    ## boolean.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::BooleanValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('bool', 'value')])
     return
 
 def register_Ns3CallbackChecker_methods(root_module, cls):
@@ -9730,11 +10374,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -10346,6 +11000,53 @@
                    is_virtual=True)
     return
 
+def register_Ns3DeviceEnergyModel_methods(root_module, cls):
+    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel(ns3::DeviceEnergyModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DeviceEnergyModel const &', 'arg0')])
+    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel() [constructor]
+    cls.add_constructor([])
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::ChangeState(int newState) [member function]
+    cls.add_method('ChangeState', 
+                   'void', 
+                   [param('int', 'newState')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetCurrentA() const [member function]
+    cls.add_method('GetCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetTotalEnergyConsumption() const [member function]
+    cls.add_method('GetTotalEnergyConsumption', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): static ns3::TypeId ns3::DeviceEnergyModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyDepletion() [member function]
+    cls.add_method('HandleEnergyDepletion', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyRecharged() [member function]
+    cls.add_method('HandleEnergyRecharged', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('SetEnergySource', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::DoGetCurrentA() const [member function]
+    cls.add_method('DoGetCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
 def register_Ns3DoubleValue_methods(root_module, cls):
     ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
     cls.add_constructor([])
@@ -10719,10 +11420,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -10753,6 +11454,284 @@
                    is_const=True, visibility='private', is_virtual=True)
     return
 
+def register_Ns3EnergyHarvester_methods(root_module, cls):
+    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester(ns3::EnergyHarvester const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnergyHarvester const &', 'arg0')])
+    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester() [constructor]
+    cls.add_constructor([])
+    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergyHarvester::GetEnergySource() const [member function]
+    cls.add_method('GetEnergySource', 
+                   'ns3::Ptr< ns3::EnergySource >', 
+                   [], 
+                   is_const=True)
+    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergyHarvester::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::GetPower() const [member function]
+    cls.add_method('GetPower', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## energy-harvester.h (module 'energy'): static ns3::TypeId ns3::EnergyHarvester::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('SetEnergySource', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::DoGetPower() const [member function]
+    cls.add_method('DoGetPower', 
+                   'double', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EnergySource_methods(root_module, cls):
+    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource(ns3::EnergySource const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnergySource const &', 'arg0')])
+    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource() [constructor]
+    cls.add_constructor([])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::AppendDeviceEnergyModel(ns3::Ptr<ns3::DeviceEnergyModel> deviceEnergyModelPtr) [member function]
+    cls.add_method('AppendDeviceEnergyModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::DeviceEnergyModel >', 'deviceEnergyModelPtr')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::ConnectEnergyHarvester(ns3::Ptr<ns3::EnergyHarvester> energyHarvesterPtr) [member function]
+    cls.add_method('ConnectEnergyHarvester', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergyHarvester >', 'energyHarvesterPtr')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::DisposeDeviceModels() [member function]
+    cls.add_method('DisposeDeviceModels', 
+                   'void', 
+                   [])
+    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(ns3::TypeId tid) [member function]
+    cls.add_method('FindDeviceEnergyModels', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('ns3::TypeId', 'tid')])
+    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(std::string name) [member function]
+    cls.add_method('FindDeviceEnergyModels', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('std::string', 'name')])
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetEnergyFraction() [member function]
+    cls.add_method('GetEnergyFraction', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetInitialEnergy() const [member function]
+    cls.add_method('GetInitialEnergy', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergySource::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetRemainingEnergy() [member function]
+    cls.add_method('GetRemainingEnergy', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetSupplyVoltage() const [member function]
+    cls.add_method('GetSupplyVoltage', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): static ns3::TypeId ns3::EnergySource::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::InitializeDeviceModels() [member function]
+    cls.add_method('InitializeDeviceModels', 
+                   'void', 
+                   [])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::UpdateEnergySource() [member function]
+    cls.add_method('UpdateEnergySource', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::BreakDeviceEnergyModelRefCycle() [member function]
+    cls.add_method('BreakDeviceEnergyModelRefCycle', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::CalculateTotalCurrent() [member function]
+    cls.add_method('CalculateTotalCurrent', 
+                   'double', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyDrained() [member function]
+    cls.add_method('NotifyEnergyDrained', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyRecharged() [member function]
+    cls.add_method('NotifyEnergyRecharged', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EnergySourceContainer_methods(root_module, cls):
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'arg0')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer() [constructor]
+    cls.add_constructor([])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::Ptr<ns3::EnergySource> source) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(std::string sourceName) [constructor]
+    cls.add_constructor([param('std::string', 'sourceName')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & a, ns3::EnergySourceContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'a'), param('ns3::EnergySourceContainer const &', 'b')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::EnergySourceContainer container) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::EnergySourceContainer', 'container')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(std::string sourceName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'sourceName')])
+    ## energy-source-container.h (module 'energy'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::EnergySource>*,std::vector<ns3::Ptr<ns3::EnergySource>, std::allocator<ns3::Ptr<ns3::EnergySource> > > > ns3::EnergySourceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::EnergySource > const, std::vector< ns3::Ptr< ns3::EnergySource > > >', 
+                   [], 
+                   is_const=True)
+    ## energy-source-container.h (module 'energy'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::EnergySource>*,std::vector<ns3::Ptr<ns3::EnergySource>, std::allocator<ns3::Ptr<ns3::EnergySource> > > > ns3::EnergySourceContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::EnergySource > const, std::vector< ns3::Ptr< ns3::EnergySource > > >', 
+                   [], 
+                   is_const=True)
+    ## energy-source-container.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergySourceContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::EnergySource >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## energy-source-container.h (module 'energy'): uint32_t ns3::EnergySourceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## energy-source-container.h (module 'energy'): static ns3::TypeId ns3::EnergySourceContainer::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EnumChecker_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker(ns3::EnumChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumChecker const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): void ns3::EnumChecker::Add(int value, std::string name) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): void ns3::EnumChecker::AddDefault(int value, std::string name) [member function]
+    cls.add_method('AddDefault', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Copy(ns3::AttributeValue const & src, ns3::AttributeValue & dst) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'src'), param('ns3::AttributeValue &', 'dst')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3EnumValue_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(ns3::EnumValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumValue const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(int value) [constructor]
+    cls.add_constructor([param('int', 'value')])
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## enum.h (module 'core'): int ns3::EnumValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int', 
+                   [], 
+                   is_const=True)
+    ## enum.h (module 'core'): std::string ns3::EnumValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): void ns3::EnumValue::Set(int value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [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', 
@@ -10801,10 +11780,10 @@
                    'double', 
                    [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
                    is_const=True)
-    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, double snr, uint32_t nbits) const [member function]
+    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint32_t nbits) const [member function]
     cls.add_method('GetChunkSuccessRate', 
                    'double', 
-                   [param('ns3::WifiMode', 'mode'), param('double', 'snr'), param('uint32_t', 'nbits')], 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint32_t', 'nbits')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
     ## error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::ErrorRateModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -11048,6 +12027,16 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
+    cls.add_method('GetAntennaSelectionCapabilities', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
+    cls.add_method('GetExtendedHtCapabilities', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
     cls.add_method('GetGreenfield', 
                    'uint8_t', 
@@ -11063,11 +12052,31 @@
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLSigProtectionSupport() const [member function]
+    cls.add_method('GetLSigProtectionSupport', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
     cls.add_method('GetLdpc', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
+    cls.add_method('GetMaxAmsduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetRxHighestSupportedDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t * ns3::HtCapabilities::GetRxMcsBitmask() [member function]
     cls.add_method('GetRxMcsBitmask', 
                    'uint8_t *', 
@@ -11082,6 +12091,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval40() const [member function]
+    cls.add_method('GetShortGuardInterval40', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
     cls.add_method('GetSupportedChannelWidth', 
                    'uint8_t', 
@@ -11097,6 +12111,21 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
+    cls.add_method('GetTxBfCapabilities', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMaxNSpatialStreams() const [member function]
+    cls.add_method('GetTxMaxNSpatialStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMcsSetDefined() const [member function]
+    cls.add_method('GetTxMcsSetDefined', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) [member function]
     cls.add_method('IsSupportedMcs', 
                    'bool', 
@@ -11115,6 +12144,14 @@
     cls.add_method('SetAmpduParameters', 
                    'void', 
                    [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
+    cls.add_method('SetAntennaSelectionCapabilities', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
+    cls.add_method('SetExtendedHtCapabilities', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
     cls.add_method('SetGreenfield', 
                    'void', 
@@ -11127,10 +12164,26 @@
     cls.add_method('SetHtSupported', 
                    'void', 
                    [param('uint8_t', 'htsupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lsigprotection) [member function]
+    cls.add_method('SetLSigProtectionSupport', 
+                   'void', 
+                   [param('uint8_t', 'lsigprotection')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint8_t maxampdulength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxampdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint8_t maxamsdulength) [member function]
+    cls.add_method('SetMaxAmsduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxamsdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxsupportedrate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxsupportedrate')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
     cls.add_method('SetRxMcsBitmask', 
                    'void', 
@@ -11139,6 +12192,10 @@
     cls.add_method('SetShortGuardInterval20', 
                    'void', 
                    [param('uint8_t', 'shortguardinterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardInterval40', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedchannelwidth) [member function]
     cls.add_method('SetSupportedChannelWidth', 
                    'void', 
@@ -11147,6 +12204,18 @@
     cls.add_method('SetSupportedMcsSet', 
                    'void', 
                    [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
+    cls.add_method('SetTxBfCapabilities', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxtxspatialstreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxtxspatialstreams')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txmcssetdefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txmcssetdefined')])
     return
 
 def register_Ns3HtCapabilitiesChecker_methods(root_module, cls):
@@ -11194,6 +12263,11 @@
     cls.add_constructor([param('ns3::HtWifiMacHelper const &', 'arg0')])
     ## ht-wifi-mac-helper.h (module 'wifi'): ns3::HtWifiMacHelper::HtWifiMacHelper() [constructor]
     cls.add_constructor([])
+    ## ht-wifi-mac-helper.h (module 'wifi'): static ns3::StringValue ns3::HtWifiMacHelper::DataRateForMcs(int mcs) [member function]
+    cls.add_method('DataRateForMcs', 
+                   'ns3::StringValue', 
+                   [param('int', 'mcs')], 
+                   is_static=True)
     ## ht-wifi-mac-helper.h (module 'wifi'): static ns3::HtWifiMacHelper ns3::HtWifiMacHelper::Default() [member function]
     cls.add_method('Default', 
                    'ns3::HtWifiMacHelper', 
@@ -11270,7 +12344,40 @@
     cls.add_method('IsLowLatency', 
                    'bool', 
                    [], 
-                   is_const=True, visibility='private', is_virtual=True)
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3IntegerValue_methods(root_module, cls):
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue() [constructor]
+    cls.add_constructor([])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(ns3::IntegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::IntegerValue const &', 'arg0')])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(int64_t const & value) [constructor]
+    cls.add_constructor([param('int64_t const &', 'value')])
+    ## integer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::IntegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): bool ns3::IntegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## integer.h (module 'core'): int64_t ns3::IntegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## integer.h (module 'core'): std::string ns3::IntegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): void ns3::IntegerValue::Set(int64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int64_t const &', 'value')])
     return
 
 def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
@@ -11567,6 +12674,50 @@
                    visibility='private', is_virtual=True)
     return
 
+def register_Ns3LinearWifiTxCurrentModel_methods(root_module, cls):
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel(ns3::LinearWifiTxCurrentModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LinearWifiTxCurrentModel const &', 'arg0')])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
+    cls.add_method('CalcTxCurrent', 
+                   'double', 
+                   [param('double', 'txPowerDbm')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::GetEta() const [member function]
+    cls.add_method('GetEta', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::GetIdleCurrent() const [member function]
+    cls.add_method('GetIdleCurrent', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::LinearWifiTxCurrentModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::GetVoltage() const [member function]
+    cls.add_method('GetVoltage', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-current-model.h (module 'wifi'): void ns3::LinearWifiTxCurrentModel::SetEta(double eta) [member function]
+    cls.add_method('SetEta', 
+                   'void', 
+                   [param('double', 'eta')])
+    ## wifi-tx-current-model.h (module 'wifi'): void ns3::LinearWifiTxCurrentModel::SetIdleCurrent(double idleCurrent) [member function]
+    cls.add_method('SetIdleCurrent', 
+                   'void', 
+                   [param('double', 'idleCurrent')])
+    ## wifi-tx-current-model.h (module 'wifi'): void ns3::LinearWifiTxCurrentModel::SetVoltage(double voltage) [member function]
+    cls.add_method('SetVoltage', 
+                   'void', 
+                   [param('double', 'voltage')])
+    return
+
 def register_Ns3LogDistancePropagationLossModel_methods(root_module, cls):
     ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::LogDistancePropagationLossModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -11743,6 +12894,10 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MpduAggregator> ns3::MacLow::GetMpduAggregator() [member function]
+    cls.add_method('GetMpduAggregator', 
+                   'ns3::Ptr< ns3::MpduAggregator >', 
+                   [])
     ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::MacLow::GetPhy() const [member function]
     cls.add_method('GetPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
@@ -11768,6 +12923,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## mac-low.h (module 'wifi'): static ns3::TypeId ns3::MacLow::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
     cls.add_method('IsPromisc', 
                    'bool', 
@@ -11920,6 +13080,11 @@
     cls.add_constructor([])
     ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtBeaconHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     return
 
 def register_Ns3MinstrelWifiManager_methods(root_module, cls):
@@ -12073,16 +13238,21 @@
     cls.add_constructor([])
     ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator(ns3::MpduAggregator const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MpduAggregator const &', 'arg0')])
-    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last) [member function]
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last, bool vhtSingleMpdu) [member function]
     cls.add_method('AddHeaderAndPad', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last'), param('bool', 'vhtSingleMpdu')], 
                    is_pure_virtual=True, is_virtual=True)
     ## mpdu-aggregator.h (module 'wifi'): bool ns3::MpduAggregator::Aggregate(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
     cls.add_method('Aggregate', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AggregateVhtSingleMpdu(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
+    cls.add_method('AggregateVhtSingleMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## mpdu-aggregator.h (module 'wifi'): uint32_t ns3::MpduAggregator::CalculatePadding(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('CalculatePadding', 
                    'uint32_t', 
@@ -12110,16 +13280,21 @@
     cls.add_constructor([param('ns3::MpduStandardAggregator const &', 'arg0')])
     ## mpdu-standard-aggregator.h (module 'wifi'): ns3::MpduStandardAggregator::MpduStandardAggregator() [constructor]
     cls.add_constructor([])
-    ## mpdu-standard-aggregator.h (module 'wifi'): void ns3::MpduStandardAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last) [member function]
+    ## mpdu-standard-aggregator.h (module 'wifi'): void ns3::MpduStandardAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last, bool vhtSingleMpdu) [member function]
     cls.add_method('AddHeaderAndPad', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last'), param('bool', 'vhtSingleMpdu')], 
                    is_virtual=True)
     ## mpdu-standard-aggregator.h (module 'wifi'): bool ns3::MpduStandardAggregator::Aggregate(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
     cls.add_method('Aggregate', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
                    is_virtual=True)
+    ## mpdu-standard-aggregator.h (module 'wifi'): void ns3::MpduStandardAggregator::AggregateVhtSingleMpdu(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
+    cls.add_method('AggregateVhtSingleMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
+                   is_virtual=True)
     ## mpdu-standard-aggregator.h (module 'wifi'): uint32_t ns3::MpduStandardAggregator::CalculatePadding(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('CalculatePadding', 
                    'uint32_t', 
@@ -12316,10 +13491,10 @@
     cls.add_constructor([param('ns3::NistErrorRateModel const &', 'arg0')])
     ## nist-error-rate-model.h (module 'wifi'): ns3::NistErrorRateModel::NistErrorRateModel() [constructor]
     cls.add_constructor([])
-    ## nist-error-rate-model.h (module 'wifi'): double ns3::NistErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, double snr, uint32_t nbits) const [member function]
+    ## nist-error-rate-model.h (module 'wifi'): double ns3::NistErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint32_t nbits) const [member function]
     cls.add_method('GetChunkSuccessRate', 
                    'double', 
-                   [param('ns3::WifiMode', 'mode'), param('double', 'snr'), param('uint32_t', 'nbits')], 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint32_t', 'nbits')], 
                    is_const=True, is_virtual=True)
     ## nist-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::NistErrorRateModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -13237,6 +14412,16 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
     return
 
 def register_Ns3RraaWifiManager_methods(root_module, cls):
@@ -13434,6 +14619,46 @@
                    visibility='private', is_virtual=True)
     return
 
+def register_Ns3StringChecker_methods(root_module, cls):
+    ## string.h (module 'core'): ns3::StringChecker::StringChecker() [constructor]
+    cls.add_constructor([])
+    ## string.h (module 'core'): ns3::StringChecker::StringChecker(ns3::StringChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::StringChecker const &', 'arg0')])
+    return
+
+def register_Ns3StringValue_methods(root_module, cls):
+    ## string.h (module 'core'): ns3::StringValue::StringValue() [constructor]
+    cls.add_constructor([])
+    ## string.h (module 'core'): ns3::StringValue::StringValue(ns3::StringValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::StringValue const &', 'arg0')])
+    ## string.h (module 'core'): ns3::StringValue::StringValue(std::string const & value) [constructor]
+    cls.add_constructor([param('std::string const &', 'value')])
+    ## string.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::StringValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## string.h (module 'core'): bool ns3::StringValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## string.h (module 'core'): std::string ns3::StringValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## string.h (module 'core'): std::string ns3::StringValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## string.h (module 'core'): void ns3::StringValue::Set(std::string const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string const &', 'value')])
+    return
+
 def register_Ns3SupportedRates_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates() [constructor]
@@ -13680,6 +14905,237 @@
                    [param('ns3::Vector3D const &', 'value')])
     return
 
+def register_Ns3VhtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::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)
+    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxAmpduLengthExponent() const [member function]
+    cls.add_method('GetMaxAmpduLengthExponent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
+    cls.add_method('GetMaxMpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
+    cls.add_method('GetRxLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxMcsMap() const [member function]
+    cls.add_method('GetRxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
+    cls.add_method('GetRxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor160Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor160Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor80Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor80Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
+    cls.add_method('GetSupportedMcsAndNssSet', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetTxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxMcsMap() const [member function]
+    cls.add_method('GetTxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
+    cls.add_method('GetTxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
+    cls.add_method('GetVhtCapabilitiesInfo', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t Nss) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'Nss')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLengthExponent(uint8_t exponent) [member function]
+    cls.add_method('SetMaxAmpduLengthExponent', 
+                   'void', 
+                   [param('uint8_t', 'exponent')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint8_t length) [member function]
+    cls.add_method('SetMaxMpduLength', 
+                   'void', 
+                   [param('uint8_t', 'length')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetRxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxldpc) [member function]
+    cls.add_method('SetRxLdpc', 
+                   'void', 
+                   [param('uint8_t', 'rxldpc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxstbc) [member function]
+    cls.add_method('SetRxStbc', 
+                   'void', 
+                   [param('uint8_t', 'rxstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor160Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor80Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelwidthset) [member function]
+    cls.add_method('SetSupportedChannelWidthSet', 
+                   'void', 
+                   [param('uint8_t', 'channelwidthset')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNssSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetTxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txstbc) [member function]
+    cls.add_method('SetTxStbc', 
+                   'void', 
+                   [param('uint8_t', 'txstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
+    cls.add_method('SetVhtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtsupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtsupported')])
+    return
+
+def register_Ns3VhtCapabilitiesChecker_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker(ns3::VhtCapabilitiesChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesChecker const &', 'arg0')])
+    return
+
+def register_Ns3VhtCapabilitiesValue_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilitiesValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesValue const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilities const & value) [constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'value')])
+    ## vht-capabilities.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::VhtCapabilitiesValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilitiesValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities ns3::VhtCapabilitiesValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): std::string ns3::VhtCapabilitiesValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilitiesValue::Set(ns3::VhtCapabilities const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::VhtCapabilities const &', 'value')])
+    return
+
 def register_Ns3WifiChannel_methods(root_module, cls):
     ## wifi-channel.h (module 'wifi'): ns3::WifiChannel::WifiChannel() [constructor]
     cls.add_constructor([])
@@ -13906,15 +15362,141 @@
                    visibility='protected')
     return
 
+def register_Ns3WifiRadioEnergyModel_methods(root_module, cls):
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel(ns3::WifiRadioEnergyModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRadioEnergyModel const &', 'arg0')])
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::ChangeState(int newState) [member function]
+    cls.add_method('ChangeState', 
+                   'void', 
+                   [param('int', 'newState')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetCcaBusyCurrentA() const [member function]
+    cls.add_method('GetCcaBusyCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiPhy::State ns3::WifiRadioEnergyModel::GetCurrentState() const [member function]
+    cls.add_method('GetCurrentState', 
+                   'ns3::WifiPhy::State', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetIdleCurrentA() const [member function]
+    cls.add_method('GetIdleCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener * ns3::WifiRadioEnergyModel::GetPhyListener() [member function]
+    cls.add_method('GetPhyListener', 
+                   'ns3::WifiRadioEnergyModelPhyListener *', 
+                   [])
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetRxCurrentA() const [member function]
+    cls.add_method('GetRxCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSleepCurrentA() const [member function]
+    cls.add_method('GetSleepCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSwitchingCurrentA() const [member function]
+    cls.add_method('GetSwitchingCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTotalEnergyConsumption() const [member function]
+    cls.add_method('GetTotalEnergyConsumption', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTxCurrentA() const [member function]
+    cls.add_method('GetTxCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): static ns3::TypeId ns3::WifiRadioEnergyModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyDepletion() [member function]
+    cls.add_method('HandleEnergyDepletion', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyRecharged() [member function]
+    cls.add_method('HandleEnergyRecharged', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetCcaBusyCurrentA(double ccaBusyCurrentA) [member function]
+    cls.add_method('SetCcaBusyCurrentA', 
+                   'void', 
+                   [param('double', 'ccaBusyCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyDepletionCallback(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('SetEnergyDepletionCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyRechargedCallback(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('SetEnergyRechargedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('SetEnergySource', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetIdleCurrentA(double idleCurrentA) [member function]
+    cls.add_method('SetIdleCurrentA', 
+                   'void', 
+                   [param('double', 'idleCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetRxCurrentA(double rxCurrentA) [member function]
+    cls.add_method('SetRxCurrentA', 
+                   'void', 
+                   [param('double', 'rxCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSleepCurrentA(double sleepCurrentA) [member function]
+    cls.add_method('SetSleepCurrentA', 
+                   'void', 
+                   [param('double', 'sleepCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSwitchingCurrentA(double switchingCurrentA) [member function]
+    cls.add_method('SetSwitchingCurrentA', 
+                   'void', 
+                   [param('double', 'switchingCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentA(double txCurrentA) [member function]
+    cls.add_method('SetTxCurrentA', 
+                   'void', 
+                   [param('double', 'txCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentFromModel(double txPowerDbm) [member function]
+    cls.add_method('SetTxCurrentFromModel', 
+                   'void', 
+                   [param('double', 'txPowerDbm')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentModel(ns3::Ptr<ns3::WifiTxCurrentModel> model) [member function]
+    cls.add_method('SetTxCurrentModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiTxCurrentModel >', 'model')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::DoGetCurrentA() const [member function]
+    cls.add_method('DoGetCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
 def register_Ns3YansErrorRateModel_methods(root_module, cls):
     ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel(ns3::YansErrorRateModel const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::YansErrorRateModel const &', 'arg0')])
     ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel() [constructor]
     cls.add_constructor([])
-    ## yans-error-rate-model.h (module 'wifi'): double ns3::YansErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, double snr, uint32_t nbits) const [member function]
+    ## yans-error-rate-model.h (module 'wifi'): double ns3::YansErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint32_t nbits) const [member function]
     cls.add_method('GetChunkSuccessRate', 
                    'double', 
-                   [param('ns3::WifiMode', 'mode'), param('double', 'snr'), param('uint32_t', 'nbits')], 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint32_t', 'nbits')], 
                    is_const=True, is_virtual=True)
     ## yans-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::YansErrorRateModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -13951,10 +15533,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, ns3::Time duration) const [member function]
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Time duration) const [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('ns3::Time', 'duration')], 
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Time', 'duration')], 
                    is_const=True)
     ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
@@ -14325,6 +15907,10 @@
     module.add_function('MakeSsidChecker', 
                         'ns3::Ptr< ns3::AttributeChecker const >', 
                         [])
+    ## vht-capabilities.h (module 'wifi'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::MakeVhtCapabilitiesChecker() [free function]
+    module.add_function('MakeVhtCapabilitiesChecker', 
+                        'ns3::Ptr< ns3::AttributeChecker const >', 
+                        [])
     ## wifi-mode.h (module 'wifi'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::MakeWifiModeChecker() [free function]
     module.add_function('MakeWifiModeChecker', 
                         'ns3::Ptr< ns3::AttributeChecker const >', 
@@ -14347,6 +15933,7 @@
                         [param('uint8_t', 'tid')])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -14360,6 +15947,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/wifi/bindings/modulegen__gcc_LP64.py ns-3.24/src/wifi/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/wifi/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -29,11 +29,11 @@
     ## propagation-environment.h (module 'propagation'): ns3::CitySize [enumeration]
     module.add_enum('CitySize', ['SmallCity', 'MediumCity', 'LargeCity'], import_from_module='ns.propagation')
     ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_NONE'])
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT', 'WIFI_PREAMBLE_NONE'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'])
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT'])
     ## wifi-phy-standard.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_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'])
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211ac'])
     ## qos-tag.h (module 'wifi'): ns3::UserPriority [enumeration]
     module.add_enum('UserPriority', ['UP_BK', 'UP_BE', 'UP_EE', 'UP_CL', 'UP_VI', 'UP_VO', 'UP_NC'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
@@ -86,8 +86,14 @@
     module.add_class('DcfManager')
     ## dcf-manager.h (module 'wifi'): ns3::DcfState [class]
     module.add_class('DcfState', allow_subclassing=True)
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer [class]
+    module.add_class('DeviceEnergyModelContainer', import_from_module='ns.energy')
+    ## energy-model-helper.h (module 'energy'): ns3::DeviceEnergyModelHelper [class]
+    module.add_class('DeviceEnergyModelHelper', allow_subclassing=True, import_from_module='ns.energy')
     ## dsss-error-rate-model.h (module 'wifi'): ns3::DsssErrorRateModel [class]
     module.add_class('DsssErrorRateModel')
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceHelper [class]
+    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')
     ## hash.h (module 'core'): ns3::Hasher [class]
@@ -122,6 +128,8 @@
     module.add_class('MacLowTransmissionParameters')
     ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle [class]
     module.add_class('MacRxMiddle')
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle [class]
+    module.add_class('MacTxMiddle')
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
@@ -154,12 +162,14 @@
     module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
     module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters [struct]
+    module.add_class('Parameters')
     ## pcap-file.h (module 'network'): ns3::PcapFile [class]
     module.add_class('PcapFile', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## propagation-cache.h (module 'propagation'): ns3::PropagationCache<ns3::JakesProcess> [class]
@@ -178,6 +188,8 @@
     module.add_class('TagBuffer', import_from_module='ns.network')
     ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
     module.add_class('TimeWithUnit', import_from_module='ns.core')
+    ## traced-value.h (module 'core'): ns3::TracedValue<double> [class]
+    module.add_class('TracedValue', import_from_module='ns.core', template_parameters=['double'])
     ## 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]
@@ -202,6 +214,10 @@
     module.add_class('WifiPhyHelper', allow_subclassing=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener [class]
     module.add_class('WifiPhyListener', allow_subclassing=True)
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::WifiRadioEnergyModelHelper [class]
+    module.add_class('WifiRadioEnergyModelHelper', parent=root_module['ns3::DeviceEnergyModelHelper'])
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener [class]
+    module.add_class('WifiRadioEnergyModelPhyListener', parent=root_module['ns3::WifiPhyListener'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -224,6 +240,10 @@
     module.add_class('int64x64_t', import_from_module='ns.core')
     ## int64x64-double.h (module 'core'): ns3::int64x64_t::impl_type [enumeration]
     module.add_enum('impl_type', ['int128_impl', 'cairo_impl', 'ld_impl'], outer_class=root_module['ns3::int64x64_t'], import_from_module='ns.core')
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo [struct]
+    module.add_class('mpduInfo')
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm [struct]
+    module.add_class('signalNoiseDbm')
     ## ampdu-tag.h (module 'wifi'): ns3::AmpduTag [class]
     module.add_class('AmpduTag', parent=root_module['ns3::Tag'])
     ## chunk.h (module 'network'): ns3::Chunk [class]
@@ -314,6 +334,8 @@
     module.add_class('TwoRayGroundPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
     module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## vht-wifi-mac-helper.h (module 'wifi'): ns3::VhtWifiMacHelper [class]
+    module.add_class('VhtWifiMacHelper', parent=root_module['ns3::QosWifiMacHelper'])
     ## 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]
@@ -354,6 +376,8 @@
     module.add_class('WifiPhyStateHelper', parent=root_module['ns3::Object'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
     module.add_class('WifiRemoteStationManager', parent=root_module['ns3::Object'])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel [class]
+    module.add_class('WifiTxCurrentModel', parent=root_module['ns3::Object'])
     ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy [class]
     module.add_class('YansWifiPhy', parent=root_module['ns3::WifiPhy'])
     ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable [class]
@@ -384,6 +408,10 @@
     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> >'])
+    ## 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]
+    module.add_class('BooleanValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## callback.h (module 'core'): ns3::CallbackChecker [class]
     module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## callback.h (module 'core'): ns3::CallbackImplBase [class]
@@ -410,6 +438,8 @@
     module.add_class('Dcf', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable [class]
     module.add_class('DeterministicRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel [class]
+    module.add_class('DeviceEnergyModel', import_from_module='ns.energy', parent=root_module['ns3::Object'])
     ## double.h (module 'core'): ns3::DoubleValue [class]
     module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## edca-txop-n.h (module 'wifi'): ns3::EdcaTxopN [class]
@@ -418,6 +448,16 @@
     module.add_class('EmpiricalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
     module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester [class]
+    module.add_class('EnergyHarvester', import_from_module='ns.energy', parent=root_module['ns3::Object'])
+    ## energy-source.h (module 'energy'): ns3::EnergySource [class]
+    module.add_class('EnergySource', import_from_module='ns.energy', parent=root_module['ns3::Object'])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer [class]
+    module.add_class('EnergySourceContainer', import_from_module='ns.energy', parent=root_module['ns3::Object'])
+    ## enum.h (module 'core'): ns3::EnumChecker [class]
+    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'])
     ## error-rate-model.h (module 'wifi'): ns3::ErrorRateModel [class]
@@ -444,6 +484,8 @@
     module.add_class('HtWifiMacHelper', parent=root_module['ns3::QosWifiMacHelper'])
     ## ideal-wifi-manager.h (module 'wifi'): ns3::IdealWifiManager [class]
     module.add_class('IdealWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
+    ## integer.h (module 'core'): ns3::IntegerValue [class]
+    module.add_class('IntegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
     module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
@@ -470,6 +512,8 @@
     module.add_class('JakesPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): ns3::Kun2600MhzPropagationLossModel [class]
     module.add_class('Kun2600MhzPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel [class]
+    module.add_class('LinearWifiTxCurrentModel', parent=root_module['ns3::WifiTxCurrentModel'])
     ## propagation-loss-model.h (module 'propagation'): ns3::LogDistancePropagationLossModel [class]
     module.add_class('LogDistancePropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable [class]
@@ -536,6 +580,10 @@
     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'])
+    ## string.h (module 'core'): ns3::StringChecker [class]
+    module.add_class('StringChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## string.h (module 'core'): ns3::StringValue [class]
+    module.add_class('StringValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## supported-rates.h (module 'wifi'): ns3::SupportedRates [class]
     module.add_class('SupportedRates', parent=root_module['ns3::WifiInformationElement'])
     ## nstime.h (module 'core'): ns3::TimeValue [class]
@@ -554,6 +602,12 @@
     module.add_class('Vector3DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## vector.h (module 'core'): ns3::Vector3DValue [class]
     module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities [class]
+    module.add_class('VhtCapabilities', parent=root_module['ns3::WifiInformationElement'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker [class]
+    module.add_class('VhtCapabilitiesChecker', parent=root_module['ns3::AttributeChecker'])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue [class]
+    module.add_class('VhtCapabilitiesValue', parent=root_module['ns3::AttributeValue'])
     ## wifi-channel.h (module 'wifi'): ns3::WifiChannel [class]
     module.add_class('WifiChannel', parent=root_module['ns3::Channel'])
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker [class]
@@ -562,6 +616,8 @@
     module.add_class('WifiModeValue', parent=root_module['ns3::AttributeValue'])
     ## wifi-net-device.h (module 'wifi'): ns3::WifiNetDevice [class]
     module.add_class('WifiNetDevice', parent=root_module['ns3::NetDevice'])
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel [class]
+    module.add_class('WifiRadioEnergyModel', parent=root_module['ns3::DeviceEnergyModel'])
     ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel [class]
     module.add_class('YansErrorRateModel', parent=root_module['ns3::ErrorRateModel'])
     ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel [class]
@@ -577,21 +633,14 @@
     ## dca-txop.h (module 'wifi'): ns3::DcaTxop [class]
     module.add_class('DcaTxop', parent=root_module['ns3::Dcf'])
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type=u'vector')
-    module.add_container('ns3::WifiMcsList', 'unsigned char', container_type=u'vector')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::AmpduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::AmpduSubframeHeader >', container_type=u'list')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::AmsduSubframeHeader >', container_type=u'list')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >', u'ns3::WifiMcsList')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >*', u'ns3::WifiMcsList*')
-    typehandlers.add_type_alias(u'std::vector< unsigned char, std::allocator< unsigned char > >&', u'ns3::WifiMcsList&')
     typehandlers.add_type_alias(u'std::vector< ns3::RateInfo, std::allocator< ns3::RateInfo > >', u'ns3::MinstrelRate')
     typehandlers.add_type_alias(u'std::vector< ns3::RateInfo, std::allocator< ns3::RateInfo > >*', u'ns3::MinstrelRate*')
     typehandlers.add_type_alias(u'std::vector< ns3::RateInfo, std::allocator< ns3::RateInfo > >&', u'ns3::MinstrelRate&')
     typehandlers.add_type_alias(u'uint8_t', u'ns3::WifiInformationElementId')
     typehandlers.add_type_alias(u'uint8_t*', u'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias(u'uint8_t&', u'ns3::WifiInformationElementId&')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     typehandlers.add_type_alias(u'ns3::Vector3D', u'ns3::Vector')
     typehandlers.add_type_alias(u'ns3::Vector3D*', u'ns3::Vector*')
     typehandlers.add_type_alias(u'ns3::Vector3D&', u'ns3::Vector&')
@@ -610,9 +659,9 @@
     typehandlers.add_type_alias(u'ns3::Vector3DChecker*', u'ns3::VectorChecker*')
     typehandlers.add_type_alias(u'ns3::Vector3DChecker&', u'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', u'ns3::WifiMcsListIterator')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', u'ns3::WifiMcsListIterator*')
-    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', u'ns3::WifiMcsListIterator&')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', u'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', u'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias(u'__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', u'ns3::WifiModeListIterator&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -626,6 +675,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -666,6 +721,37 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *', u'ns3::TracedValueCallback::Double')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) **', u'ns3::TracedValueCallback::Double*')
+    typehandlers.add_type_alias(u'void ( * ) ( double, double ) *&', u'ns3::TracedValueCallback::Double&')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *', u'ns3::TracedValueCallback::Int8')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) **', u'ns3::TracedValueCallback::Int8*')
+    typehandlers.add_type_alias(u'void ( * ) ( int8_t, int8_t ) *&', u'ns3::TracedValueCallback::Int8&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *', u'ns3::TracedValueCallback::Uint8')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) **', u'ns3::TracedValueCallback::Uint8*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint8_t, uint8_t ) *&', u'ns3::TracedValueCallback::Uint8&')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *', u'ns3::TracedValueCallback::Int32')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) **', u'ns3::TracedValueCallback::Int32*')
+    typehandlers.add_type_alias(u'void ( * ) ( int32_t, int32_t ) *&', u'ns3::TracedValueCallback::Int32&')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *', u'ns3::TracedValueCallback::Bool')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) **', u'ns3::TracedValueCallback::Bool*')
+    typehandlers.add_type_alias(u'void ( * ) ( bool, bool ) *&', u'ns3::TracedValueCallback::Bool&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *', u'ns3::TracedValueCallback::Uint16')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) **', u'ns3::TracedValueCallback::Uint16*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint16_t, uint16_t ) *&', u'ns3::TracedValueCallback::Uint16&')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *', u'ns3::TracedValueCallback::Uint32')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) **', u'ns3::TracedValueCallback::Uint32*')
+    typehandlers.add_type_alias(u'void ( * ) ( uint32_t, uint32_t ) *&', u'ns3::TracedValueCallback::Uint32&')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *', u'ns3::TracedValueCallback::Int16')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) **', u'ns3::TracedValueCallback::Int16*')
+    typehandlers.add_type_alias(u'void ( * ) ( int16_t, int16_t ) *&', u'ns3::TracedValueCallback::Int16&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -692,7 +778,10 @@
     register_Ns3CapabilityInformation_methods(root_module, root_module['ns3::CapabilityInformation'])
     register_Ns3DcfManager_methods(root_module, root_module['ns3::DcfManager'])
     register_Ns3DcfState_methods(root_module, root_module['ns3::DcfState'])
+    register_Ns3DeviceEnergyModelContainer_methods(root_module, root_module['ns3::DeviceEnergyModelContainer'])
+    register_Ns3DeviceEnergyModelHelper_methods(root_module, root_module['ns3::DeviceEnergyModelHelper'])
     register_Ns3DsssErrorRateModel_methods(root_module, root_module['ns3::DsssErrorRateModel'])
+    register_Ns3EnergySourceHelper_methods(root_module, root_module['ns3::EnergySourceHelper'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3InterferenceHelper_methods(root_module, root_module['ns3::InterferenceHelper'])
@@ -707,6 +796,7 @@
     register_Ns3MacLowTransmissionListener_methods(root_module, root_module['ns3::MacLowTransmissionListener'])
     register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
     register_Ns3MacRxMiddle_methods(root_module, root_module['ns3::MacRxMiddle'])
+    register_Ns3MacTxMiddle_methods(root_module, root_module['ns3::MacTxMiddle'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -720,6 +810,7 @@
     register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
     register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
     register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3Parameters_methods(root_module, root_module['ns3::Parameters'])
     register_Ns3PcapFile_methods(root_module, root_module['ns3::PcapFile'])
     register_Ns3PcapHelper_methods(root_module, root_module['ns3::PcapHelper'])
     register_Ns3PcapHelperForDevice_methods(root_module, root_module['ns3::PcapHelperForDevice'])
@@ -731,6 +822,7 @@
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
+    register_Ns3TracedValue__Double_methods(root_module, root_module['ns3::TracedValue< double >'])
     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'])
@@ -742,6 +834,8 @@
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
     register_Ns3WifiPhyHelper_methods(root_module, root_module['ns3::WifiPhyHelper'])
     register_Ns3WifiPhyListener_methods(root_module, root_module['ns3::WifiPhyListener'])
+    register_Ns3WifiRadioEnergyModelHelper_methods(root_module, root_module['ns3::WifiRadioEnergyModelHelper'])
+    register_Ns3WifiRadioEnergyModelPhyListener_methods(root_module, root_module['ns3::WifiRadioEnergyModelPhyListener'])
     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'])
@@ -750,6 +844,8 @@
     register_Ns3YansWifiPhyHelper_methods(root_module, root_module['ns3::YansWifiPhyHelper'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
+    register_Ns3MpduInfo_methods(root_module, root_module['ns3::mpduInfo'])
+    register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::signalNoiseDbm'])
     register_Ns3AmpduTag_methods(root_module, root_module['ns3::AmpduTag'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
@@ -793,6 +889,7 @@
     register_Ns3TriangularRandomVariable_methods(root_module, root_module['ns3::TriangularRandomVariable'])
     register_Ns3TwoRayGroundPropagationLossModel_methods(root_module, root_module['ns3::TwoRayGroundPropagationLossModel'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
+    register_Ns3VhtWifiMacHelper_methods(root_module, root_module['ns3::VhtWifiMacHelper'])
     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'])
@@ -805,6 +902,7 @@
     register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
     register_Ns3WifiPhyStateHelper_methods(root_module, root_module['ns3::WifiPhyStateHelper'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
+    register_Ns3WifiTxCurrentModel_methods(root_module, root_module['ns3::WifiTxCurrentModel'])
     register_Ns3YansWifiPhy_methods(root_module, root_module['ns3::YansWifiPhy'])
     register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
     register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
@@ -819,6 +917,8 @@
     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_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'])
@@ -832,10 +932,16 @@
     register_Ns3CtrlBAckResponseHeader_methods(root_module, root_module['ns3::CtrlBAckResponseHeader'])
     register_Ns3Dcf_methods(root_module, root_module['ns3::Dcf'])
     register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
+    register_Ns3DeviceEnergyModel_methods(root_module, root_module['ns3::DeviceEnergyModel'])
     register_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
     register_Ns3EdcaTxopN_methods(root_module, root_module['ns3::EdcaTxopN'])
     register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
+    register_Ns3EnergyHarvester_methods(root_module, root_module['ns3::EnergyHarvester'])
+    register_Ns3EnergySource_methods(root_module, root_module['ns3::EnergySource'])
+    register_Ns3EnergySourceContainer_methods(root_module, root_module['ns3::EnergySourceContainer'])
+    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_Ns3ErrorRateModel_methods(root_module, root_module['ns3::ErrorRateModel'])
     register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
@@ -849,6 +955,7 @@
     register_Ns3HtCapabilitiesValue_methods(root_module, root_module['ns3::HtCapabilitiesValue'])
     register_Ns3HtWifiMacHelper_methods(root_module, root_module['ns3::HtWifiMacHelper'])
     register_Ns3IdealWifiManager_methods(root_module, root_module['ns3::IdealWifiManager'])
+    register_Ns3IntegerValue_methods(root_module, root_module['ns3::IntegerValue'])
     register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
     register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
     register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
@@ -862,6 +969,7 @@
     register_Ns3JakesProcess_methods(root_module, root_module['ns3::JakesProcess'])
     register_Ns3JakesPropagationLossModel_methods(root_module, root_module['ns3::JakesPropagationLossModel'])
     register_Ns3Kun2600MhzPropagationLossModel_methods(root_module, root_module['ns3::Kun2600MhzPropagationLossModel'])
+    register_Ns3LinearWifiTxCurrentModel_methods(root_module, root_module['ns3::LinearWifiTxCurrentModel'])
     register_Ns3LogDistancePropagationLossModel_methods(root_module, root_module['ns3::LogDistancePropagationLossModel'])
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
@@ -894,6 +1002,8 @@
     register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
     register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
     register_Ns3StaWifiMac_methods(root_module, root_module['ns3::StaWifiMac'])
+    register_Ns3StringChecker_methods(root_module, root_module['ns3::StringChecker'])
+    register_Ns3StringValue_methods(root_module, root_module['ns3::StringValue'])
     register_Ns3SupportedRates_methods(root_module, root_module['ns3::SupportedRates'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
@@ -903,10 +1013,14 @@
     register_Ns3Vector2DValue_methods(root_module, root_module['ns3::Vector2DValue'])
     register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
     register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
+    register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
+    register_Ns3VhtCapabilitiesChecker_methods(root_module, root_module['ns3::VhtCapabilitiesChecker'])
+    register_Ns3VhtCapabilitiesValue_methods(root_module, root_module['ns3::VhtCapabilitiesValue'])
     register_Ns3WifiChannel_methods(root_module, root_module['ns3::WifiChannel'])
     register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
     register_Ns3WifiNetDevice_methods(root_module, root_module['ns3::WifiNetDevice'])
+    register_Ns3WifiRadioEnergyModel_methods(root_module, root_module['ns3::WifiRadioEnergyModel'])
     register_Ns3YansErrorRateModel_methods(root_module, root_module['ns3::YansErrorRateModel'])
     register_Ns3YansWifiChannel_methods(root_module, root_module['ns3::YansWifiChannel'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
@@ -1270,6 +1384,10 @@
     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', 
@@ -1473,17 +1591,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1505,11 +1623,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1519,16 +1632,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1766,14 +1869,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1834,11 +1941,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CapabilityInformation_methods(root_module, cls):
@@ -2066,6 +2168,82 @@
                    is_pure_virtual=True, visibility='private', is_virtual=True)
     return
 
+def register_Ns3DeviceEnergyModelContainer_methods(root_module, cls):
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer::DeviceEnergyModelContainer(ns3::DeviceEnergyModelContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DeviceEnergyModelContainer const &', 'arg0')])
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer::DeviceEnergyModelContainer() [constructor]
+    cls.add_constructor([])
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer::DeviceEnergyModelContainer(ns3::Ptr<ns3::DeviceEnergyModel> model) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::DeviceEnergyModel >', 'model')])
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer::DeviceEnergyModelContainer(std::string modelName) [constructor]
+    cls.add_constructor([param('std::string', 'modelName')])
+    ## device-energy-model-container.h (module 'energy'): ns3::DeviceEnergyModelContainer::DeviceEnergyModelContainer(ns3::DeviceEnergyModelContainer const & a, ns3::DeviceEnergyModelContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::DeviceEnergyModelContainer const &', 'a'), param('ns3::DeviceEnergyModelContainer const &', 'b')])
+    ## device-energy-model-container.h (module 'energy'): void ns3::DeviceEnergyModelContainer::Add(ns3::DeviceEnergyModelContainer container) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::DeviceEnergyModelContainer', 'container')])
+    ## device-energy-model-container.h (module 'energy'): void ns3::DeviceEnergyModelContainer::Add(ns3::Ptr<ns3::DeviceEnergyModel> model) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::DeviceEnergyModel >', 'model')])
+    ## device-energy-model-container.h (module 'energy'): void ns3::DeviceEnergyModelContainer::Add(std::string modelName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'modelName')])
+    ## device-energy-model-container.h (module 'energy'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::DeviceEnergyModel>*,std::vector<ns3::Ptr<ns3::DeviceEnergyModel>, std::allocator<ns3::Ptr<ns3::DeviceEnergyModel> > > > ns3::DeviceEnergyModelContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::DeviceEnergyModel > const, std::vector< ns3::Ptr< ns3::DeviceEnergyModel > > >', 
+                   [], 
+                   is_const=True)
+    ## device-energy-model-container.h (module 'energy'): void ns3::DeviceEnergyModelContainer::Clear() [member function]
+    cls.add_method('Clear', 
+                   'void', 
+                   [])
+    ## device-energy-model-container.h (module 'energy'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::DeviceEnergyModel>*,std::vector<ns3::Ptr<ns3::DeviceEnergyModel>, std::allocator<ns3::Ptr<ns3::DeviceEnergyModel> > > > ns3::DeviceEnergyModelContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::DeviceEnergyModel > const, std::vector< ns3::Ptr< ns3::DeviceEnergyModel > > >', 
+                   [], 
+                   is_const=True)
+    ## device-energy-model-container.h (module 'energy'): ns3::Ptr<ns3::DeviceEnergyModel> ns3::DeviceEnergyModelContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::DeviceEnergyModel >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## device-energy-model-container.h (module 'energy'): uint32_t ns3::DeviceEnergyModelContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3DeviceEnergyModelHelper_methods(root_module, cls):
+    ## energy-model-helper.h (module 'energy'): ns3::DeviceEnergyModelHelper::DeviceEnergyModelHelper() [constructor]
+    cls.add_constructor([])
+    ## energy-model-helper.h (module 'energy'): ns3::DeviceEnergyModelHelper::DeviceEnergyModelHelper(ns3::DeviceEnergyModelHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DeviceEnergyModelHelper const &', 'arg0')])
+    ## energy-model-helper.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::DeviceEnergyModelHelper::Install(ns3::Ptr<ns3::NetDevice> device, ns3::Ptr<ns3::EnergySource> source) const [member function]
+    cls.add_method('Install', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::DeviceEnergyModelHelper::Install(ns3::NetDeviceContainer deviceContainer, ns3::EnergySourceContainer sourceContainer) const [member function]
+    cls.add_method('Install', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('ns3::NetDeviceContainer', 'deviceContainer'), param('ns3::EnergySourceContainer', 'sourceContainer')], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): void ns3::DeviceEnergyModelHelper::Set(std::string name, ns3::AttributeValue const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'v')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-model-helper.h (module 'energy'): ns3::Ptr<ns3::DeviceEnergyModel> ns3::DeviceEnergyModelHelper::DoInstall(ns3::Ptr<ns3::NetDevice> device, ns3::Ptr<ns3::EnergySource> source) const [member function]
+    cls.add_method('DoInstall', 
+                   'ns3::Ptr< ns3::DeviceEnergyModel >', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    return
+
 def register_Ns3DsssErrorRateModel_methods(root_module, cls):
     ## dsss-error-rate-model.h (module 'wifi'): ns3::DsssErrorRateModel::DsssErrorRateModel() [constructor]
     cls.add_constructor([])
@@ -2098,6 +2276,43 @@
                    is_static=True)
     return
 
+def register_Ns3EnergySourceHelper_methods(root_module, cls):
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceHelper::EnergySourceHelper() [constructor]
+    cls.add_constructor([])
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceHelper::EnergySourceHelper(ns3::EnergySourceHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnergySourceHelper const &', 'arg0')])
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceContainer ns3::EnergySourceHelper::Install(ns3::Ptr<ns3::Node> node) const [member function]
+    cls.add_method('Install', 
+                   'ns3::EnergySourceContainer', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceContainer ns3::EnergySourceHelper::Install(ns3::NodeContainer c) const [member function]
+    cls.add_method('Install', 
+                   'ns3::EnergySourceContainer', 
+                   [param('ns3::NodeContainer', 'c')], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceContainer ns3::EnergySourceHelper::Install(std::string nodeName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::EnergySourceContainer', 
+                   [param('std::string', 'nodeName')], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): ns3::EnergySourceContainer ns3::EnergySourceHelper::InstallAll() const [member function]
+    cls.add_method('InstallAll', 
+                   'ns3::EnergySourceContainer', 
+                   [], 
+                   is_const=True)
+    ## energy-model-helper.h (module 'energy'): void ns3::EnergySourceHelper::Set(std::string name, ns3::AttributeValue const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'v')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-model-helper.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergySourceHelper::DoInstall(ns3::Ptr<ns3::Node> node) const [member function]
+    cls.add_method('DoInstall', 
+                   'ns3::Ptr< ns3::EnergySource >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    return
+
 def register_Ns3EventId_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('==')
@@ -2177,10 +2392,10 @@
     cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
     cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::InterferenceHelper::Event> ns3::InterferenceHelper::Add(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, ns3::Time duration, double rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::InterferenceHelper::Event> ns3::InterferenceHelper::Add(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::Time duration, double rxPower) [member function]
     cls.add_method('Add', 
                    'ns3::Ptr< ns3::InterferenceHelper::Event >', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::Time', 'duration'), param('double', 'rxPower')])
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::Time', 'duration'), param('double', 'rxPower')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePlcpHeaderSnrPer(ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
     cls.add_method('CalculatePlcpHeaderSnrPer', 
                    'ns3::InterferenceHelper::SnrPer', 
@@ -3042,6 +3257,26 @@
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::WifiMacHeader const *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     return
 
+def register_Ns3MacTxMiddle_methods(root_module, cls):
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle(ns3::MacTxMiddle const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacTxMiddle const &', 'arg0')])
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle() [constructor]
+    cls.add_constructor([])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSeqNumberByTidAndAddress(uint8_t tid, ns3::Mac48Address addr) const [member function]
+    cls.add_method('GetNextSeqNumberByTidAndAddress', 
+                   'uint16_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'addr')], 
+                   is_const=True)
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSequenceNumberfor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('GetNextSequenceNumberfor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::PeekNextSequenceNumberfor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('PeekNextSequenceNumberfor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    return
+
 def register_Ns3NetDeviceContainer_methods(root_module, cls):
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
@@ -3490,13 +3725,30 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
     cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
     return
 
+def register_Ns3Parameters_methods(root_module, cls):
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::Parameters() [constructor]
+    cls.add_constructor([])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::Parameters(ns3::Parameters const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Parameters const &', 'arg0')])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::aMpdu [variable]
+    cls.add_instance_attribute('aMpdu', 'ns3::mpduInfo', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::duration [variable]
+    cls.add_instance_attribute('duration', 'ns3::Time', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::preamble [variable]
+    cls.add_instance_attribute('preamble', 'ns3::WifiPreamble', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::rxPowerDbm [variable]
+    cls.add_instance_attribute('rxPowerDbm', 'double', is_const=False)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Parameters::txVector [variable]
+    cls.add_instance_attribute('txVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
 def register_Ns3PcapFile_methods(root_module, cls):
     ## pcap-file.h (module 'network'): ns3::PcapFile::PcapFile() [constructor]
     cls.add_constructor([])
@@ -3508,10 +3760,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -3575,10 +3827,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -3763,10 +4015,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -3908,6 +4160,40 @@
     cls.add_constructor([param('ns3::Time const', 'time'), param('ns3::Time::Unit const', 'unit')])
     return
 
+def register_Ns3TracedValue__Double_methods(root_module, cls):
+    ## traced-value.h (module 'core'): ns3::TracedValue<double>::TracedValue() [constructor]
+    cls.add_constructor([])
+    ## traced-value.h (module 'core'): ns3::TracedValue<double>::TracedValue(ns3::TracedValue<double> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TracedValue< double > const &', 'o')])
+    ## traced-value.h (module 'core'): ns3::TracedValue<double>::TracedValue(double const & v) [constructor]
+    cls.add_constructor([param('double const &', 'v')])
+    ## traced-value.h (module 'core'): void ns3::TracedValue<double>::Connect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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<double>::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<double>::Disconnect(ns3::CallbackBase const & cb, std::basic_string<char,std::char_traits<char>,std::allocator<char> > 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<double>::DisconnectWithoutContext(ns3::CallbackBase const & cb) [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'void', 
+                   [param('ns3::CallbackBase const &', 'cb')])
+    ## traced-value.h (module 'core'): double ns3::TracedValue<double>::Get() const [member function]
+    cls.add_method('Get', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## traced-value.h (module 'core'): void ns3::TracedValue<double>::Set(double const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('double const &', 'v')])
+    return
+
 def register_Ns3TypeId_methods(root_module, cls):
     cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
@@ -4209,24 +4495,24 @@
     cls.add_constructor([])
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
     cls.add_constructor([param('std::string', 'name')])
-    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
-    cls.add_method('GetBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate(uint8_t nss) const [member function]
     cls.add_method('GetCodeRate', 
                    'ns3::WifiCodeRate', 
-                   [], 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint16_t ns3::WifiMode::GetConstellationSize(uint8_t nss) const [member function]
     cls.add_method('GetConstellationSize', 
-                   'uint8_t', 
-                   [], 
+                   'uint16_t', 
+                   [param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetMcsValue() const [member function]
+    cls.add_method('GetMcsValue', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
@@ -4234,10 +4520,10 @@
                    'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [], 
+                   [param('uint32_t', 'channelWidth'), param('bool', 'isShortGuardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -4259,10 +4545,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    cls.add_method('CreateWifiMcs', 
+                   'ns3::WifiMode', 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   is_static=True)
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
                    is_static=True)
     return
 
@@ -4325,6 +4616,90 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3WifiRadioEnergyModelHelper_methods(root_module, cls):
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper(ns3::WifiRadioEnergyModelHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRadioEnergyModelHelper const &', 'arg0')])
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): void ns3::WifiRadioEnergyModelHelper::Set(std::string name, ns3::AttributeValue const & v) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'v')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): void ns3::WifiRadioEnergyModelHelper::SetDepletionCallback(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('SetDepletionCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): void ns3::WifiRadioEnergyModelHelper::SetRechargedCallback(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('SetRechargedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): void ns3::WifiRadioEnergyModelHelper::SetTxCurrentModel(std::string name, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetTxCurrentModel', 
+                   'void', 
+                   [param('std::string', 'name'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
+    ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::Ptr<ns3::DeviceEnergyModel> ns3::WifiRadioEnergyModelHelper::DoInstall(ns3::Ptr<ns3::NetDevice> device, ns3::Ptr<ns3::EnergySource> source) const [member function]
+    cls.add_method('DoInstall', 
+                   'ns3::Ptr< ns3::DeviceEnergyModel >', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3WifiRadioEnergyModelPhyListener_methods(root_module, cls):
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener::WifiRadioEnergyModelPhyListener(ns3::WifiRadioEnergyModelPhyListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRadioEnergyModelPhyListener const &', 'arg0')])
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener::WifiRadioEnergyModelPhyListener() [constructor]
+    cls.add_constructor([])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyMaybeCcaBusyStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyMaybeCcaBusyStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxEndError() [member function]
+    cls.add_method('NotifyRxEndError', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxEndOk() [member function]
+    cls.add_method('NotifyRxEndOk', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyRxStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyRxStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifySleep() [member function]
+    cls.add_method('NotifySleep', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifySwitchingStart(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyTxStart(ns3::Time duration, double txPowerDbm) [member function]
+    cls.add_method('NotifyTxStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration'), param('double', 'txPowerDbm')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::NotifyWakeup() [member function]
+    cls.add_method('NotifyWakeup', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::SetChangeStateCallback(ns3::Callback<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetChangeStateCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModelPhyListener::SetUpdateTxCurrentCallback(ns3::Callback<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetUpdateTxCurrentCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    return
+
 def register_Ns3WifiRemoteStation_methods(root_module, cls):
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation() [constructor]
     cls.add_constructor([])
@@ -4367,6 +4742,10 @@
     cls.add_constructor([param('ns3::WifiRemoteStationState const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_address [variable]
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
+    cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
+    cls.add_instance_attribute('m_channelWidth', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_greenfield [variable]
     cls.add_instance_attribute('m_greenfield', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_info [variable]
@@ -4374,7 +4753,7 @@
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint32_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
-    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiMcsList', is_const=False)
+    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
     cls.add_instance_attribute('m_operationalRateSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_rx [variable]
@@ -4393,8 +4772,13 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## 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, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, uint32_t channelWidth, bool aggregation, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint32_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): uint32_t ns3::WifiTxVector::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -4420,6 +4804,11 @@
                    '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::IsShortGuardInterval() const [member function]
     cls.add_method('IsShortGuardInterval', 
                    'bool', 
@@ -4430,6 +4819,14 @@
                    '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::SetChannelWidth(uint32_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelWidth')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -4615,6 +5012,28 @@
     cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
 
+def register_Ns3MpduInfo_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::mpduInfo(ns3::mpduInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::mpduInfo const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::packetType [variable]
+    cls.add_instance_attribute('packetType', 'uint8_t', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::mpduInfo::referenceNumber [variable]
+    cls.add_instance_attribute('referenceNumber', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3SignalNoiseDbm_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signalNoiseDbm(ns3::signalNoiseDbm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::signalNoiseDbm const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::noise [variable]
+    cls.add_instance_attribute('noise', 'double', is_const=False)
+    ## wifi-phy.h (module 'wifi'): ns3::signalNoiseDbm::signal [variable]
+    cls.add_instance_attribute('signal', 'double', is_const=False)
+    return
+
 def register_Ns3AmpduTag_methods(root_module, cls):
     ## ampdu-tag.h (module 'wifi'): ns3::AmpduTag::AmpduTag(ns3::AmpduTag const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::AmpduTag const &', 'arg0')])
@@ -4960,6 +5379,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -4986,6 +5410,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtAssocResponseHeader_methods(root_module, cls):
@@ -5026,6 +5454,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtAssocResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5048,6 +5481,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtDelBaHeader_methods(root_module, cls):
@@ -5149,6 +5586,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeRequestHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5171,6 +5613,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3MgtProbeResponseHeader_methods(root_module, cls):
@@ -5222,6 +5668,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## mgt-headers.h (module 'wifi'): ns3::VhtCapabilities ns3::MgtProbeResponseHeader::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5248,6 +5699,10 @@
     cls.add_method('SetSupportedRates', 
                    'void', 
                    [param('ns3::SupportedRates', 'rates')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetVhtCapabilities(ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('SetVhtCapabilities', 
+                   'void', 
+                   [param('ns3::VhtCapabilities', 'vhtcapabilities')])
     return
 
 def register_Ns3NqosWifiMacHelper_methods(root_module, cls):
@@ -5376,10 +5831,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<ns3::Packet const> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -6314,6 +6769,23 @@
                    is_virtual=True)
     return
 
+def register_Ns3VhtWifiMacHelper_methods(root_module, cls):
+    ## vht-wifi-mac-helper.h (module 'wifi'): ns3::VhtWifiMacHelper::VhtWifiMacHelper(ns3::VhtWifiMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtWifiMacHelper const &', 'arg0')])
+    ## vht-wifi-mac-helper.h (module 'wifi'): ns3::VhtWifiMacHelper::VhtWifiMacHelper() [constructor]
+    cls.add_constructor([])
+    ## vht-wifi-mac-helper.h (module 'wifi'): static ns3::StringValue ns3::VhtWifiMacHelper::DataRateForMcs(int mcs) [member function]
+    cls.add_method('DataRateForMcs', 
+                   'ns3::StringValue', 
+                   [param('int', 'mcs')], 
+                   is_static=True)
+    ## vht-wifi-mac-helper.h (module 'wifi'): static ns3::VhtWifiMacHelper ns3::VhtWifiMacHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::VhtWifiMacHelper', 
+                   [], 
+                   is_static=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', 
@@ -7158,6 +7630,10 @@
     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::SetQosNoAck() [member function]
     cls.add_method('SetQosNoAck', 
                    'void', 
@@ -7170,6 +7646,10 @@
     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::SetQosNormalAck() [member function]
     cls.add_method('SetQosNormalAck', 
                    'void', 
@@ -7343,19 +7823,19 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuration(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('CalculatePlcpDuration', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpPreambleAndHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('CalculatePlcpPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')])
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
                    [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('ConfigureStandard', 
                    'void', 
@@ -7371,11 +7851,6 @@
                    'ns3::Ptr< ns3::WifiChannel >', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
     cls.add_method('GetChannelNumber', 
                    'uint16_t', 
@@ -7386,6 +7861,11 @@
                    'ns3::Time', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -7466,328 +7946,328 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
+    cls.add_method('GetHtMcs0', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'bool', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
+    cls.add_method('GetHtMcs1', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetMFPlcpHeaderMode', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
+    cls.add_method('GetHtMcs10', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
-    cls.add_method('GetMembershipSelectorModes', 
-                   'ns3::WifiModeList', 
-                   [param('uint32_t', 'selector')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
-    cls.add_method('GetMode', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
+    cls.add_method('GetHtMcs11', 
                    'ns3::WifiMode', 
-                   [param('uint32_t', 'mode')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint32_t', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
+    cls.add_method('GetHtMcs12', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
-    cls.add_method('GetNumberOfReceiveAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
-    cls.add_method('GetNumberOfTransmitAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
-                   'ns3::WifiMode', 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
+    cls.add_method('GetHtMcs13', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
+    cls.add_method('GetHtMcs14', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
+    cls.add_method('GetHtMcs15', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
+    cls.add_method('GetHtMcs16', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
+    cls.add_method('GetHtMcs17', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
+    cls.add_method('GetHtMcs18', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
+    cls.add_method('GetHtMcs19', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
-    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
+    cls.add_method('GetHtMcs2', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
+    cls.add_method('GetHtMcs20', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
+    cls.add_method('GetHtMcs21', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
+    cls.add_method('GetHtMcs22', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
+    cls.add_method('GetHtMcs23', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
+    cls.add_method('GetHtMcs24', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
+    cls.add_method('GetHtMcs25', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
+    cls.add_method('GetHtMcs26', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
+    cls.add_method('GetHtMcs27', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
+    cls.add_method('GetHtMcs28', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
+    cls.add_method('GetHtMcs29', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
+    cls.add_method('GetHtMcs3', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
+    cls.add_method('GetHtMcs30', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
+    cls.add_method('GetHtMcs31', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
+    cls.add_method('GetHtMcs4', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
+    cls.add_method('GetHtMcs5', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
+    cls.add_method('GetHtMcs6', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
+    cls.add_method('GetHtMcs7', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
+    cls.add_method('GetHtMcs8', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
+    cls.add_method('GetHtMcs9', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetHtPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [], 
+                   [param('ns3::WifiMode', 'payloadMode')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
                    'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
+                   [param('uint8_t', 'mcs')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
                    'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
+    cls.add_method('GetOfdmRate12Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
+    cls.add_method('GetOfdmRate18Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
+    cls.add_method('GetOfdmRate24Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
+    cls.add_method('GetOfdmRate36Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
-    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
+    cls.add_method('GetOfdmRate48Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
+    cls.add_method('GetOfdmRate54Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
-    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
-    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
@@ -7806,34 +8286,49 @@
                    'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('double', 'frequency'), param('uint8_t', 'packetType'), param('uint8_t', 'incFlag')])
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHeaderDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHeaderMode', 
                    'ns3::WifiMode', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpHtSigHeaderDuration', 
                    'ns3::Time', 
                    [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrainingSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txVector) [member function]
     cls.add_method('GetPlcpHtTrainingSymbolDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   [param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpPreambleDuration(ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
     cls.add_method('GetPlcpPreambleDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA1Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA1Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigA2Duration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigA2Duration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpVhtSigBDuration(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpVhtSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
     cls.add_method('GetStateDuration', 
@@ -7860,6 +8355,61 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
+    cls.add_method('GetVhtMcs0', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
+    cls.add_method('GetVhtMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
+    cls.add_method('GetVhtMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
+    cls.add_method('GetVhtMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
+    cls.add_method('GetVhtMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
+    cls.add_method('GetVhtMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
+    cls.add_method('GetVhtMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
+    cls.add_method('GetVhtMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
+    cls.add_method('GetVhtMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
+    cls.add_method('GetVhtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPlcpHeaderMode(ns3::WifiMode payloadMode) [member function]
+    cls.add_method('GetVhtPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
@@ -7900,19 +8450,14 @@
                    'bool', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu, ns3::signalNoiseDbm signalNoise) [member function]
     cls.add_method('NotifyMonitorSniffRx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::signalNoiseDbm', 'signalNoise')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, ns3::WifiPreamble preamble, ns3::WifiTxVector txVector, ns3::mpduInfo aMpdu) [member function]
     cls.add_method('NotifyMonitorSniffTx', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txVector'), param('ns3::mpduInfo', 'aMpdu')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('NotifyRxBegin', 
                    'void', 
@@ -7947,21 +8492,21 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
     cls.add_method('SendPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
                    [param('uint16_t', 'id')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
@@ -8017,11 +8562,6 @@
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
@@ -8140,10 +8680,10 @@
     cls.add_method('AddAllSupportedModes', 
                    'void', 
                    [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
+                   [param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
     cls.add_method('AddBasicMode', 
                    'void', 
@@ -8152,10 +8692,14 @@
     cls.add_method('AddStationHtCapabilities', 
                    'void', 
                    [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htcapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, uint8_t mcs) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtcapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtcapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
     cls.add_method('AddSupportedMcs', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'mcs')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
     cls.add_method('AddSupportedMode', 
                    'void', 
@@ -8168,9 +8712,9 @@
     cls.add_method('GetAckTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
     cls.add_method('GetBasicMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint32_t', 'i')], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint32_t i) const [member function]
@@ -8194,9 +8738,9 @@
     cls.add_method('GetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
     cls.add_method('GetDefaultMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
@@ -8279,6 +8823,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::HasVhtSupported() const [member function]
+    cls.add_method('HasVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
     cls.add_method('IsAssociated', 
                    'bool', 
@@ -8398,6 +8947,10 @@
     cls.add_method('SetRtsCtsThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> mac) [member function]
     cls.add_method('SetupMac', 
                    'void', 
@@ -8408,11 +8961,25 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
+    cls.add_method('UpdateFragmentationThreshold', 
+                   'void', 
+                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAggregation', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetGreenfield', 
                    'bool', 
@@ -8428,9 +8995,9 @@
                    'ns3::Ptr< ns3::WifiMac >', 
                    [], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
     cls.add_method('GetMcsSupported', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
                    is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
@@ -8488,6 +9055,11 @@
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
     cls.add_method('DoGetAckTxGuardInterval', 
                    'bool', 
@@ -8513,6 +9085,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetBlockAckTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetBlockAckTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
     cls.add_method('DoGetBlockAckTxGuardInterval', 
                    'bool', 
@@ -8538,6 +9115,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
                    visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::DoGetCtsTxChannelWidth(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxChannelWidth', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
     cls.add_method('DoGetCtsTxGuardInterval', 
                    'bool', 
@@ -8635,6 +9217,28 @@
                    is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
     return
 
+def register_Ns3WifiTxCurrentModel_methods(root_module, cls):
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel(ns3::WifiTxCurrentModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiTxCurrentModel const &', 'arg0')])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::WifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
+    cls.add_method('CalcTxCurrent', 
+                   'double', 
+                   [param('double', 'txPowerDbm')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-tx-current-model.h (module 'wifi'): static double ns3::WifiTxCurrentModel::DbmToW(double dbm) [member function]
+    cls.add_method('DbmToW', 
+                   'double', 
+                   [param('double', 'dbm')], 
+                   is_static=True)
+    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::WifiTxCurrentModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3YansWifiPhy_methods(root_module, cls):
     ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy(ns3::YansWifiPhy const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::YansWifiPhy const &', 'arg0')])
@@ -8670,11 +9274,6 @@
                    'ns3::Ptr< ns3::WifiChannel >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetChannelFrequencyMhz() const [member function]
     cls.add_method('GetChannelFrequencyMhz', 
                    'double', 
@@ -8690,14 +9289,19 @@
                    'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::YansWifiPhy::GetDevice() const [member function]
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::YansWifiPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::Object >', 
+                   'ns3::Ptr< ns3::NetDevice >', 
                    [], 
                    is_const=True)
     ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetEdThreshold() const [member function]
@@ -8735,9 +9339,9 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetMcs(uint8_t mcs) const [member function]
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMcs(uint8_t mcs) const [member function]
     cls.add_method('GetMcs', 
-                   'uint8_t', 
+                   'ns3::WifiMode', 
                    [param('uint8_t', 'mcs')], 
                    is_const=True, is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::YansWifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
@@ -8745,9 +9349,9 @@
                    'ns3::WifiModeList', 
                    [param('uint32_t', 'selector')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::YansWifiPhy::GetMobility() [member function]
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::YansWifiPhy::GetMobility() [member function]
     cls.add_method('GetMobility', 
-                   'ns3::Ptr< ns3::Object >', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
                    [])
     ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMode(uint32_t mode) const [member function]
     cls.add_method('GetMode', 
@@ -8824,10 +9428,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsMcsSupported(ns3::WifiMode mode) [member function]
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsMcsSupported(ns3::WifiMode mcs) [member function]
     cls.add_method('IsMcsSupported', 
                    'bool', 
-                   [param('ns3::WifiMode', 'mode')], 
+                   [param('ns3::WifiMode', 'mcs')], 
                    is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
@@ -8869,11 +9473,6 @@
                    'bool', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
     cls.add_method('RegisterListener', 
                    'void', 
@@ -8884,10 +9483,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble, uint8_t packetType) [member function]
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) [member function]
     cls.add_method('SendPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('uint32_t', 'mpduReferenceNumber')], 
                    is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetCcaMode1Threshold(double threshold) [member function]
     cls.add_method('SetCcaMode1Threshold', 
@@ -8897,20 +9496,20 @@
     cls.add_method('SetChannel', 
                    'void', 
                    [param('ns3::Ptr< ns3::YansWifiChannel >', 'channel')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
-                   'void', 
-                   [param('bool', 'channelbonding')], 
-                   is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelNumber(uint16_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
                    [param('uint16_t', 'id')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetDevice(ns3::Ptr<ns3::Object> device) [member function]
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelWidth(uint32_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint32_t', 'channelwidth')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Object >', 'device')])
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetEdThreshold(double threshold) [member function]
     cls.add_method('SetEdThreshold', 
                    'void', 
@@ -8939,10 +9538,10 @@
                    'void', 
                    [param('bool', 'ldpc')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetMobility(ns3::Ptr<ns3::Object> mobility) [member function]
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> mobility) [member function]
     cls.add_method('SetMobility', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Object >', 'mobility')])
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'mobility')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNTxPower(uint32_t n) [member function]
     cls.add_method('SetNTxPower', 
                    'void', 
@@ -8997,24 +9596,19 @@
     cls.add_method('SetTxPowerStart', 
                    'void', 
                    [param('double', 'start')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Ptr<ns3::InterferenceHelper::Event> event) [member function]
     cls.add_method('StartReceivePacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePlcp(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, ns3::Time rxDuration) [member function]
-    cls.add_method('StartReceivePlcp', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePreambleAndHeader(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreambleAndHeader', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('ns3::Time', 'rxDuration')])
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Time', 'rxDuration')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
     cls.add_method('UnregisterListener', 
                    'void', 
                    [param('ns3::WifiPhyListener *', 'listener')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
-    cls.add_method('WifiModeToMcs', 
-                   'uint32_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -9252,6 +9846,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::GetEof() const [member function]
+    cls.add_method('GetEof', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ampdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmpduSubframeHeader::GetInstanceTypeId() const [member function]
     cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
@@ -9291,6 +9890,10 @@
     cls.add_method('SetCrc', 
                    'void', 
                    [param('uint8_t', 'crc')])
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetEof(bool eof) [member function]
+    cls.add_method('SetEof', 
+                   'void', 
+                   [param('bool', 'eof')])
     ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetLength(uint16_t length) [member function]
     cls.add_method('SetLength', 
                    'void', 
@@ -9709,13 +10312,54 @@
     ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3BooleanChecker_methods(root_module, cls):
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker(ns3::BooleanChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanChecker const &', 'arg0')])
+    return
+
+def register_Ns3BooleanValue_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(ns3::BooleanValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BooleanValue const &', 'arg0')])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(bool value) [constructor]
+    cls.add_constructor([param('bool', 'value')])
+    ## boolean.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::BooleanValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('bool', 'value')])
     return
 
 def register_Ns3CallbackChecker_methods(root_module, cls):
@@ -9730,11 +10374,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -10346,6 +11000,53 @@
                    is_virtual=True)
     return
 
+def register_Ns3DeviceEnergyModel_methods(root_module, cls):
+    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel(ns3::DeviceEnergyModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::DeviceEnergyModel const &', 'arg0')])
+    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel() [constructor]
+    cls.add_constructor([])
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::ChangeState(int newState) [member function]
+    cls.add_method('ChangeState', 
+                   'void', 
+                   [param('int', 'newState')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetCurrentA() const [member function]
+    cls.add_method('GetCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetTotalEnergyConsumption() const [member function]
+    cls.add_method('GetTotalEnergyConsumption', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): static ns3::TypeId ns3::DeviceEnergyModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyDepletion() [member function]
+    cls.add_method('HandleEnergyDepletion', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyRecharged() [member function]
+    cls.add_method('HandleEnergyRecharged', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('SetEnergySource', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::DoGetCurrentA() const [member function]
+    cls.add_method('DoGetCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
 def register_Ns3DoubleValue_methods(root_module, cls):
     ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
     cls.add_constructor([])
@@ -10719,10 +11420,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -10753,6 +11454,284 @@
                    is_const=True, visibility='private', is_virtual=True)
     return
 
+def register_Ns3EnergyHarvester_methods(root_module, cls):
+    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester(ns3::EnergyHarvester const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnergyHarvester const &', 'arg0')])
+    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester() [constructor]
+    cls.add_constructor([])
+    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergyHarvester::GetEnergySource() const [member function]
+    cls.add_method('GetEnergySource', 
+                   'ns3::Ptr< ns3::EnergySource >', 
+                   [], 
+                   is_const=True)
+    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergyHarvester::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::GetPower() const [member function]
+    cls.add_method('GetPower', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## energy-harvester.h (module 'energy'): static ns3::TypeId ns3::EnergyHarvester::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('SetEnergySource', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::DoGetPower() const [member function]
+    cls.add_method('DoGetPower', 
+                   'double', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EnergySource_methods(root_module, cls):
+    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource(ns3::EnergySource const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnergySource const &', 'arg0')])
+    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource() [constructor]
+    cls.add_constructor([])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::AppendDeviceEnergyModel(ns3::Ptr<ns3::DeviceEnergyModel> deviceEnergyModelPtr) [member function]
+    cls.add_method('AppendDeviceEnergyModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::DeviceEnergyModel >', 'deviceEnergyModelPtr')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::ConnectEnergyHarvester(ns3::Ptr<ns3::EnergyHarvester> energyHarvesterPtr) [member function]
+    cls.add_method('ConnectEnergyHarvester', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergyHarvester >', 'energyHarvesterPtr')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::DisposeDeviceModels() [member function]
+    cls.add_method('DisposeDeviceModels', 
+                   'void', 
+                   [])
+    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(ns3::TypeId tid) [member function]
+    cls.add_method('FindDeviceEnergyModels', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('ns3::TypeId', 'tid')])
+    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(std::string name) [member function]
+    cls.add_method('FindDeviceEnergyModels', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('std::string', 'name')])
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetEnergyFraction() [member function]
+    cls.add_method('GetEnergyFraction', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetInitialEnergy() const [member function]
+    cls.add_method('GetInitialEnergy', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergySource::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True)
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetRemainingEnergy() [member function]
+    cls.add_method('GetRemainingEnergy', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetSupplyVoltage() const [member function]
+    cls.add_method('GetSupplyVoltage', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): static ns3::TypeId ns3::EnergySource::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::InitializeDeviceModels() [member function]
+    cls.add_method('InitializeDeviceModels', 
+                   'void', 
+                   [])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::UpdateEnergySource() [member function]
+    cls.add_method('UpdateEnergySource', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::BreakDeviceEnergyModelRefCycle() [member function]
+    cls.add_method('BreakDeviceEnergyModelRefCycle', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::CalculateTotalCurrent() [member function]
+    cls.add_method('CalculateTotalCurrent', 
+                   'double', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyDrained() [member function]
+    cls.add_method('NotifyEnergyDrained', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyRecharged() [member function]
+    cls.add_method('NotifyEnergyRecharged', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EnergySourceContainer_methods(root_module, cls):
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'arg0')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer() [constructor]
+    cls.add_constructor([])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::Ptr<ns3::EnergySource> source) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(std::string sourceName) [constructor]
+    cls.add_constructor([param('std::string', 'sourceName')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & a, ns3::EnergySourceContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'a'), param('ns3::EnergySourceContainer const &', 'b')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::EnergySourceContainer container) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::EnergySourceContainer', 'container')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(std::string sourceName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'sourceName')])
+    ## energy-source-container.h (module 'energy'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::EnergySource>*,std::vector<ns3::Ptr<ns3::EnergySource>, std::allocator<ns3::Ptr<ns3::EnergySource> > > > ns3::EnergySourceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::EnergySource > const, std::vector< ns3::Ptr< ns3::EnergySource > > >', 
+                   [], 
+                   is_const=True)
+    ## energy-source-container.h (module 'energy'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::EnergySource>*,std::vector<ns3::Ptr<ns3::EnergySource>, std::allocator<ns3::Ptr<ns3::EnergySource> > > > ns3::EnergySourceContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::EnergySource > const, std::vector< ns3::Ptr< ns3::EnergySource > > >', 
+                   [], 
+                   is_const=True)
+    ## energy-source-container.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergySourceContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::EnergySource >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## energy-source-container.h (module 'energy'): uint32_t ns3::EnergySourceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## energy-source-container.h (module 'energy'): static ns3::TypeId ns3::EnergySourceContainer::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EnumChecker_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker(ns3::EnumChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumChecker const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): void ns3::EnumChecker::Add(int value, std::string name) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): void ns3::EnumChecker::AddDefault(int value, std::string name) [member function]
+    cls.add_method('AddDefault', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Copy(ns3::AttributeValue const & src, ns3::AttributeValue & dst) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'src'), param('ns3::AttributeValue &', 'dst')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3EnumValue_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(ns3::EnumValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EnumValue const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(int value) [constructor]
+    cls.add_constructor([param('int', 'value')])
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## enum.h (module 'core'): int ns3::EnumValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int', 
+                   [], 
+                   is_const=True)
+    ## enum.h (module 'core'): std::string ns3::EnumValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): void ns3::EnumValue::Set(int value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [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', 
@@ -10801,10 +11780,10 @@
                    'double', 
                    [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
                    is_const=True)
-    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, double snr, uint32_t nbits) const [member function]
+    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint32_t nbits) const [member function]
     cls.add_method('GetChunkSuccessRate', 
                    'double', 
-                   [param('ns3::WifiMode', 'mode'), param('double', 'snr'), param('uint32_t', 'nbits')], 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint32_t', 'nbits')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
     ## error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::ErrorRateModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -11048,6 +12027,16 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
+    cls.add_method('GetAntennaSelectionCapabilities', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
+    cls.add_method('GetExtendedHtCapabilities', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
     cls.add_method('GetGreenfield', 
                    'uint8_t', 
@@ -11063,11 +12052,31 @@
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLSigProtectionSupport() const [member function]
+    cls.add_method('GetLSigProtectionSupport', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
     cls.add_method('GetLdpc', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
+    cls.add_method('GetMaxAmsduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetRxHighestSupportedDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t * ns3::HtCapabilities::GetRxMcsBitmask() [member function]
     cls.add_method('GetRxMcsBitmask', 
                    'uint8_t *', 
@@ -11082,6 +12091,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval40() const [member function]
+    cls.add_method('GetShortGuardInterval40', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
     cls.add_method('GetSupportedChannelWidth', 
                    'uint8_t', 
@@ -11097,6 +12111,21 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
+    cls.add_method('GetTxBfCapabilities', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMaxNSpatialStreams() const [member function]
+    cls.add_method('GetTxMaxNSpatialStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetTxMcsSetDefined() const [member function]
+    cls.add_method('GetTxMcsSetDefined', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) [member function]
     cls.add_method('IsSupportedMcs', 
                    'bool', 
@@ -11115,6 +12144,14 @@
     cls.add_method('SetAmpduParameters', 
                    'void', 
                    [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
+    cls.add_method('SetAntennaSelectionCapabilities', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
+    cls.add_method('SetExtendedHtCapabilities', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
     cls.add_method('SetGreenfield', 
                    'void', 
@@ -11127,10 +12164,26 @@
     cls.add_method('SetHtSupported', 
                    'void', 
                    [param('uint8_t', 'htsupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lsigprotection) [member function]
+    cls.add_method('SetLSigProtectionSupport', 
+                   'void', 
+                   [param('uint8_t', 'lsigprotection')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint8_t maxampdulength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxampdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint8_t maxamsdulength) [member function]
+    cls.add_method('SetMaxAmsduLength', 
+                   'void', 
+                   [param('uint8_t', 'maxamsdulength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxsupportedrate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxsupportedrate')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
     cls.add_method('SetRxMcsBitmask', 
                    'void', 
@@ -11139,6 +12192,10 @@
     cls.add_method('SetShortGuardInterval20', 
                    'void', 
                    [param('uint8_t', 'shortguardinterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardInterval40', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedchannelwidth) [member function]
     cls.add_method('SetSupportedChannelWidth', 
                    'void', 
@@ -11147,6 +12204,18 @@
     cls.add_method('SetSupportedMcsSet', 
                    'void', 
                    [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
+    cls.add_method('SetTxBfCapabilities', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxtxspatialstreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxtxspatialstreams')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txmcssetdefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txmcssetdefined')])
     return
 
 def register_Ns3HtCapabilitiesChecker_methods(root_module, cls):
@@ -11194,6 +12263,11 @@
     cls.add_constructor([param('ns3::HtWifiMacHelper const &', 'arg0')])
     ## ht-wifi-mac-helper.h (module 'wifi'): ns3::HtWifiMacHelper::HtWifiMacHelper() [constructor]
     cls.add_constructor([])
+    ## ht-wifi-mac-helper.h (module 'wifi'): static ns3::StringValue ns3::HtWifiMacHelper::DataRateForMcs(int mcs) [member function]
+    cls.add_method('DataRateForMcs', 
+                   'ns3::StringValue', 
+                   [param('int', 'mcs')], 
+                   is_static=True)
     ## ht-wifi-mac-helper.h (module 'wifi'): static ns3::HtWifiMacHelper ns3::HtWifiMacHelper::Default() [member function]
     cls.add_method('Default', 
                    'ns3::HtWifiMacHelper', 
@@ -11270,7 +12344,40 @@
     cls.add_method('IsLowLatency', 
                    'bool', 
                    [], 
-                   is_const=True, visibility='private', is_virtual=True)
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3IntegerValue_methods(root_module, cls):
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue() [constructor]
+    cls.add_constructor([])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(ns3::IntegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::IntegerValue const &', 'arg0')])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(int64_t const & value) [constructor]
+    cls.add_constructor([param('int64_t const &', 'value')])
+    ## integer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::IntegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): bool ns3::IntegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## integer.h (module 'core'): int64_t ns3::IntegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## integer.h (module 'core'): std::string ns3::IntegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): void ns3::IntegerValue::Set(int64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int64_t const &', 'value')])
     return
 
 def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
@@ -11567,6 +12674,50 @@
                    visibility='private', is_virtual=True)
     return
 
+def register_Ns3LinearWifiTxCurrentModel_methods(root_module, cls):
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel(ns3::LinearWifiTxCurrentModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LinearWifiTxCurrentModel const &', 'arg0')])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
+    cls.add_method('CalcTxCurrent', 
+                   'double', 
+                   [param('double', 'txPowerDbm')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::GetEta() const [member function]
+    cls.add_method('GetEta', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::GetIdleCurrent() const [member function]
+    cls.add_method('GetIdleCurrent', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::LinearWifiTxCurrentModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::GetVoltage() const [member function]
+    cls.add_method('GetVoltage', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-current-model.h (module 'wifi'): void ns3::LinearWifiTxCurrentModel::SetEta(double eta) [member function]
+    cls.add_method('SetEta', 
+                   'void', 
+                   [param('double', 'eta')])
+    ## wifi-tx-current-model.h (module 'wifi'): void ns3::LinearWifiTxCurrentModel::SetIdleCurrent(double idleCurrent) [member function]
+    cls.add_method('SetIdleCurrent', 
+                   'void', 
+                   [param('double', 'idleCurrent')])
+    ## wifi-tx-current-model.h (module 'wifi'): void ns3::LinearWifiTxCurrentModel::SetVoltage(double voltage) [member function]
+    cls.add_method('SetVoltage', 
+                   'void', 
+                   [param('double', 'voltage')])
+    return
+
 def register_Ns3LogDistancePropagationLossModel_methods(root_module, cls):
     ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::LogDistancePropagationLossModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -11743,6 +12894,10 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MpduAggregator> ns3::MacLow::GetMpduAggregator() [member function]
+    cls.add_method('GetMpduAggregator', 
+                   'ns3::Ptr< ns3::MpduAggregator >', 
+                   [])
     ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::MacLow::GetPhy() const [member function]
     cls.add_method('GetPhy', 
                    'ns3::Ptr< ns3::WifiPhy >', 
@@ -11768,6 +12923,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## mac-low.h (module 'wifi'): static ns3::TypeId ns3::MacLow::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
     cls.add_method('IsPromisc', 
                    'bool', 
@@ -11920,6 +13080,11 @@
     cls.add_constructor([])
     ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtBeaconHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     return
 
 def register_Ns3MinstrelWifiManager_methods(root_module, cls):
@@ -12073,16 +13238,21 @@
     cls.add_constructor([])
     ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator(ns3::MpduAggregator const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::MpduAggregator const &', 'arg0')])
-    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last) [member function]
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last, bool vhtSingleMpdu) [member function]
     cls.add_method('AddHeaderAndPad', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last'), param('bool', 'vhtSingleMpdu')], 
                    is_pure_virtual=True, is_virtual=True)
     ## mpdu-aggregator.h (module 'wifi'): bool ns3::MpduAggregator::Aggregate(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
     cls.add_method('Aggregate', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::AggregateVhtSingleMpdu(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
+    cls.add_method('AggregateVhtSingleMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## mpdu-aggregator.h (module 'wifi'): uint32_t ns3::MpduAggregator::CalculatePadding(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('CalculatePadding', 
                    'uint32_t', 
@@ -12110,16 +13280,21 @@
     cls.add_constructor([param('ns3::MpduStandardAggregator const &', 'arg0')])
     ## mpdu-standard-aggregator.h (module 'wifi'): ns3::MpduStandardAggregator::MpduStandardAggregator() [constructor]
     cls.add_constructor([])
-    ## mpdu-standard-aggregator.h (module 'wifi'): void ns3::MpduStandardAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last) [member function]
+    ## mpdu-standard-aggregator.h (module 'wifi'): void ns3::MpduStandardAggregator::AddHeaderAndPad(ns3::Ptr<ns3::Packet> packet, bool last, bool vhtSingleMpdu) [member function]
     cls.add_method('AddHeaderAndPad', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('bool', 'last'), param('bool', 'vhtSingleMpdu')], 
                    is_virtual=True)
     ## mpdu-standard-aggregator.h (module 'wifi'): bool ns3::MpduStandardAggregator::Aggregate(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
     cls.add_method('Aggregate', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
                    is_virtual=True)
+    ## mpdu-standard-aggregator.h (module 'wifi'): void ns3::MpduStandardAggregator::AggregateVhtSingleMpdu(ns3::Ptr<ns3::Packet const> packet, ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
+    cls.add_method('AggregateVhtSingleMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
+                   is_virtual=True)
     ## mpdu-standard-aggregator.h (module 'wifi'): uint32_t ns3::MpduStandardAggregator::CalculatePadding(ns3::Ptr<ns3::Packet const> packet) [member function]
     cls.add_method('CalculatePadding', 
                    'uint32_t', 
@@ -12316,10 +13491,10 @@
     cls.add_constructor([param('ns3::NistErrorRateModel const &', 'arg0')])
     ## nist-error-rate-model.h (module 'wifi'): ns3::NistErrorRateModel::NistErrorRateModel() [constructor]
     cls.add_constructor([])
-    ## nist-error-rate-model.h (module 'wifi'): double ns3::NistErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, double snr, uint32_t nbits) const [member function]
+    ## nist-error-rate-model.h (module 'wifi'): double ns3::NistErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint32_t nbits) const [member function]
     cls.add_method('GetChunkSuccessRate', 
                    'double', 
-                   [param('ns3::WifiMode', 'mode'), param('double', 'snr'), param('uint32_t', 'nbits')], 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint32_t', 'nbits')], 
                    is_const=True, is_virtual=True)
     ## nist-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::NistErrorRateModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -13237,6 +14412,16 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetVhtSupported(bool enable) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
     return
 
 def register_Ns3RraaWifiManager_methods(root_module, cls):
@@ -13434,6 +14619,46 @@
                    visibility='private', is_virtual=True)
     return
 
+def register_Ns3StringChecker_methods(root_module, cls):
+    ## string.h (module 'core'): ns3::StringChecker::StringChecker() [constructor]
+    cls.add_constructor([])
+    ## string.h (module 'core'): ns3::StringChecker::StringChecker(ns3::StringChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::StringChecker const &', 'arg0')])
+    return
+
+def register_Ns3StringValue_methods(root_module, cls):
+    ## string.h (module 'core'): ns3::StringValue::StringValue() [constructor]
+    cls.add_constructor([])
+    ## string.h (module 'core'): ns3::StringValue::StringValue(ns3::StringValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::StringValue const &', 'arg0')])
+    ## string.h (module 'core'): ns3::StringValue::StringValue(std::string const & value) [constructor]
+    cls.add_constructor([param('std::string const &', 'value')])
+    ## string.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::StringValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## string.h (module 'core'): bool ns3::StringValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## string.h (module 'core'): std::string ns3::StringValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## string.h (module 'core'): std::string ns3::StringValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## string.h (module 'core'): void ns3::StringValue::Set(std::string const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string const &', 'value')])
+    return
+
 def register_Ns3SupportedRates_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates() [constructor]
@@ -13680,6 +14905,237 @@
                    [param('ns3::Vector3D const &', 'value')])
     return
 
+def register_Ns3VhtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::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)
+    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxAmpduLengthExponent() const [member function]
+    cls.add_method('GetMaxAmpduLengthExponent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
+    cls.add_method('GetMaxMpduLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
+    cls.add_method('GetRxLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxMcsMap() const [member function]
+    cls.add_method('GetRxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
+    cls.add_method('GetRxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor160Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor160Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetShortGuardIntervalFor80Mhz() const [member function]
+    cls.add_method('GetShortGuardIntervalFor80Mhz', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
+    cls.add_method('GetSupportedMcsAndNssSet', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetTxHighestSupportedLgiDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetTxMcsMap() const [member function]
+    cls.add_method('GetTxMcsMap', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
+    cls.add_method('GetTxStbc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
+    cls.add_method('GetVhtCapabilitiesInfo', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t Nss) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'Nss')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLengthExponent(uint8_t exponent) [member function]
+    cls.add_method('SetMaxAmpduLengthExponent', 
+                   'void', 
+                   [param('uint8_t', 'exponent')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint8_t length) [member function]
+    cls.add_method('SetMaxMpduLength', 
+                   'void', 
+                   [param('uint8_t', 'length')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetRxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxldpc) [member function]
+    cls.add_method('SetRxLdpc', 
+                   'void', 
+                   [param('uint8_t', 'rxldpc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetRxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxstbc) [member function]
+    cls.add_method('SetRxStbc', 
+                   'void', 
+                   [param('uint8_t', 'rxstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor160Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor80Mhz', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelwidthset) [member function]
+    cls.add_method('SetSupportedChannelWidthSet', 
+                   'void', 
+                   [param('uint8_t', 'channelwidthset')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNssSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supporteddatarate) [member function]
+    cls.add_method('SetTxHighestSupportedLgiDataRate', 
+                   'void', 
+                   [param('uint16_t', 'supporteddatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint16_t map) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint16_t', 'map')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetTxMcsMap', 
+                   'void', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txstbc) [member function]
+    cls.add_method('SetTxStbc', 
+                   'void', 
+                   [param('uint8_t', 'txstbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
+    cls.add_method('SetVhtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtsupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtsupported')])
+    return
+
+def register_Ns3VhtCapabilitiesChecker_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesChecker::VhtCapabilitiesChecker(ns3::VhtCapabilitiesChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesChecker const &', 'arg0')])
+    return
+
+def register_Ns3VhtCapabilitiesValue_methods(root_module, cls):
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue() [constructor]
+    cls.add_constructor([])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilitiesValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VhtCapabilitiesValue const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilitiesValue::VhtCapabilitiesValue(ns3::VhtCapabilities const & value) [constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'value')])
+    ## vht-capabilities.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::VhtCapabilitiesValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilitiesValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities ns3::VhtCapabilitiesValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::VhtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): std::string ns3::VhtCapabilitiesValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilitiesValue::Set(ns3::VhtCapabilities const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::VhtCapabilities const &', 'value')])
+    return
+
 def register_Ns3WifiChannel_methods(root_module, cls):
     ## wifi-channel.h (module 'wifi'): ns3::WifiChannel::WifiChannel() [constructor]
     cls.add_constructor([])
@@ -13906,15 +15362,141 @@
                    visibility='protected')
     return
 
+def register_Ns3WifiRadioEnergyModel_methods(root_module, cls):
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel(ns3::WifiRadioEnergyModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRadioEnergyModel const &', 'arg0')])
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::ChangeState(int newState) [member function]
+    cls.add_method('ChangeState', 
+                   'void', 
+                   [param('int', 'newState')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetCcaBusyCurrentA() const [member function]
+    cls.add_method('GetCcaBusyCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiPhy::State ns3::WifiRadioEnergyModel::GetCurrentState() const [member function]
+    cls.add_method('GetCurrentState', 
+                   'ns3::WifiPhy::State', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetIdleCurrentA() const [member function]
+    cls.add_method('GetIdleCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener * ns3::WifiRadioEnergyModel::GetPhyListener() [member function]
+    cls.add_method('GetPhyListener', 
+                   'ns3::WifiRadioEnergyModelPhyListener *', 
+                   [])
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetRxCurrentA() const [member function]
+    cls.add_method('GetRxCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSleepCurrentA() const [member function]
+    cls.add_method('GetSleepCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSwitchingCurrentA() const [member function]
+    cls.add_method('GetSwitchingCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTotalEnergyConsumption() const [member function]
+    cls.add_method('GetTotalEnergyConsumption', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTxCurrentA() const [member function]
+    cls.add_method('GetTxCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): static ns3::TypeId ns3::WifiRadioEnergyModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyDepletion() [member function]
+    cls.add_method('HandleEnergyDepletion', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyRecharged() [member function]
+    cls.add_method('HandleEnergyRecharged', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetCcaBusyCurrentA(double ccaBusyCurrentA) [member function]
+    cls.add_method('SetCcaBusyCurrentA', 
+                   'void', 
+                   [param('double', 'ccaBusyCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyDepletionCallback(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('SetEnergyDepletionCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyRechargedCallback(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('SetEnergyRechargedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('SetEnergySource', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetIdleCurrentA(double idleCurrentA) [member function]
+    cls.add_method('SetIdleCurrentA', 
+                   'void', 
+                   [param('double', 'idleCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetRxCurrentA(double rxCurrentA) [member function]
+    cls.add_method('SetRxCurrentA', 
+                   'void', 
+                   [param('double', 'rxCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSleepCurrentA(double sleepCurrentA) [member function]
+    cls.add_method('SetSleepCurrentA', 
+                   'void', 
+                   [param('double', 'sleepCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSwitchingCurrentA(double switchingCurrentA) [member function]
+    cls.add_method('SetSwitchingCurrentA', 
+                   'void', 
+                   [param('double', 'switchingCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentA(double txCurrentA) [member function]
+    cls.add_method('SetTxCurrentA', 
+                   'void', 
+                   [param('double', 'txCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentFromModel(double txPowerDbm) [member function]
+    cls.add_method('SetTxCurrentFromModel', 
+                   'void', 
+                   [param('double', 'txPowerDbm')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentModel(ns3::Ptr<ns3::WifiTxCurrentModel> model) [member function]
+    cls.add_method('SetTxCurrentModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiTxCurrentModel >', 'model')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::DoGetCurrentA() const [member function]
+    cls.add_method('DoGetCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
 def register_Ns3YansErrorRateModel_methods(root_module, cls):
     ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel(ns3::YansErrorRateModel const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::YansErrorRateModel const &', 'arg0')])
     ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel() [constructor]
     cls.add_constructor([])
-    ## yans-error-rate-model.h (module 'wifi'): double ns3::YansErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, double snr, uint32_t nbits) const [member function]
+    ## yans-error-rate-model.h (module 'wifi'): double ns3::YansErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint32_t nbits) const [member function]
     cls.add_method('GetChunkSuccessRate', 
                    'double', 
-                   [param('ns3::WifiMode', 'mode'), param('double', 'snr'), param('uint32_t', 'nbits')], 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint32_t', 'nbits')], 
                    is_const=True, is_virtual=True)
     ## yans-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::YansErrorRateModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -13951,10 +15533,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, uint8_t packetType, ns3::Time duration) const [member function]
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble, ns3::mpduInfo aMpdu, ns3::Time duration) const [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'packetType'), param('ns3::Time', 'duration')], 
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble'), param('ns3::mpduInfo', 'aMpdu'), param('ns3::Time', 'duration')], 
                    is_const=True)
     ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
@@ -14325,6 +15907,10 @@
     module.add_function('MakeSsidChecker', 
                         'ns3::Ptr< ns3::AttributeChecker const >', 
                         [])
+    ## vht-capabilities.h (module 'wifi'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::MakeVhtCapabilitiesChecker() [free function]
+    module.add_function('MakeVhtCapabilitiesChecker', 
+                        'ns3::Ptr< ns3::AttributeChecker const >', 
+                        [])
     ## wifi-mode.h (module 'wifi'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::MakeWifiModeChecker() [free function]
     module.add_function('MakeWifiModeChecker', 
                         'ns3::Ptr< ns3::AttributeChecker const >', 
@@ -14347,6 +15933,7 @@
                         [param('uint8_t', 'tid')])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -14360,6 +15947,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/wifi/doc/Makefile ns-3.24/src/wifi/doc/Makefile
--- ns-3.23/src/wifi/doc/Makefile	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/doc/Makefile	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,184 @@
+EPSTOPDF = epstopdf
+DIA = dia
+DOT = dot
+CONVERT = convert -density 250
+
+
+SOURCE = source
+FIGURES = $(SOURCE)/figures
+
+# specify dia figures from which .png and .pdf figures need to be built
+
+IMAGES_DIA = \
+	$(FIGURES)/snir.dia \
+	$(FIGURES)/WifiArchitecture.dia
+
+# specify eps figures from which .png and .pdf figures need to be built
+
+IMAGES_EPS = \
+	$(FIGURES)/snir.eps \
+	$(FIGURES)/WifiArchitecture.eps
+
+# rescale pdf figures as necessary
+$(FIGURES)/snir.pdf_width = 3in
+
+IMAGES_NOBUILD = 
+# IMAGES_NOBUILD = $(FIGURES)/fading_pedestrian.png \
+
+IMAGES_BUILD = \
+	${IMAGES_DIA:.dia=.eps} \
+	${IMAGES_DIA:.dia=.png} \
+	${IMAGES_DIA:.dia=.pdf} \
+	${IMAGES_EPS:.eps=.png} \
+	${IMAGES_EPS:.eps=.pdf} 
+
+
+IMAGES = $(IMAGES_NOBUILD) $(IMAGES_BUILD)
+
+RESCALE = ../../../utils/rescale-pdf.sh
+
+%.eps : %.dia; $(DIA) -t eps $< -e $@
+%.png : %.dia; $(DIA) -t png $< -e $@
+%.png : %.eps; $(CONVERT) $< $@
+%.pdf : %.eps
+	$(EPSTOPDF) $< -o=$@
+	if test x$($@_width) != x; then $(RESCALE) $($@_width) $@ ; fi
+
+
+# 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) 
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+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)/*
+	-rm -f $(IMAGES_BUILD)
+
+
+images: $(IMAGES_NOBUILD) $(IMAGES_BUILD)
+
+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 ns-3.23/src/wifi/doc/snir.dia ns-3.24/src/wifi/doc/snir.dia
--- ns-3.23/src/wifi/doc/snir.dia	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/doc/snir.dia	1969-12-31 16:00:00.000000000 -0800
@@ -1,8 +0,0 @@
-      m杻2o63UꪕuOB@C_&<	gaבf`}^i{a0F3m<:t`0_߻l"oqx$f!&I|e{V~a4:%	I$KBGч?m%pycu3?Vs_B{OUk8mӨ\n+"9Y`xq7xTW]C$;mjc6c;ܘvs+Xs>֜/aDK&WaSV腶ԭx$5mM乗'nDC-ol+ W/V>k$ª?l>}#ymԤy\s0+ii{,vrk&?T̄O4:VtltgBDh:`}G+OG6Uh~OYpuh{*W֓`#3ǜ cf.1YKs04p_ߣF./lnBR)ӒDQV2s&U/}lmY.Z[Ldn|3L-6xO59>zKMf>A ]|B.:JD)A}[(^4
-PV?ǯvl[bo5A-VuW?TB+R	4D(+`DяA;˶0HGd.Q-!W+M59_ooAZZct3Z\S<nVS;Zʓ0+^XH C $A.)%V' J
- *]H3!в++]ҁoEH~)dS@HhԁB_k*dJB?N3#%ϻqۆ} Gnwe_gCzyNwX NSiXP6M.-+ݶS+y`-vu!.<ZdA7M&ˇH1Z@.إ֠]9о׹,b[\ya7ܖ6_\1;@	*"2VS/+yN@<V{@=T>T  r8~4WVzj8Q[Hzn/1\cʶp30~78A	`^;|7y,"V)w݂;D2wN;{0N<aoCe&Hrs.7,P&HNg%:-uإZ%*Xv>fm*V*X)=V
-]~#;P]}O{v=<'^8	ߜ&H2QT`Ft
-*fw{iKSd1~jM)&oeIbGe/!y9-1F"0Fǩ)JjI=!!La5$cErOHօH嬋45$#ErOH6ÑO4+@=±Ǳ1Z+8Vq_8plqlNr_8؂ؚ -+8V1pl؀H9686x(r_8vDqCp`<Mq?864QcL1cKq((x1q<Wc,c cmQyD5Ķ' X؁;
-@lbc틑E1w_T"/0Sda
-0)cKa,j0ܨ1Ri`,*˒x,ǿBe,aĳ$^_0ě`<_V񜋱cSTϖ3a1/c(#cMX){CYEqyi}aYX*O~./˴eN>/mb/,!)=3+,szi}aYTZ륏,sR{i}aYTnO!YfKXr~YU?zKסh.oXg-nFRzyiclQہYK#&Uo÷劬?|nU$zm߳u{/3Њ/&ucSce\*4B?<&?FOݴ5}hz|Lv`m#A<ea_4֤$#72QjcH0-~kr5vnV֡Fuv?;Zʓ`]۝g;h
-=g83}H3<T=s3)ySvz1=uqDѓ9 gT*r ren:7E3,YvD])iUll	sݪl>9CDd`  
\ No newline at end of file
diff -Naur ns-3.23/src/wifi/doc/source/conf.py ns-3.24/src/wifi/doc/source/conf.py
--- ns-3.23/src/wifi/doc/source/conf.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/doc/source/conf.py	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,223 @@
+# -*- 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.pngmath']
+
+# 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 = 'wifi'
+
+# General information about the project.
+project = u'ns-3'
+copyright = u'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-dev'
+# The full version, including alpha/beta/rc tags.
+release = 'ns-3-dev'
+
+# 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 = 'default'
+
+# 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 = None
+
+# 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'
+
+# 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 = [
+#  ('wifi-testing', 'wifi-doc-testing.tex', u'Wi-Fi Testing Documentation', u'ns-3 project', 'manual'),
+#  ('wifi-design', 'wifi-doc-design.tex', u'Wi-Fi Design Documentation', u'ns-3 project', 'manual'),
+#  ('wifi-user', 'wifi-doc-user.tex', u'Wi-Fi User Documentation', u'ns-3 project', 'manual'),
+  ('wifi', 'wifi-module-doc.tex', u'The ns-3 Wi-Fi Module Documentation', 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 = None
+
+# 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 = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+
+# add page breaks in the pdf. Level 1 is for top-level sections, level 2 for subsections, and so on.
+pdf_break_level = 4 
+
+
+# -- 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-model-library', u'ns-3 Model Library',
+     [u'ns-3 project'], 1)
+]
diff -Naur ns-3.23/src/wifi/doc/source/figures/snir.dia ns-3.24/src/wifi/doc/source/figures/snir.dia
--- ns-3.23/src/wifi/doc/source/figures/snir.dia	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/doc/source/figures/snir.dia	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,8 @@
+      m杻2o63UꪕuOB@C_&<	gaבf`}^i{a0F3m<:t`0_߻l"oqx$f!&I|e{V~a4:%	I$KBGч?m%pycu3?Vs_B{OUk8mӨ\n+"9Y`xq7xTW]C$;mjc6c;ܘvs+Xs>֜/aDK&WaSV腶ԭx$5mM乗'nDC-ol+ W/V>k$ª?l>}#ymԤy\s0+ii{,vrk&?T̄O4:VtltgBDh:`}G+OG6Uh~OYpuh{*W֓`#3ǜ cf.1YKs04p_ߣF./lnBR)ӒDQV2s&U/}lmY.Z[Ldn|3L-6xO59>zKMf>A ]|B.:JD)A}[(^4
+PV?ǯvl[bo5A-VuW?TB+R	4D(+`DяA;˶0HGd.Q-!W+M59_ooAZZct3Z\S<nVS;Zʓ0+^XH C $A.)%V' J
+ *]H3!в++]ҁoEH~)dS@HhԁB_k*dJB?N3#%ϻqۆ} Gnwe_gCzyNwX NSiXP6M.-+ݶS+y`-vu!.<ZdA7M&ˇH1Z@.إ֠]9о׹,b[\ya7ܖ6_\1;@	*"2VS/+yN@<V{@=T>T  r8~4WVzj8Q[Hzn/1\cʶp30~78A	`^;|7y,"V)w݂;D2wN;{0N<aoCe&Hrs.7,P&HNg%:-uإZ%*Xv>fm*V*X)=V
+]~#;P]}O{v=<'^8	ߜ&H2QT`Ft
+*fw{iKSd1~jM)&oeIbGe/!y9-1F"0Fǩ)JjI=!!La5$cErOHօH嬋45$#ErOH6ÑO4+@=±Ǳ1Z+8Vq_8plqlNr_8؂ؚ -+8V1pl؀H9686x(r_8vDqCp`<Mq?864QcL1cKq((x1q<Wc,c cmQyD5Ķ' X؁;
+@lbc틑E1w_T"/0Sda
+0)cKa,j0ܨ1Ri`,*˒x,ǿBe,aĳ$^_0ě`<_V񜋱cSTϖ3a1/c(#cMX){CYEqyi}aYX*O~./˴eN>/mb/,!)=3+,szi}aYTZ륏,sR{i}aYTnO!YfKXr~YU?zKסh.oXg-nFRzyiclQہYK#&Uo÷劬?|nU$zm߳u{/3Њ/&ucSce\*4B?<&?FOݴ5}hz|Lv`m#A<ea_4֤$#72QjcH0-~kr5vnV֡Fuv?;Zʓ`]۝g;h
+=g83}H3<T=s3)ySvz1=uqDѓ9 gT*r ren:7E3,YvD])iUll	sݪl>9CDd`  
\ No newline at end of file
diff -Naur ns-3.23/src/wifi/doc/source/figures/WifiArchitecture.dia ns-3.24/src/wifi/doc/source/figures/WifiArchitecture.dia
--- ns-3.23/src/wifi/doc/source/figures/WifiArchitecture.dia	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/doc/source/figures/WifiArchitecture.dia	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,11 @@
+     ][۶~_!8/-`Ӣ6)ҤimdeAKYr%z7~9){wmKIT"e~pHӗY,e#$H(un~zucHr~7elpeNX8ZKаJӞWFwo	cY4Z0%dF_F$<ERrAvO◽cW7SL(su:|4ۮv6O|HE=YU
+%W/Sh՗O]l 6#$JveAEc6}rgv9]ܨ]qqvE<XF"+r1%I!ez< 1ؾ>K\17P|N,
+wލ<D!}\EKIGy4iG	ke3o?O?Em&"MMd4?fe*jvcj`1YlUOZ[=h$`YЀn]>S1m~=!QAl wk>`}wѣh.$ȷ؆$Ҙ4KviB3$ٽ55h2euc/||>ܕ)sovttfN+m#Vpew4-ZmNV&,pq${ZΖK?Ey__> oStM) <ۮ'jVt xdF˟'M>*39|		܀0[Ye!oyh<<4ey9`5>mCu0o܇0s1]|	QF!Gڃ4Ih:E{8JdeO|QyR>I*(ԧ^\F.7ͺC Xbȵ
+!hu4[U![^Kς.crK~A~6%I",A,t]cSc1nt늚Tڞ*¸/3 "#tZ㎎qV-cQEyor\]Wڊj7๚MtsWL}d9op}ϳ{Wn){0E+dP56٨uE,dtyt2zCEm</yoH;SS6XV=ֶ2<82|!ԝ&+Vv|GʢufѰ.1lNgu[^\>|,gȎUGOWm%Q\-P ,;0p]qҝ+*ZÀSgQۡRK"]ݢjsf!ɟ?N,}оf )y?KE<[!XEI[c7mHrMd:)(%);7/lzK_(~ #XHU=ޜXv
+GWJA!B#c/b|eU=(7ʐAW?AI$M&?P	Qj`L_rlO)F׎?S^ƦwbJLǕ:ŦYi;>Kx\`)UVB(5} Sw$y54K&O"x>gKI>=|Ɩc껧@#eLh贛؉\ć(6r)TXY?{%YٗK9'YG9.!jV.jBEG`PI6ĢO+ dK(R(T
+9:8&P{F6$s="}'/aL`*˜OiZ#y\g⌔f"]ot$20¦{	IvVUQTN+`yKYw{-FN(+1j{r2VK;8=O2͍UJZ&
++^zJ,W JkksHܑ y|3mtb%yAڽ,B_Dn6lɥY&Ʊw^7<]/Kϸ.n6ȏ{'v#VY].Kͻv#2#S5S_'pnXag;26>n{\.Yuv8Ȩ ]du"4Nx,p<ؔjbMli/6ȄGק2ʞע1eSR4M5>#~*\-.W{z;aQ<$}IϭΠ:ViNF2!׏lSl{>ZBK2aFIkD1@ &ylPzfiHa}_Q4A}u8MNnH GǏPWn9Gc^Z:ƋD8\l`4VoD	pm} )^]DMԴ^Hvb0Ygo?׷Kn*)b
+ZDmUEЪ>7Qp3:+f/cU}J6oS=H} UnMn6+r 
+>?6Rsԛc1/SbL{#Opf@mwFOɅ8V$.r}H-}3k[jZt`z#7Bؒr|dW-,f" Ih]N>CBf"}3.|=a4al(}$ޤ!A$K	eg(/T3)#pi}WE:LIeik)y]|Hw,?E]"fcD-	9b?#o."\`_SC'Fx6',b6'1i1Ϙӿ;,)f"3+]DyٲZfgG3EΪUPQnTl8⋇zkyHaQ)("N7d<E.5*j5RpT
+Gn3xd#ϕG<aF5Oі),"Ni7L9R꣯¢
+SXU8ɒfdd  
\ No newline at end of file
diff -Naur ns-3.23/src/wifi/doc/source/replace.txt ns-3.24/src/wifi/doc/source/replace.txt
--- ns-3.23/src/wifi/doc/source/replace.txt	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/doc/source/replace.txt	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,3 @@
+.. |ns3| replace:: *ns-3*
+
+.. |ns2| replace:: *ns-2*
diff -Naur ns-3.23/src/wifi/doc/source/wifi-design.rst ns-3.24/src/wifi/doc/source/wifi-design.rst
--- ns-3.23/src/wifi/doc/source/wifi-design.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/doc/source/wifi-design.rst	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,364 @@
+.. include:: replace.txt
+.. highlight:: cpp
+
+++++++++++++++++++++
+Design Documentation
+++++++++++++++++++++
+
+
+|ns3| nodes can contain a collection of NetDevice objects, much like an actual
+computer contains separate interface cards for Ethernet, Wifi, Bluetooth, etc.
+This chapter describes the |ns3| WifiNetDevice and related models. By adding
+WifiNetDevice objects to |ns3| nodes, one can create models of 802.11-based
+infrastructure and ad hoc networks.
+
+Overview of the model
+*********************
+
+The WifiNetDevice models a wireless network interface controller based
+on the IEEE 802.11 standard [ieee80211]_. We will go into more detail below but in brief,
+|ns3| provides models for these aspects of 802.11:
+
+* basic 802.11 DCF with **infrastructure** and **adhoc** modes
+* **802.11a**, **802.11b**, **802.11g**, **802.11n** (both 2.4 and 5 GHz bands) and **802.11ac** physical layers
+* **MSDU aggregation** and **MPDU aggregation** extensions of 802.11n, and both can be combined together (two-level aggregation)
+* QoS-based EDCA and queueing extensions of **802.11e**
+* the ability to use different propagation loss models and propagation delay models,
+  please see the chapter on :ref:`Propagation` for more detail
+* various rate control algorithms including **Aarf, Arf, Cara, Onoe, Rraa,
+  ConstantRate, and Minstrel**
+* 802.11s (mesh), described in another chapter
+
+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
+not-so-slow PHY-level model of the 802.11a/b/g/n/ac specifications.
+
+In |ns3|, nodes can have multiple WifiNetDevices on separate channels, and the
+WifiNetDevice can coexist with other device types; this removes an architectural
+limitation found in |ns2|. Presently, however, there is no model for
+cross-channel interference or coupling.
+
+The source code for the WifiNetDevice lives in the directory
+``src/wifi``.
+
+The implementation is modular and provides roughly four levels of models:
+
+* the **PHY layer models**
+* the so-called **MAC low models**: they implement DCF and EDCAF
+* the so-called **MAC high models**: they implement the MAC-level beacon
+  generation, probing, and association state machines, and
+* a set of **Rate control algorithms** used by the MAC low models
+
+Next, we provide some overview of each layer.
+More detailed information will be discussed later.
+
+MAC high models
+===============
+
+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``), 
+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``).
+
+The simplest of these is ``ns3::AdhocWifiMac``, which implements a
+Wi-Fi MAC that does not perform any kind of beacon generation,
+probing, or association. The ``ns3::StaWifiMac`` class implements
+an active probing and association state machine that handles automatic
+re-association whenever too many beacons are missed. Finally,
+``ns3::ApWifiMac`` implements an AP that generates periodic
+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
+configuration, an attribute ``QosSupported`` that allows
+configuration of 802.11e/WMM-style QoS support, an attribute
+``HtSupported`` that allows configuration of 802.11n High Throughput
+style support an attribute ``VhtSupported`` that allows configuration
+of 802.11ac Very High Throughput style support.
+
+MAC low layer
+==============
+
+The **MAC low layer** is split into three components:
+
+#. ``ns3::MacLow`` which takes care of RTS/CTS/DATA/ACK transactions.
+#. ``ns3::DcfManager`` and ``ns3::DcfState`` which implements the DCF and EDCAF
+   functions.
+#. ``ns3::DcaTxop`` and ``ns3::EdcaTxopN`` which handle the packet queue,
+   packet fragmentation, and packet retransmissions if they are needed.
+   The ``ns3::DcaTxop`` object is used 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. 
+   ``ns3::EdcaTxopN`` is is used by QoS-enabled high MACs and also
+   performs 802.11n-style MSDU aggregation.
+
+Rate control algorithms
+=======================
+
+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 
+provided in a separate section.
+
+PHY layer models
+================
+
+The PHY layer implements a single model in the ``ns3::WifiPhy`` class: the
+physical layer model implemented there is described fully in a paper entitled
+`Yet Another Network Simulator <http://cutebugs.net/files/wns2-yans.pdf>`_
+Validation results for 802.11b are available in this
+`technical report <http://www.nsnam.org/~pei/80211b.pdf>`_
+
+.. _wifi-architecture:
+
+.. figure:: figures/WifiArchitecture.*
+   
+   WifiNetDevice architecture.
+
+The WifiChannel and WifiPhy models
+**********************************
+
+The WifiChannel subclass can be used to connect together a set of
+``ns3::WifiNetDevice`` network interfaces. The class ``ns3::WifiPhy`` is the
+object within the WifiNetDevice that receives bits from the channel.  
+For the channel propagation modeling, the propagation module is used; see section :ref:`Propagation` for details.
+
+This section summarizes the description of the BER calculations found in the
+yans paper taking into account the Forward Error Correction present in 802.11a
+and describes the algorithm we implemented to decide whether or not a packet can
+be successfully received. See `"Yet Another Network Simulator"
+<http://cutebugs.net/files/wns2-yans.pdf>`_ for more details.
+
+The PHY layer can be in one of five states:
+
+#. TX: the PHY is currently transmitting a signal on behalf of its associated
+   MAC
+#. RX: the PHY is synchronized on a signal and is waiting until it has received
+   its last bit to forward it to the MAC.
+#. IDLE: the PHY is not in the TX, RX, or CCA BUSY states.
+#. CCA Busy: the PHY is not in TX or RX state but the measured energy is higher than the energy detection threshold.
+#. SLEEP: the PHY is in a power save mode and cannot send nor receive frames.
+
+When the first bit of a new packet is received while the PHY is not IDLE (that
+is, it is already synchronized on the reception of another earlier packet or it
+is sending data itself), the received packet is dropped. Otherwise, if the PHY
+is IDLE or CCA Busy, we calculate the received energy of the first bit of this new signal
+and compare it against our Energy Detection threshold (as defined by the Clear
+Channel Assessment function mode 1). If the energy of the packet k is higher,
+then the PHY moves to RX state and schedules an event when the last bit of the
+packet is expected to be received. Otherwise, the PHY stays in IDLE 
+or CCA Busy state and drops the packet.
+
+The energy of the received signal is assumed to be zero outside of the reception
+interval of packet k and is calculated from the transmission power with a
+path-loss propagation model in the reception interval.  where the path loss
+exponent, :math:`n`, is chosen equal to :math:`3`, the reference distance,
+:math:`d_0` is choosen equal to :math:`1.0m` and the reference energy is based
+based on a Friis propagation model.
+
+When the last bit of the packet upon which the PHY is synchronized is received,
+we need to calculate the probability that the packet is received with any error
+to decide whether or not the packet on which we were synchronized could be
+successfully received or not: a random number is drawn from a uniform
+distribution and is compared against the probability of error.
+
+To evaluate the probability of error, we start from the piecewise linear 
+functions shown in Figure :ref:`snir` and calculate the 
+SNIR function. 
+
+.. _snir:
+
+.. figure:: figures/snir.*
+   
+   *SNIR function over time.*
+
+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.  Please refer to [pei80211ofdm]_, [pei80211b]_, [lacage2006yans]_, [Haccoun]_ and [Frenger]_ for a detailed description of the available BER/PER models.
+
+WifiChannel configuration
+=========================
+
+The WifiChannel implementation uses the propagation loss and delay models provided within the |ns3| :ref:`Propagation` module.
+
+The MAC model
+*************
+
+The 802.11 Distributed Coordination Function is used to calculate when to grant
+access to the transmission medium. While implementing the DCF would have been
+particularly easy if we had used a recurring timer that expired every slot, we
+chose to use the method described in [ji2004sslswn]_
+where the backoff timer duration is lazily calculated whenever needed since it
+is claimed to have much better performance than the simpler recurring timer
+solution.
+
+The backoff procedure of DCF is described in section 9.2.5.2 of [ieee80211]_.
+
+*  “The backoff procedure shall be invoked for a STA to transfer a frame 
+   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 
+   additional transmissions are currently queued.”
+
+Thus, if the queue is empty, a newly arrived packet should be transmitted 
+immediately after channel is sensed idle for DIFS.  If queue is not empty 
+and after a successful MPDU that has no more fragments, a node should 
+also start the backoff timer.
+
+Some users have observed that the 802.11 MAC with an empty queue on an 
+idle channel will transmit the first frame arriving to the model 
+immediately without waiting for DIFS or backoff, and wonder whether this 
+is compliant.  According to the standard, “The backoff procedure shall 
+be invoked for a STA to transfer a frame when finding the medium busy 
+as indicated by either the physical or virtual CS mechanism.”  So in 
+this case, the medium is not found to be busy in recent past and the 
+station can transmit immediately. 
+
+The higher-level MAC functions are implemented in a set of other C++ classes and
+deal with:
+
+* packet fragmentation and defragmentation,
+* use of the RTS/CTS protocol,
+* rate control algorithm,
+* connection and disconnection to and from an Access Point,
+* the MAC transmission queue,
+* beacon generation,
+* MSDU aggregation,
+* etc.
+
+Rate control algorithms
+***********************
+
+Multiple rate control algorithms are available in |ns3|.
+Some rate control algorithms are modeled after real algorithms used in real devices;
+others are found in literature.
+The following rate control algorithms can be used by the MAC low layer:
+
+Algorithms found in real devices:
+
+* ``ArfWifiManager`` (default for ``WifiHelper``)
+* ``OnoeWifiManager``
+* ``ConstantRateWifiManager``
+* ``MinstrelWifiManager``
+
+Algorithms in literature:
+
+* ``IdealWifiManager``
+* ``AarfWifiManager`` [lacage2004aarfamrr]_
+* ``AmrrWifiManager`` [lacage2004aarfamrr]_
+* ``CaraWifiManager`` [kim2006cara]_
+* ``RraaWifiManager`` [wong2006rraa]_
+* ``AarfcdWifiManager`` [maguolo2008aarfcd]_
+* ``ParfWifiManager`` [akella2007parf]_
+* ``AparfWifiManager`` [chevillat2005aparf]_
+
+ConstantRateWifiManager
+=======================
+
+The constant rate control algorithm always uses the same
+transmission mode for every packet. Users can set a desired
+'DataMode' for all 'unicast' packets and 'ControlMode' for all
+'request' control packets (e.g. RTS).
+
+To specify different data mode for non-unicast packets, users
+must set the 'NonUnicastMode' attribute of the
+WifiRemoteStationManager.  Otherwise, WifiRemoteStationManager
+will use a mode with the lowest rate for non-unicast packets.
+
+The 802.11 standard is quite clear on the rules for selection
+of transmission parameters for control response frames (e.g.
+CTS and ACK).  |ns3| follows the standard and selects the rate
+of control response frames from the set of basic rates or
+mandatory rates. This means that control response frames may
+be sent using different rate even though the ConstantRateWifiManager
+is used.  The ControlMode attribute of the ConstantRateWifiManager
+is used for RTS frames only.  The rate of CTS and ACK frames are
+selected according to the 802.11 standard.  However, users can still
+manually add WifiMode to the basic rate set that will allow control
+response frames to be sent at other rates.  Please consult the
+`project wiki <http://www.nsnam.org/wiki>`_ on how to do this.
+
+Available attributes:
+
+* DataMode (default WifiMode::OfdmRate6Mbps): specify a mode for
+  all non-unicast packets
+* ControlMode (default WifiMode::OfdmRate6Mbps): specify a mode for
+  all 'request' control packets
+
+IdealWifiManager
+================
+
+The ideal rate control algorithm selects the best
+mode according to the SNR of the previous packet sent.
+Consider node *A* sending a unicast packet to node *B*.
+When *B* successfully receives the packet sent from *A*,
+*B* records the SNR of the received packet into a ``ns3::SnrTag``
+and adds the tag to an ACK back to *A*.
+By doing this, *A* is able to learn the SNR of the packet sent to *B*
+using an out-of-band mechanism (thus the name 'ideal').
+*A* then uses the SNR to select a transmission mode based
+on a set of SNR thresholds, which was built from a target BER and
+mode-specific SNR/BER curves.
+
+Available attribute:
+
+* BerThreshold (default 10e-6): The maximum Bit Error Rate
+  that is used to calculate the SNR threshold for each mode.
+
+MinstrelWifiManager
+===================
+
+The minstrel rate control algorithm is a rate control algorithm originated from
+madwifi project.  It is currently the default rate control algorithm of the Linux kernel.
+
+Minstrel keeps track of the probability of successfully sending a frame of each available rate.
+Minstrel then calculates the expected throughput by multiplying the probability with the rate.
+This approach is chosen to make sure that lower rates are not selected in favor of the higher
+rates (since lower rates are more likely to have higher probability).
+
+In minstrel, roughly 10 percent of transmissions are sent at the so-called lookaround rate.
+The goal of the lookaround rate is to force minstrel to try higher rate than the currently used rate.
+
+For a more detailed information about minstrel, see [linuxminstrel]_.
+
+Modifying Wifi model
+********************
+
+Modifying the default wifi model is one of the common tasks when performing research.
+We provide an overview of how to make changes to the default wifi model in this section.
+Depending on your goal, the common tasks are (in no particular order):
+
+* 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 
+  ``mac-low.*`` to accomplish this.  Handling of control frames is performed in
+  ``MacLow::ReceiveOk``.
+* 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.
+* Wi-Fi queue management.  The files ``dca-txop.*`` and ``edca-txop-n.*`` are of interested for this task.
+* Channel access management.  Users should modify the files ``dcf-manager.*``, which grant access to
+  ``DcaTxop`` and ``EdcaTxopN``.
+* Fragmentation and RTS threholds are handled by Wi-Fi remote station manager.  Note that Wi-Fi remote
+  station manager simply indicates if fragmentation and RTS are needed.  Fragmentation is handled by
+  ``DcaTxop`` or ``EdcaTxopN`` while RTS/CTS transaction is hanled by ``MacLow``.
+* Modifying or creating new rate control algorithms can be done by creating a new child class of Wi-Fi remote
+  station manager or modifying the existing ones.
+
+Note on the current implementation
+**********************************
+
+* 802.11g does not support 9 microseconds slot
+* PHY_RXSTART is not supported
+* 802.11e TXOP is not supported
+* 802.11n MIMO is not supported
+* 802.11n/ac MIMO is not supported
+* 802.11n/ac beamforming is not supported
+* PLCP preamble reception is not modeled
+* BSSBasicRateSet for 802.11b has been assumed to be 1-2 Mbit/s
+* BSSBasicRateSet for 802.11a/g has been assumed to be 6-12-24 Mbit/s
+* cases where RTS/CTS and ACK are transmitted using HT formats are not supported
+* Only ``ConstantRateWifiManager`` is supported by **802.11n** or **802.11ac**
diff -Naur ns-3.23/src/wifi/doc/source/wifi-references.rst ns-3.24/src/wifi/doc/source/wifi-references.rst
--- ns-3.23/src/wifi/doc/source/wifi-references.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/doc/source/wifi-references.rst	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,35 @@
+.. include:: replace.txt
+
+.. only:: html
+
+=================================
+References
+=================================
+
+.. [ieee80211] IEEE Std 802.11-2007 *Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications*
+
+.. [pei80211b] \G. Pei and Tom Henderson, `Validation of ns-3 802.11b PHY model <http://www.nsnam.org/~pei/80211b.pdf>`__ 
+
+.. [pei80211ofdm] \G. Pei and Tom Henderson, `Validation of OFDM error rate model in ns-3 <http://www.nsnam.org/~pei/80211ofdm.pdf>`__ 
+
+.. [lacage2006yans] \M. Lacage and T. Henderson, `Yet another Network Simulator <http://cutebugs.net/files/wns2-yans.pdf>`__ 
+
+.. [Haccoun] \D. Haccoun and G. Begin, *High-Rate Punctured Convolutional Codes for Viterbi Sequential Decoding*, IEEE Transactions on Communications, Vol. 32, Issue 3, pp.315-319.
+
+.. [Frenger] \Pâl Frenger et al., "Multi-rate Convolutional Codes".
+
+.. [ji2004sslswn] \Z. Ji, J. Zhou, M. Takai and R. Bagrodia, *Scalable simulation of large-scale wireless networks with bounded inaccuracies*, in Proc. of the Seventh ACM Symposium on Modeling, Analysis and Simulation of Wireless and Mobile Systems, October 2004.
+
+.. [linuxminstrel] `minstrel linux wireless <http://wireless.kernel.org/en/developers/Documentation/mac80211/RateControl/minstrel>`_
+
+.. [lacage2004aarfamrr] \ M. Lacage, H. Manshaei, and T. Turletti, *IEEE 802.11 rate adaptation: a practical approach*, in Proc. 7th ACM International Symposium on Modeling, Analysis and Simulation of Wireless and Mobile Systems, 2004.
+
+.. [kim2006cara] \ J. Kim, S. Kim, S. Choi, and D. Qiao, *CARA: Collision-Aware Rate Adaptation for IEEE 802.11 WLANs*, in Proc. 25th IEEE International Conference on Computer Communications, 2006
+
+.. [wong2006rraa] \ S. Wong, H. Yang, S. Lu, and V. Bharghavan, *Robust Rate Adaptation for 802.11 Wireless Networks*, in Proc. 12th Annual International Conference on Mobile Computing and Networking, 2006
+
+.. [maguolo2008aarfcd] \ F. Maguolo, M. Lacage, and T. Turletti, *Efficient collision detection for auto rate fallback algorithm*, in IEEE Symposium on Computers and Communications, 2008
+
+.. [akella2007parf] \ A. Akella, G. Judd, S. Seshan, and P. Steenkiste, 'Self-management in chaotic wireless deployments', in Wireless Networks, Kluwer Academic Publishers, 2007, 13, 737-755.  `<http://www.cs.odu.edu/~nadeem/classes/cs795-WNS-S13/papers/enter-006.pdf>`__
+
+.. [chevillat2005aparf] \  Chevillat, P.; Jelitto, J., and Truong, H. L., 'Dynamic data rate and transmit power adjustment in IEEE 802.11 wireless LANs', in International Journal of Wireless Information Networks, Springer, 2005, 12, 123-145.  `<http://www.cs.mun.ca/~yzchen/papers/papers/rate_adaptation/80211_dynamic_rate_power_adjustment_chevillat_j2005.pdf>`__
diff -Naur ns-3.23/src/wifi/doc/source/wifi.rst ns-3.24/src/wifi/doc/source/wifi.rst
--- ns-3.23/src/wifi/doc/source/wifi.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/doc/source/wifi.rst	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,10 @@
+=================================
+ Wi-Fi Module
+=================================
+
+.. toctree::
+
+    wifi-design
+    wifi-user
+    wifi-testing
+    wifi-references
diff -Naur ns-3.23/src/wifi/doc/source/wifi-testing.rst ns-3.24/src/wifi/doc/source/wifi-testing.rst
--- ns-3.23/src/wifi/doc/source/wifi-testing.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/doc/source/wifi-testing.rst	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,7 @@
+.. include:: replace.txt
+.. highlight:: bash
+
++++++++++++++++++++++
+Testing Documentation
++++++++++++++++++++++
+
diff -Naur ns-3.23/src/wifi/doc/source/wifi-user.rst ns-3.24/src/wifi/doc/source/wifi-user.rst
--- ns-3.23/src/wifi/doc/source/wifi-user.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/doc/source/wifi-user.rst	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,433 @@
+.. include:: replace.txt
+.. highlight:: cpp
+
+++++++++++++++++++
+User Documentation
+++++++++++++++++++
+
+Using the WifiNetDevice
+***********************
+
+The modularity provided by the implementation makes low-level configuration of
+the WifiNetDevice powerful but complex. For this reason, we provide some helper
+classes to perform common operations in a simple matter, and leverage the |ns3|
+attribute system to allow users to control the parametrization of the underlying
+models.
+
+Users who use the low-level |ns3| API and who wish to add a WifiNetDevice to
+their node must create an instance of a WifiNetDevice, plus a number of
+constituent objects, and bind them together appropriately (the WifiNetDevice is
+very modular in this regard, for future extensibility). At the low-level API,
+this can be done with about 20 lines of code (see ``ns3::WifiHelper::Install``,
+and ``ns3::YansWifiPhyHelper::Create``). They also must create, at some point, a
+WifiChannel, which also contains a number of constituent objects (see
+``ns3::YansWifiChannelHelper::Create``).
+
+However, a few helpers are available for users to add these devices and channels
+with only a few lines of code, if they are willing to use defaults, and the
+helpers provide additional API to allow the passing of attribute values to
+change default values.  Commonly used attribute values are listed in the
+Attributes section.  The scripts in ``examples/wireless`` can be browsed to
+see how this is done.  Next, we describe the common steps to create a WifiNetDevice
+from the bottom layer (WifiChannel) up to the device layer (WifiNetDevice).
+
+To create a WifiNetDevice, users need to configure mainly five steps:
+
+* Configure the WifiChannel: WifiChannel takes care of getting signal
+  from one device to other devices on the same wifi 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 WifiChannel.  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 
+  calculates the probability of successfully decoding the frame based on the signal.
+* Configure WifiMac: this step is more on 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), HT (802.11n) and/or VHT (802.11ac) features are supported or not.
+* Create WifiDevice: at this step, users configure the desired wifi standard
+  (e.g. **802.11b**, **802.11g**, **802.11a**, **802.11n** or **802.11ac**) and rate control algorithm
+* Configure mobility: finally, mobility model is (usually) required before WifiNetDevice
+  can be used.
+
+YansWifiChannelHelper
+=====================
+
+The YansWifiChannelHelper has an unusual name. Readers may wonder why it is
+named this way. The reference is to the `yans simulator
+<http://cutebugs.net/files/wns2-yans.pdf>`_ from which this model is taken. The
+helper can be used to create a WifiChannel with a default PropagationLoss and
+PropagationDelay model.
+
+Users will typically type code such as::
+
+  YansWifiChannelHelper wifiChannelHelper = YansWifiChannelHelper::Default ();
+  Ptr<WifiChannel> wifiChannel = wifiChannelHelper.Create ();
+
+to get the defaults.  Specifically, the default is a channel model with a
+propagation delay equal to a constant, the speed of light (``ns3::ConstantSpeedPropagationDelayModel``),
+and a propagation loss based on a default log distance model (``ns3::LogDistancePropagationLossModel``)), using a default exponent of 3.
+Please note that the default log distance model is configured with a reference
+loss of 46.6777 dB at reference distance of 1m.  The reference loss of 46.6777 dB
+was calculated using Friis propagation loss model at 5.15 GHz.  The reference loss
+must be changed if **802.11b**, **802.11g** or **802.11n** (at 2.4 GHz) are used since they operate at 2.4 Ghz.
+
+Note the distinction above in creating a helper object vs. an actual simulation
+object.  In |ns3|, helper objects (used at the helper API only) are created on
+the stack (they could also be created with operator new and later deleted).
+However, the actual |ns3| objects typically inherit from ``class ns3::Object``
+and are assigned to a smart pointer.  See the chapter in the |ns3| manual for
+a discussion of the |ns3| object model, if you are not familiar with it.
+
+The following two methods are useful when configuring YansWifiChannelHelper:
+
+* ``YansWifiChannelHelper::AddPropagationLoss`` adds a PropagationLossModel
+  to a chain of PropagationLossModel
+* ``YansWifiChannelHelper::SetPropagationDelay`` sets a PropagationDelayModel
+
+YansWifiPhyHelper
+=================
+
+Physical devices (base class ``ns3::WifiPhy``) connect to ``ns3::WifiChannel`` models in
+|ns3|.  We need to create WifiPhy objects appropriate for the YansWifiChannel; here
+the ``YansWifiPhyHelper`` will do the work.
+
+The YansWifiPhyHelper class configures an object factory to create instances of
+a ``YansWifiPhy`` and adds some other objects to it, including possibly a
+supplemental ErrorRateModel and a pointer to a MobilityModel. The user code is
+typically::
+
+  YansWifiPhyHelper wifiPhyHelper = YansWifiPhyHelper::Default ();
+  wifiPhyHelper.SetChannel (wifiChannel);
+
+The default YansWifiPhyHelper is configured with NistErrorRateModel
+(``ns3::NistErrorRateModel``). You can change the error rate model by
+calling the ``YansWifiPhyHelper::SetErrorRateModel`` method.
+
+Optionally, if pcap tracing is needed, a user may use the following
+command to enable pcap tracing::
+
+  YansWifiPhyHelper::SetPcapDataLinkType (enum SupportedPcapDataLinkTypes dlt)
+
+|ns3| supports RadioTap and Prism tracing extensions for 802.11.
+
+Note that we haven't actually created any WifiPhy objects yet; we've just
+prepared the YansWifiPhyHelper by telling it which channel it is connected to.
+The Phy objects are created in the next step.
+
+802.11n/ac PHY layer can use either either long (800 ns) or short (400 ns) OFDM guard intervals. To configure this parameter, the following line of code could be used (in this example, it enables the support of a short guard interval)::
+
+ wifiPhyHelper.Set ("ShortGuardEnabled", BooleanValue(true));
+
+Furthermore, 802.11n provides an optional mode (GreenField mode) to reduce preamble durations and which is only compatible with 802.11n devices. This mode is enabled as follows::
+
+ wifiPhyHelper.Set ("GreenfieldEnabled",BooleanValue(true));
+
+802.11n PHY layer can support both 20 (default) or 40 MHz channel width, and 802.11ac PHY layer can use either 20, 40, 80 (default) or 160 MHz channel width. Since the channel width value is overwritten by ``WifiHelper::SetStandard``, this should be done post-install using ``Config::Set``::
+
+  WifiHelper wifi = WifiHelper::Default ();
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211ac);
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue("VHtMcs9"), "ControlMode", StringValue("VhtMcs0"));
+  VhtWifiMacHelper mac = VhtWifiMacHelper::Default ();
+
+  //Install PHY and MAC
+  Ssid ssid = Ssid ("ns3-wifi");
+  mac.SetType ("ns3::StaWifiMac",
+  "Ssid", SsidValue (ssid),
+  "ActiveProbing", BooleanValue (false));
+
+  NetDeviceContainer staDevice;
+  staDevice = wifi.Install (phy, mac, wifiStaNode);
+
+  mac.SetType ("ns3::ApWifiMac",
+  "Ssid", SsidValue (ssid));
+
+  NetDeviceContainer apDevice;
+  apDevice = wifi.Install (phy, mac, wifiApNode);
+
+  //Once install is done, we overwrite the channel width value
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (160));
+
+WifiMacHelper
+=============
+
+The next step is to configure the MAC model.
+We use WifiMacHelper to accomplish this.
+WifiMacHelper takes care of both the MAC low model and MAC high model.
+A user must decide if 802.11/WMM-style QoS and/or 802.11n-style High throughput (HT) and/or 802.11ac-style Very High throughput (VHT) support is required.
+
+NqosWifiMacHelper and QosWifiMacHelper
+++++++++++++++++++++++++++++++++++++++
+
+The ``ns3::NqosWifiMacHelper`` and ``ns3::QosWifiMacHelper`` configure an
+object factory to create instances of a ``ns3::WifiMac``. They are used to
+configure MAC parameters like type of MAC.  
+
+The former, ``ns3::NqosWifiMacHelper``, supports creation of MAC
+instances that do not have 802.11e/WMM-style QoS nor 802.11n-style High throughput (HT) nor 802.11ac-style Very High throughput (VHT) support enabled.
+
+For example the following user code configures a non-QoS and non-HT MAC that
+will be a non-AP STA in an infrastructure network where the AP has
+SSID ``ns-3-ssid``::
+
+    NqosWifiMacHelper wifiMacHelper = NqosWifiMacHelper::Default ();
+    Ssid ssid = Ssid ("ns-3-ssid");
+    wifiMacHelper.SetType ("ns3::StaWifiMac",
+                          "Ssid", SsidValue (ssid),
+                          "ActiveProbing", BooleanValue (false));
+
+To create MAC instances with QoS support enabled,
+``ns3::QosWifiMacHelper`` is used in place of
+``ns3::NqosWifiMacHelper``.
+
+The following code shows an example use of ``ns3::QosWifiMacHelper`` to 
+create an AP with QoS enabled::
+
+  QosWifiMacHelper wifiMacHelper = QosWifiMacHelper::Default ();
+  wifiMacHelper.SetType ("ns3::ApWifiMac",
+                         "Ssid", SsidValue (ssid),
+                         "BeaconGeneration", BooleanValue (true),
+                         "BeaconInterval", TimeValue (Seconds (2.5)));
+
+With QoS-enabled MAC models it is possible to work with traffic belonging to
+four different Access Categories (ACs): **AC_VO** for voice traffic,
+**AC_VI** for video traffic, **AC_BE** for best-effort
+traffic and **AC_BK** for background traffic.  In order for the
+MAC to determine the appropriate AC for an MSDU, packets forwarded
+down to these MAC layers should be marked using **ns3::QosTag** in
+order to set a TID (traffic id) for that packet otherwise it will be
+considered belonging to **AC_BE**.
+
+To create ad-hoc MAC instances, simply use ``ns3::AdhocWifiMac`` instead of ``ns3::StaWifiMac`` or ``ns3::ApWifiMac``.
+
+HtWifiMacHelper
++++++++++++++++
+
+The ``ns3::HtWifiMacHelper`` configures an
+object factory to create instances of a ``ns3::WifiMac``. It is used to
+supports creation of MAC instances that have 802.11n-style High throughput (HT) and QoS support enabled. In particular, this object can be also used to set:
+
+* an MSDU aggregator for a particular Access Category (AC) in order to use 
+  802.11n MSDU aggregation feature;
+* block ack parameters like threshold (number of packets for which block ack
+  mechanism should be used) and inactivity timeout.
+
+For example the following user code configures a HT MAC that
+will be a non-AP STA with QoS enabled, aggregation on AC_VO, and Block Ack on AC_BE, in an infrastructure network where the AP has
+SSID ``ns-3-ssid``::
+
+    HtWifiMacHelper wifiMacHelper = HtWifiMacHelper::Default ();
+    Ssid ssid = Ssid ("ns-3-ssid");
+    wifiMacHelper.SetType ("ns3::StaWifiMac",
+                          "Ssid", SsidValue (ssid),
+                          "ActiveProbing", BooleanValue (false));
+
+    wifiMacHelper.SetMsduAggregatorForAc (AC_VO, "ns3::MsduStandardAggregator",
+                                          "MaxAmsduSize", UintegerValue (3839));
+    wifiMacHelper.SetBlockAckThresholdForAc (AC_BE, 10);
+    wifiMacHelper.SetBlockAckInactivityTimeoutForAc (AC_BE, 5);
+
+This object can be also used to set in the same way as ``ns3::QosWifiMacHelper``.
+
+VhtWifiMacHelper
++++++++++++++++
+
+The ``ns3::VhtWifiMacHelper`` configures an
+object factory to create instances of a ``ns3::WifiMac``. It is used to
+supports creation of MAC instances that have 802.11ac-style Very High throughput (VHT) and QoS support enabled. This object is similar to ``HtWifiMacHelper``.
+
+WifiHelper
+==========
+
+We're now ready to create WifiNetDevices. First, let's create
+a WifiHelper with default settings::
+
+  WifiHelper wifiHelper = WifiHelper::Default ();
+
+What does this do?  It sets the default wifi standard to **802.11a** and sets the RemoteStationManager to
+``ns3::ArfWifiManager``.  You can change the RemoteStationManager by calling the
+``WifiHelper::SetRemoteStationManager`` method. To change the wifi standard, call the
+``WifiHelper::SetStandard`` method with the desired standard.
+
+Now, let's use the wifiPhyHelper and wifiMacHelper created above to install WifiNetDevices
+on a set of nodes in a NodeContainer "c"::
+
+  NetDeviceContainer wifiContainer = WifiHelper::Install (wifiPhyHelper, wifiMacHelper, c);
+
+This creates the WifiNetDevice which includes also a WifiRemoteStationManager, a
+WifiMac, and a WifiPhy (connected to the matching WifiChannel).
+
+The ``WifiHelper::SetStandard`` method set various default timing parameters as defined in the selected standard version, overwriting values that may exist or have been previously configured.
+In order to change parameters that are overwritten by ``WifiHelper::SetStandard``, this should be done post-install using ``Config::Set``::
+
+  WifiHelper wifi = WifiHelper::Default ();
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211n_2_4GHZ);
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue("HtMcs7"), "ControlMode", StringValue("HtMcs0"));
+  HtWifiMacHelper mac = HtWifiMacHelper::Default ();
+
+  //Install PHY and MAC
+  Ssid ssid = Ssid ("ns3-wifi");
+  mac.SetType ("ns3::StaWifiMac",
+  "Ssid", SsidValue (ssid),
+  "ActiveProbing", BooleanValue (false));
+
+  NetDeviceContainer staDevice;
+  staDevice = wifi.Install (phy, mac, wifiStaNode);
+
+  mac.SetType ("ns3::ApWifiMac",
+  "Ssid", SsidValue (ssid));
+
+  NetDeviceContainer apDevice;
+  apDevice = wifi.Install (phy, mac, wifiApNode);
+
+  //Once install is done, we overwrite the standard timing values
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/Slot", TimeValue (MicroSeconds (slot)));
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/Sifs", TimeValue (MicroSeconds (sifs)));
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/AckTimeout", TimeValue (MicroSeconds (ackTimeout)));
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/CtsTimeout", TimeValue (MicroSeconds (ctsTimeout)));
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/Rifs", TimeValue (MicroSeconds (rifs)));
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/BasicBlockAckTimeout", TimeValue (MicroSeconds (basicBlockAckTimeout)));
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/CompressedBlockAckTimeout", TimeValue (MicroSeconds (compressedBlockAckTimeout)));
+
+There are many |ns3| attributes that can be set on the above helpers to
+deviate from the default behavior; the example scripts show how to do some of
+this reconfiguration.
+
+Mobility configuration
+======================
+
+Finally, a mobility model must be configured on each node with Wi-Fi device.
+Mobility model is used for calculating propagation loss and propagation delay.
+Two examples are provided in the next section.
+Users are referred to the chapter on :ref:`Mobility` module for detailed information.
+
+Example configuration
+=====================
+
+We provide two typical examples of how a user might configure a Wi-Fi network --
+one example with an ad-hoc network and one example with an infrastructure network.
+The two examples were modified from the two examples in the ``examples/wireless`` folder
+(``wifi-simple-adhoc.cc`` and ``wifi-simple-infra.cc``).
+Users are encouraged to see examples in the ``examples/wireless`` folder.
+
+AdHoc WifiNetDevice configuration
++++++++++++++++++++++++++++++++++
+
+In this example, we create two ad-hoc nodes equipped with 802.11a Wi-Fi devices.
+We use the ``ns3::ConstantSpeedPropagationDelayModel`` as the propagation delay model and
+``ns3::LogDistancePropagationLossModel`` with the exponent of 3.0 as the propagation loss model.
+Both devices are configured with ``ConstantRateWifiManager`` at the fixed rate of 12Mbps.
+Finally, we manually place them by using the ``ns3::ListPositionAllocator``::
+
+  std::string phyMode ("OfdmRate12Mbps");
+
+  NodeContainer c;
+  c.Create (2);
+
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211a);
+
+  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
+  // ns-3 supports RadioTap and Prism tracing extensions for 802.11
+  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO); 
+
+  YansWifiChannelHelper wifiChannel;
+  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
+  wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel",
+                                  "Exponent", DoubleValue (3.0));
+  wifiPhy.SetChannel (wifiChannel.Create ());
+
+  // Add a non-QoS upper mac, and disable rate control (i.e. ConstantRateWifiManager)
+  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                "DataMode",StringValue (phyMode),
+                                "ControlMode",StringValue (phyMode));
+  // Set it to adhoc mode
+  wifiMac.SetType ("ns3::AdhocWifiMac");
+  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
+
+  // Configure mobility
+  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 (c);
+
+  // other set up (e.g. InternetStack, Application)
+
+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.
+In this example, we create one access point and two clients.
+Each node is equipped with 802.11b Wi-Fi device::
+
+  std::string phyMode ("DsssRate1Mbps");
+
+  NodeContainer ap;
+  ap.Create (1);
+  NodeContainer sta;
+  sta.Create (2);
+
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
+
+  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default (); 
+  // ns-3 supports RadioTap and Prism tracing extensions for 802.11
+  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO); 
+
+  YansWifiChannelHelper wifiChannel;
+  // reference loss must be changed since 802.11b is operating at 2.4GHz
+  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
+  wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel",
+                                  "Exponent", DoubleValue (3.0),
+				  "ReferenceLoss", DoubleValue (40.0459));
+  wifiPhy.SetChannel (wifiChannel.Create ());
+
+  // Add a non-QoS upper mac, and disable rate control
+  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                "DataMode",StringValue (phyMode),
+                                "ControlMode",StringValue (phyMode));
+
+  // Setup the rest of the upper mac
+  Ssid ssid = Ssid ("wifi-default");
+  // setup ap.
+  wifiMac.SetType ("ns3::ApWifiMac",
+                   "Ssid", SsidValue (ssid));
+  NetDeviceContainer apDevice = wifi.Install (wifiPhy, wifiMac, ap);
+  NetDeviceContainer devices = apDevice;
+
+  // setup sta.
+  wifiMac.SetType ("ns3::StaWifiMac",
+                   "Ssid", SsidValue (ssid),
+                   "ActiveProbing", BooleanValue (false));
+  NetDeviceContainer staDevice = wifi.Install (wifiPhy, wifiMac, sta);
+  devices.Add (staDevice);
+
+  // Configure mobility
+  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));
+  positionAlloc->Add (Vector (0.0, 5.0, 0.0));
+  mobility.SetPositionAllocator (positionAlloc);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (ap);
+  mobility.Install (sta);
+
+  // other set up (e.g. InternetStack, Application)
+
+Note on the current implementation
+**********************************
+
+* 802.11g supports a default of long slot time (20 microseconds)
+* PHY_RXSTART is not supported
+* 802.11e TXOP is not supported
+* 802.11n/ac MIMO is not supported
+* 802.11n/ac beamforming is not supported
+* PLCP preamble reception is not modeled
+* BSSBasicRateSet for 802.11b has been assumed to be 1-2 Mbit/s
+* BSSBasicRateSet for 802.11a/g has been assumed to be 6-12-24 Mbit/s
+* cases where RTS/CTS and ACK are transmitted using HT formats are not supported
+* Only ``ConstantRateWifiManager`` is supported by **802.11n** or **802.11ac**
diff -Naur ns-3.23/src/wifi/doc/WifiArchitecture.dia ns-3.24/src/wifi/doc/WifiArchitecture.dia
--- ns-3.23/src/wifi/doc/WifiArchitecture.dia	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/doc/WifiArchitecture.dia	1969-12-31 16:00:00.000000000 -0800
@@ -1,11 +0,0 @@
-     ][۶~_!8/-`Ӣ6)ҤimdeAKYr%z7~9){wmKIT"e~pHӗY,e#$H(un~zucHr~7elpeNX8ZKаJӞWFwo	cY4Z0%dF_F$<ERrAvO◽cW7SL(su:|4ۮv6O|HE=YU
-%W/Sh՗O]l 6#$JveAEc6}rgv9]ܨ]qqvE<XF"+r1%I!ez< 1ؾ>K\17P|N,
-wލ<D!}\EKIGy4iG	ke3o?O?Em&"MMd4?fe*jvcj`1YlUOZ[=h$`YЀn]>S1m~=!QAl wk>`}wѣh.$ȷ؆$Ҙ4KviB3$ٽ55h2euc/||>ܕ)sovttfN+m#Vpew4-ZmNV&,pq${ZΖK?Ey__> oStM) <ۮ'jVt xdF˟'M>*39|		܀0[Ye!oyh<<4ey9`5>mCu0o܇0s1]|	QF!Gڃ4Ih:E{8JdeO|QyR>I*(ԧ^\F.7ͺC Xbȵ
-!hu4[U![^Kς.crK~A~6%I",A,t]cSc1nt늚Tڞ*¸/3 "#tZ㎎qV-cQEyor\]Wڊj7๚MtsWL}d9op}ϳ{Wn){0E+dP56٨uE,dtyt2zCEm</yoH;SS6XV=ֶ2<82|!ԝ&+Vv|GʢufѰ.1lNgu[^\>|,gȎUGOWm%Q\-P ,;0p]qҝ+*ZÀSgQۡRK"]ݢjsf!ɟ?N,}оf )y?KE<[!XEI[c7mHrMd:)(%);7/lzK_(~ #XHU=ޜXv
-GWJA!B#c/b|eU=(7ʐAW?AI$M&?P	Qj`L_rlO)F׎?S^ƦwbJLǕ:ŦYi;>Kx\`)UVB(5} Sw$y54K&O"x>gKI>=|Ɩc껧@#eLh贛؉\ć(6r)TXY?{%YٗK9'YG9.!jV.jBEG`PI6ĢO+ dK(R(T
-9:8&P{F6$s="}'/aL`*˜OiZ#y\g⌔f"]ot$20¦{	IvVUQTN+`yKYw{-FN(+1j{r2VK;8=O2͍UJZ&
-+^zJ,W JkksHܑ y|3mtb%yAڽ,B_Dn6lɥY&Ʊw^7<]/Kϸ.n6ȏ{'v#VY].Kͻv#2#S5S_'pnXag;26>n{\.Yuv8Ȩ ]du"4Nx,p<ؔjbMli/6ȄGק2ʞע1eSR4M5>#~*\-.W{z;aQ<$}IϭΠ:ViNF2!׏lSl{>ZBK2aFIkD1@ &ylPzfiHa}_Q4A}u8MNnH GǏPWn9Gc^Z:ƋD8\l`4VoD	pm} )^]DMԴ^Hvb0Ygo?׷Kn*)b
-ZDmUEЪ>7Qp3:+f/cU}J6oS=H} UnMn6+r 
->?6Rsԛc1/SbL{#Opf@mwFOɅ8V$.r}H-}3k[jZt`z#7Bؒr|dW-,f" Ih]N>CBf"}3.|=a4al(}$ޤ!A$K	eg(/T3)#pi}WE:LIeik)y]|Hw,?E]"fcD-	9b?#o."\`_SC'Fx6',b6'1i1Ϙӿ;,)f"3+]DyٲZfgG3EΪUPQnTl8⋇zkyHaQ)("N7d<E.5*j5RpT
-Gn3xd#ϕG<aF5Oі),"Ni7L9R꣯¢
-SXU8ɒfdd  
\ No newline at end of file
diff -Naur ns-3.23/src/wifi/doc/wifi.rst ns-3.24/src/wifi/doc/wifi.rst
--- ns-3.23/src/wifi/doc/wifi.rst	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/doc/wifi.rst	1969-12-31 16:00:00.000000000 -0800
@@ -1,778 +0,0 @@
-.. include:: replace.txt
-.. highlight:: cpp
-
-Wifi
-----
-
-|ns3| nodes can contain a collection of NetDevice objects, much like an actual
-computer contains separate interface cards for Ethernet, Wifi, Bluetooth, etc.
-This chapter describes the |ns3| WifiNetDevice and related models. By adding
-WifiNetDevice objects to |ns3| nodes, one can create models of 802.11-based
-infrastructure and ad hoc networks.
-
-Overview of the model
-*********************
-
-The WifiNetDevice models a wireless network interface controller based
-on the IEEE 802.11 standard [ieee80211]_. We will go into more detail below but in brief,
-|ns3| provides models for these aspects of 802.11:
-
-* basic 802.11 DCF with **infrastructure** and **adhoc** modes
-* **802.11a**, **802.11b**, **802.11g** and **802.11n** (both 2.4 and 5 GHz bands) physical layers
-* **MSDU aggregation** and **MPDU aggregation** extensions of 802.11n, and both can be combined together (two-level aggregation)
-* QoS-based EDCA and queueing extensions of **802.11e**
-* the ability to use different propagation loss models and propagation delay models,
-  please see the chapter on :ref:`Propagation` for more detail
-* various rate control algorithms including **Aarf, Arf, Cara, Onoe, Rraa,
-  ConstantRate, and Minstrel**
-* 802.11s (mesh), described in another chapter
-
-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
-not-so-slow PHY-level model of the 802.11a specification and a not-so-slow PHY-level model of the 802.11a/b/g/n specifications.
-
-In |ns3|, nodes can have multiple WifiNetDevices on separate channels, and the
-WifiNetDevice can coexist with other device types; this removes an architectural
-limitation found in |ns2|. Presently, however, there is no model for
-cross-channel interference or coupling.
-
-The source code for the WifiNetDevice lives in the directory
-``src/wifi``.
-
-The implementation is modular and provides roughly four levels of models:
-
-* the **PHY layer models**
-* the so-called **MAC low models**: they implement DCF and EDCAF
-* the so-called **MAC high models**: they implement the MAC-level beacon
-  generation, probing, and association state machines, and
-* a set of **Rate control algorithms** used by the MAC low models
-
-Next, we provide some overview of each layer.
-More detailed information will be discussed later.
-
-MAC high models
-===============
-
-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``), 
-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``).
-
-The simplest of these is ``ns3::AdhocWifiMac``, which implements a
-Wi-Fi MAC that does not perform any kind of beacon generation,
-probing, or association. The ``ns3::StaWifiMac`` class implements
-an active probing and association state machine that handles automatic
-re-association whenever too many beacons are missed. Finally,
-``ns3::ApWifiMac`` implements an AP that generates periodic
-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
-configuration, an attribute ``QosSupported`` that allows
-configuration of 802.11e/WMM-style QoS support and an attribute ``HtSupported`` that allows configuration of 802.11n High Throughput style support.
-
-MAC low layer
-==============
-
-The **MAC low layer** is split into three components:
-
-#. ``ns3::MacLow`` which takes care of RTS/CTS/DATA/ACK transactions.
-#. ``ns3::DcfManager`` and ``ns3::DcfState`` which implements the DCF and EDCAF
-   functions.
-#. ``ns3::DcaTxop`` and ``ns3::EdcaTxopN`` which handle the packet queue,
-   packet fragmentation, and packet retransmissions if they are needed.
-   The ``ns3::DcaTxop`` object is used 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. 
-   ``ns3::EdcaTxopN`` is is used by QoS-enabled high MACs and also
-   performs 802.11n-style MSDU aggregation.
-
-Rate control algorithms
-=======================
-
-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 
-provided in a separate section.
-
-PHY layer models
-================
-
-The PHY layer implements a single model in the ``ns3::WifiPhy`` class: the
-physical layer model implemented there is described fully in a paper entitled
-`Yet Another Network Simulator <http://cutebugs.net/files/wns2-yans.pdf>`_
-Validation results for 802.11b are available in this
-`technical report <http://www.nsnam.org/~pei/80211b.pdf>`_
-
-.. _wifi-architecture:
-
-.. figure:: figures/WifiArchitecture.*
-   
-   WifiNetDevice architecture.
-
-Using the WifiNetDevice
-***********************
-
-The modularity provided by the implementation makes low-level configuration of
-the WifiNetDevice powerful but complex. For this reason, we provide some helper
-classes to perform common operations in a simple matter, and leverage the |ns3|
-attribute system to allow users to control the parametrization of the underlying
-models.
-
-Users who use the low-level |ns3| API and who wish to add a WifiNetDevice to
-their node must create an instance of a WifiNetDevice, plus a number of
-constituent objects, and bind them together appropriately (the WifiNetDevice is
-very modular in this regard, for future extensibility). At the low-level API,
-this can be done with about 20 lines of code (see ``ns3::WifiHelper::Install``,
-and ``ns3::YansWifiPhyHelper::Create``). They also must create, at some point, a
-WifiChannel, which also contains a number of constituent objects (see
-``ns3::YansWifiChannelHelper::Create``).
-
-However, a few helpers are available for users to add these devices and channels
-with only a few lines of code, if they are willing to use defaults, and the
-helpers provide additional API to allow the passing of attribute values to
-change default values.  Commonly used attribute values are listed in the
-Attributes section.  The scripts in ``examples/wireless`` can be browsed to
-see how this is done.  Next, we describe the common steps to create a WifiNetDevice
-from the bottom layer (WifiChannel) up to the device layer (WifiNetDevice).
-
-To create a WifiNetDevice, users need to configure mainly five steps:
-
-* Configure the WifiChannel: WifiChannel takes care of getting signal
-  from one device to other devices on the same wifi 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 WifiChannel.  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 
-  calculates the probability of successfully decoding the frame based on the signal.
-* Configure WifiMac: this step is more on 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) and/or HT (802.11n) features are supported or not.
-* Create WifiDevice: at this step, users configure the desired wifi standard
-  (e.g. **802.11b**, **802.11g**, **802.11a** or **802.11n**) and rate control algorithm
-* Configure mobility: finally, mobility model is (usually) required before WifiNetDevice
-  can be used.
-
-YansWifiChannelHelper
-=====================
-
-The YansWifiChannelHelper has an unusual name. Readers may wonder why it is
-named this way. The reference is to the `yans simulator
-<http://cutebugs.net/files/wns2-yans.pdf>`_ from which this model is taken. The
-helper can be used to create a WifiChannel with a default PropagationLoss and
-PropagationDelay model.
-
-Users will typically type code such as::
-
-  YansWifiChannelHelper wifiChannelHelper = YansWifiChannelHelper::Default ();
-  Ptr<WifiChannel> wifiChannel = wifiChannelHelper.Create ();
-
-to get the defaults.  Specifically, the default is a channel model with a
-propagation delay equal to a constant, the speed of light (``ns3::ConstantSpeedPropagationDelayModel``),
-and a propagation loss based on a default log distance model (``ns3::LogDistancePropagationLossModel``)), using a default exponent of 3.
-Please note that the default log distance model is configured with a reference
-loss of 46.6777 dB at reference distance of 1m.  The reference loss of 46.6777 dB
-was calculated using Friis propagation loss model at 5.15 GHz.  The reference loss
-must be changed if **802.11b**, **802.11g** or **802.11n** (at 2.4 GHz) are used since they operate at 2.4 Ghz.
-
-Note the distinction above in creating a helper object vs. an actual simulation
-object.  In |ns3|, helper objects (used at the helper API only) are created on
-the stack (they could also be created with operator new and later deleted).
-However, the actual |ns3| objects typically inherit from ``class ns3::Object``
-and are assigned to a smart pointer.  See the chapter in the |ns3| manual for
-a discussion of the |ns3| object model, if you are not familiar with it.
-
-The following two methods are useful when configuring YansWifiChannelHelper:
-
-* ``YansWifiChannelHelper::AddPropagationLoss`` adds a PropagationLossModel
-  to a chain of PropagationLossModel
-* ``YansWifiChannelHelper::SetPropagationDelay`` sets a PropagationDelayModel
-
-YansWifiPhyHelper
-=================
-
-Physical devices (base class ``ns3::WifiPhy``) connect to ``ns3::WifiChannel`` models in
-|ns3|.  We need to create WifiPhy objects appropriate for the YansWifiChannel; here
-the ``YansWifiPhyHelper`` will do the work.
-
-The YansWifiPhyHelper class configures an object factory to create instances of
-a ``YansWifiPhy`` and adds some other objects to it, including possibly a
-supplemental ErrorRateModel and a pointer to a MobilityModel. The user code is
-typically::
-
-  YansWifiPhyHelper wifiPhyHelper = YansWifiPhyHelper::Default ();
-  wifiPhyHelper.SetChannel (wifiChannel);
-
-The default YansWifiPhyHelper is configured with NistErrorRateModel
-(``ns3::NistErrorRateModel``). You can change the error rate model by
-calling the ``YansWifiPhyHelper::SetErrorRateModel`` method.
-
-Optionally, if pcap tracing is needed, a user may use the following
-command to enable pcap tracing::
-
-  YansWifiPhyHelper::SetPcapDataLinkType (enum SupportedPcapDataLinkTypes dlt)
-
-|ns3| supports RadioTap and Prism tracing extensions for 802.11.
-
-Note that we haven't actually created any WifiPhy objects yet; we've just
-prepared the YansWifiPhyHelper by telling it which channel it is connected to.
-The Phy objects are created in the next step.
-
-802.11n PHY layer can use either 20 or 40 MHz channel width, and either long (800 ns) or short (400 ns) OFDM guard intervals. To configure those parameters, the following lines of code could be used (in this example, it configures a 40 MHz channel width with a short guard interval)::
-
- wifiPhyHelper.Set (« ChannelBonding,BooleanValue(true));
- wifiPhyHelper.Set ("ShortGuardEnabled",BooleanValue(true));
-
-Furthermore, 802.11n provides an optional mode (GreenField mode) to reduce preamble durations and which is only compatible with 802.11n devices. This mode is enabled as follows::
-
- wifiPhyHelper.Set ("GreenfieldEnabled",BooleanValue(true));
-
-WifiMacHelper
-=============
-
-The next step is to configure the MAC model.
-We use WifiMacHelper to accomplish this.
-WifiMacHelper takes care of both the MAC low model and MAC high model.
-A user must decide if 802.11/WMM-style QoS and/or 802.11n-style High throughput (HT) support is required.
-
-NqosWifiMacHelper and QosWifiMacHelper
-++++++++++++++++++++++++++++++++++++++
-
-The ``ns3::NqosWifiMacHelper`` and ``ns3::QosWifiMacHelper`` configure an
-object factory to create instances of a ``ns3::WifiMac``. They are used to
-configure MAC parameters like type of MAC.  
-
-The former, ``ns3::NqosWifiMacHelper``, supports creation of MAC
-instances that do not have 802.11e/WMM-style QoS nor 802.11n-style High throughput (HT) support enabled. 
-
-For example the following user code configures a non-QoS and non-HT MAC that
-will be a non-AP STA in an infrastructure network where the AP has
-SSID ``ns-3-ssid``::
-
-    NqosWifiMacHelper wifiMacHelper = NqosWifiMacHelper::Default ();
-    Ssid ssid = Ssid ("ns-3-ssid");
-    wifiMacHelper.SetType ("ns3::StaWifiMac",
-                          "Ssid", SsidValue (ssid),
-                          "ActiveProbing", BooleanValue (false));
-
-To create MAC instances with QoS support enabled,
-``ns3::QosWifiMacHelper`` is used in place of
-``ns3::NqosWifiMacHelper``.
-
-The following code shows an example use of ``ns3::QosWifiMacHelper`` to 
-create an AP with QoS enabled::
-
-  QosWifiMacHelper wifiMacHelper = QosWifiMacHelper::Default ();
-  wifiMacHelper.SetType ("ns3::ApWifiMac",
-                         "Ssid", SsidValue (ssid),
-                         "BeaconGeneration", BooleanValue (true),
-                         "BeaconInterval", TimeValue (Seconds (2.5)));
-
-With QoS-enabled MAC models it is possible to work with traffic belonging to
-four different Access Categories (ACs): **AC_VO** for voice traffic,
-**AC_VI** for video traffic, **AC_BE** for best-effort
-traffic and **AC_BK** for background traffic.  In order for the
-MAC to determine the appropriate AC for an MSDU, packets forwarded
-down to these MAC layers should be marked using **ns3::QosTag** in
-order to set a TID (traffic id) for that packet otherwise it will be
-considered belonging to **AC_BE**.
-
-To create ad-hoc MAC instances, simply use ``ns3::AdhocWifiMac`` instead of ``ns3::StaWifiMac`` or ``ns3::ApWifiMac``.
-
-HtWifiMacHelper
-+++++++++++++++
-
-The ``ns3::HtWifiMacHelper`` configures an
-object factory to create instances of a ``ns3::WifiMac``. It is used to
-supports creation of MAC instances that have 802.11n-style High throughput (HT) and QoS support enabled. In particular, this object can be also used to set:
-
-* an MSDU aggregator for a particular Access Category (AC) in order to use 
-  802.11n MSDU aggregation feature;
-* block ack parameters like threshold (number of packets for which block ack
-  mechanism should be used) and inactivity timeout.
-
-For example the following user code configures a HT MAC that
-will be a non-AP STA with QoS enabled, aggregation on AC_VO, and Block Ack on AC_BE, in an infrastructure network where the AP has
-SSID ``ns-3-ssid``::
-
-    HtWifiMacHelper wifiMacHelper = HtWifiMacHelper::Default ();
-    Ssid ssid = Ssid ("ns-3-ssid");
-    wifiMacHelper.SetType ("ns3::StaWifiMac",
-                          "Ssid", SsidValue (ssid),
-                          "ActiveProbing", BooleanValue (false));
-
-    wifiMacHelper.SetMsduAggregatorForAc (AC_VO, "ns3::MsduStandardAggregator",
-                                          "MaxAmsduSize", UintegerValue (3839));
-    wifiMacHelper.SetBlockAckThresholdForAc (AC_BE, 10);
-    wifiMacHelper.SetBlockAckInactivityTimeoutForAc (AC_BE, 5);
-
-This object can be also used to set in the same way as ``ns3::QosWifiMacHelper``.
-
-WifiHelper
-==========
-
-We're now ready to create WifiNetDevices. First, let's create
-a WifiHelper with default settings::
-
-  WifiHelper wifiHelper = WifiHelper::Default ();
-
-What does this do?  It sets the default wifi standard to **802.11a** and sets the RemoteStationManager to
-``ns3::ArfWifiManager``.  You can change the RemoteStationManager by calling the
-``WifiHelper::SetRemoteStationManager`` method. To change the wifi standard, call the
-``WifiHelper::SetStandard`` method with the desired standard.
-
-Now, let's use the wifiPhyHelper and wifiMacHelper created above to install WifiNetDevices
-on a set of nodes in a NodeContainer "c"::
-
-  NetDeviceContainer wifiContainer = WifiHelper::Install (wifiPhyHelper, wifiMacHelper, c);
-
-This creates the WifiNetDevice which includes also a WifiRemoteStationManager, a
-WifiMac, and a WifiPhy (connected to the matching WifiChannel).
-
-The ``WifiHelper::SetStandard`` method set various default timing parameters as defined in the selected standard version, overwriting values that may exist or have been previously configured.
-In order to change parameters that are overwritten by ``WifiHelper::SetStandard``, this should be done post-install using ``Config::Set``::
-
-  WifiHelper wifi = WifiHelper::Default ();
-  wifi.SetStandard (WIFI_PHY_STANDARD_80211n_2_4GHZ);
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue("OfdmRate65MbpsBW20MHz"), "ControlMode", StringValue("OfdmRate6_5MbpsBW20MHz"));
-  HtWifiMacHelper mac = HtWifiMacHelper::Default ();
-
-  //Install PHY and MAC
-  Ssid ssid = Ssid ("ns3-wifi");
-  mac.SetType ("ns3::StaWifiMac",
-  "Ssid", SsidValue (ssid),
-  "ActiveProbing", BooleanValue (false));
-
-  NetDeviceContainer staDevice;
-  staDevice = wifi.Install (phy, mac, wifiStaNode);
-
-  mac.SetType ("ns3::ApWifiMac",
-  "Ssid", SsidValue (ssid));
-
-  NetDeviceContainer apDevice;
-  apDevice = wifi.Install (phy, mac, wifiApNode);
-
-  //Once install is done, we overwrite the standard timing values
-  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/Slot", TimeValue (MicroSeconds (slot)));
-  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/Sifs", TimeValue (MicroSeconds (sifs)));
-  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/AckTimeout", TimeValue (MicroSeconds (ackTimeout)));
-  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/CtsTimeout", TimeValue (MicroSeconds (ctsTimeout)));
-  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/Rifs", TimeValue (MicroSeconds (rifs)));
-  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/BasicBlockAckTimeout", TimeValue (MicroSeconds (basicBlockAckTimeout)));
-  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/CompressedBlockAckTimeout", TimeValue (MicroSeconds (compressedBlockAckTimeout)));
-
-There are many |ns3| attributes that can be set on the above helpers to
-deviate from the default behavior; the example scripts show how to do some of
-this reconfiguration.
-
-Mobility configuration
-======================
-
-Finally, a mobility model must be configured on each node with Wi-Fi device.
-Mobility model is used for calculating propagation loss and propagation delay.
-Two examples are provided in the next section.
-Users are referred to the chapter on :ref:`Mobility` module for detailed information.
-
-Example configuration
-=====================
-
-We provide two typical examples of how a user might configure a Wi-Fi network --
-one example with an ad-hoc network and one example with an infrastructure network.
-The two examples were modified from the two examples in the ``examples/wireless`` folder
-(``wifi-simple-adhoc.cc`` and ``wifi-simple-infra.cc``).
-Users are encouraged to see examples in the ``examples/wireless`` folder.
-
-AdHoc WifiNetDevice configuration
-+++++++++++++++++++++++++++++++++
-
-In this example, we create two ad-hoc nodes equipped with 802.11a Wi-Fi devices.
-We use the ``ns3::ConstantSpeedPropagationDelayModel`` as the propagation delay model and
-``ns3::LogDistancePropagationLossModel`` with the exponent of 3.0 as the propagation loss model.
-Both devices are configured with ``ConstantRateWifiManager`` at the fixed rate of 12Mbps.
-Finally, we manually place them by using the ``ns3::ListPositionAllocator``::
-
-  std::string phyMode ("OfdmRate12Mbps");
-
-  NodeContainer c;
-  c.Create (2);
-
-  WifiHelper wifi;
-  wifi.SetStandard (WIFI_PHY_STANDARD_80211a);
-
-  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
-  // ns-3 supports RadioTap and Prism tracing extensions for 802.11
-  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO); 
-
-  YansWifiChannelHelper wifiChannel;
-  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
-  wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel",
-                                  "Exponent", DoubleValue (3.0));
-  wifiPhy.SetChannel (wifiChannel.Create ());
-
-  // Add a non-QoS upper mac, and disable rate control (i.e. ConstantRateWifiManager)
-  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
-                                "DataMode",StringValue (phyMode),
-                                "ControlMode",StringValue (phyMode));
-  // Set it to adhoc mode
-  wifiMac.SetType ("ns3::AdhocWifiMac");
-  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
-
-  // Configure mobility
-  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 (c);
-
-  // other set up (e.g. InternetStack, Application)
-
-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.
-In this example, we create one access point and two clients.
-Each node is equipped with 802.11b Wi-Fi device::
-
-  std::string phyMode ("DsssRate1Mbps");
-
-  NodeContainer ap;
-  ap.Create (1);
-  NodeContainer sta;
-  sta.Create (2);
-
-  WifiHelper wifi;
-  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
-
-  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default (); 
-  // ns-3 supports RadioTap and Prism tracing extensions for 802.11
-  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO); 
-
-  YansWifiChannelHelper wifiChannel;
-  // reference loss must be changed since 802.11b is operating at 2.4GHz
-  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
-  wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel",
-                                  "Exponent", DoubleValue (3.0),
-				  "ReferenceLoss", DoubleValue (40.0459));
-  wifiPhy.SetChannel (wifiChannel.Create ());
-
-  // Add a non-QoS upper mac, and disable rate control
-  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
-                                "DataMode",StringValue (phyMode),
-                                "ControlMode",StringValue (phyMode));
-
-  // Setup the rest of the upper mac
-  Ssid ssid = Ssid ("wifi-default");
-  // setup ap.
-  wifiMac.SetType ("ns3::ApWifiMac",
-                   "Ssid", SsidValue (ssid));
-  NetDeviceContainer apDevice = wifi.Install (wifiPhy, wifiMac, ap);
-  NetDeviceContainer devices = apDevice;
-
-  // setup sta.
-  wifiMac.SetType ("ns3::StaWifiMac",
-                   "Ssid", SsidValue (ssid),
-                   "ActiveProbing", BooleanValue (false));
-  NetDeviceContainer staDevice = wifi.Install (wifiPhy, wifiMac, sta);
-  devices.Add (staDevice);
-
-  // Configure mobility
-  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));
-  positionAlloc->Add (Vector (0.0, 5.0, 0.0));
-  mobility.SetPositionAllocator (positionAlloc);
-  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
-  mobility.Install (ap);
-  mobility.Install (sta);
-
-  // other set up (e.g. InternetStack, Application)
-
-The WifiChannel and WifiPhy models
-**********************************
-
-The WifiChannel subclass can be used to connect together a set of
-``ns3::WifiNetDevice`` network interfaces. The class ``ns3::WifiPhy`` is the
-object within the WifiNetDevice that receives bits from the channel.  
-For the channel propagation modeling, the propagation module is used; see section :ref:`Propagation` for details.
-
-
-This section summarizes the description of the BER calculations found in the
-yans paper taking into account the Forward Error Correction present in 802.11a
-and describes the algorithm we implemented to decide whether or not a packet can
-be successfully received. See `"Yet Another Network Simulator"
-<http://cutebugs.net/files/wns2-yans.pdf>`_ for more details.
-
-The PHY layer can be in one of five states:
-
-#. TX: the PHY is currently transmitting a signal on behalf of its associated
-   MAC
-#. RX: the PHY is synchronized on a signal and is waiting until it has received
-   its last bit to forward it to the MAC.
-#. IDLE: the PHY is not in the TX, RX, or CCA BUSY states.
-#. CCA Busy: the PHY is not in TX or RX state but the measured energy is higher than the energy detection threshold.
-#. SLEEP: the PHY is in a power save mode and cannot send nor receive frames.
-
-When the first bit of a new packet is received while the PHY is not IDLE (that
-is, it is already synchronized on the reception of another earlier packet or it
-is sending data itself), the received packet is dropped. Otherwise, if the PHY
-is IDLE or CCA Busy, we calculate the received energy of the first bit of this new signal
-and compare it against our Energy Detection threshold (as defined by the Clear
-Channel Assessment function mode 1). If the energy of the packet k is higher,
-then the PHY moves to RX state and schedules an event when the last bit of the
-packet is expected to be received. Otherwise, the PHY stays in IDLE 
-or CCA Busy state and drops the packet.
-
-The energy of the received signal is assumed to be zero outside of the reception
-interval of packet k and is calculated from the transmission power with a
-path-loss propagation model in the reception interval.  where the path loss
-exponent, :math:`n`, is chosen equal to :math:`3`, the reference distance,
-:math:`d_0` is choosen equal to :math:`1.0m` and the reference energy is based
-based on a Friis propagation model.
-
-When the last bit of the packet upon which the PHY is synchronized is received,
-we need to calculate the probability that the packet is received with any error
-to decide whether or not the packet on which we were synchronized could be
-successfully received or not: a random number is drawn from a uniform
-distribution and is compared against the probability of error.
-
-To evaluate the probability of error, we start from the piecewise linear 
-functions shown in Figure :ref:`snir` and calculate the 
-SNIR function. 
-
-.. _snir:
-
-.. figure:: figures/snir.*
-   
-   *SNIR function over time.*
-
-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.  Please refer to [pei80211ofdm]_, [pei80211b]_, [lacage2006yans]_, [Haccoun]_ and [Frenger]_ for a detailed description of the available BER/PER models.
-
-WifiChannel configuration
-=========================
-
-The WifiChannel implementation uses the propagation loss and delay models provided within the |ns3| :ref:`Propagation` module.
-
-The MAC model
-*************
-
-The 802.11 Distributed Coordination Function is used to calculate when to grant
-access to the transmission medium. While implementing the DCF would have been
-particularly easy if we had used a recurring timer that expired every slot, we
-chose to use the method described in [ji2004sslswn]_
-where the backoff timer duration is lazily calculated whenever needed since it
-is claimed to have much better performance than the simpler recurring timer
-solution.
-
-The backoff procedure of DCF is described in section 9.2.5.2 of [ieee80211]_.
-
-*  “The backoff procedure shall be invoked for a STA to transfer a frame 
-   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 
-   additional transmissions are currently queued.”
-
-Thus, if the queue is empty, a newly arrived packet should be transmitted 
-immediately after channel is sensed idle for DIFS.  If queue is not empty 
-and after a successful MPDU that has no more fragments, a node should 
-also start the backoff timer.
-
-Some users have observed that the 802.11 MAC with an empty queue on an 
-idle channel will transmit the first frame arriving to the model 
-immediately without waiting for DIFS or backoff, and wonder whether this 
-is compliant.  According to the standard, “The backoff procedure shall 
-be invoked for a STA to transfer a frame when finding the medium busy 
-as indicated by either the physical or virtual CS mechanism.”  So in 
-this case, the medium is not found to be busy in recent past and the 
-station can transmit immediately. 
-
-The higher-level MAC functions are implemented in a set of other C++ classes and
-deal with:
-
-* packet fragmentation and defragmentation,
-* use of the RTS/CTS protocol,
-* rate control algorithm,
-* connection and disconnection to and from an Access Point,
-* the MAC transmission queue,
-* beacon generation,
-* MSDU aggregation,
-* etc.
-
-Rate control algorithms
-***********************
-
-Multiple rate control algorithms are available in |ns3|.
-Some rate control algorithms are modeled after real algorithms used in real devices;
-others are found in literature.
-The following rate control algorithms can be used by the MAC low layer:
-
-Algorithms found in real devices:
-
-* ``ArfWifiManager`` (default for ``WifiHelper``)
-* ``OnoeWifiManager``
-* ``ConstantRateWifiManager``
-* ``MinstrelWifiManager``
-
-Algorithms in literature:
-
-* ``IdealWifiManager``
-* ``AarfWifiManager`` [lacage2004aarfamrr]_
-* ``AmrrWifiManager`` [lacage2004aarfamrr]_
-* ``CaraWifiManager`` [kim2006cara]_
-* ``RraaWifiManager`` [wong2006rraa]_
-* ``AarfcdWifiManager`` [maguolo2008aarfcd]_
-* ``ParfWifiManager`` [akella2007parf]_
-* ``AparfWifiManager`` [chevillat2005aparf]_
-
-ConstantRateWifiManager
-=======================
-
-The constant rate control algorithm always uses the same
-transmission mode for every packet. Users can set a desired
-'DataMode' for all 'unicast' packets and 'ControlMode' for all
-'request' control packets (e.g. RTS).
-
-To specify different data mode for non-unicast packets, users
-must set the 'NonUnicastMode' attribute of the
-WifiRemoteStationManager.  Otherwise, WifiRemoteStationManager
-will use a mode with the lowest rate for non-unicast packets.
-
-The 802.11 standard is quite clear on the rules for selection
-of transmission parameters for control response frames (e.g.
-CTS and ACK).  |ns3| follows the standard and selects the rate
-of control response frames from the set of basic rates or
-mandatory rates. This means that control response frames may
-be sent using different rate even though the ConstantRateWifiManager
-is used.  The ControlMode attribute of the ConstantRateWifiManager
-is used for RTS frames only.  The rate of CTS and ACK frames are
-selected according to the 802.11 standard.  However, users can still
-manually add WifiMode to the basic rate set that will allow control
-response frames to be sent at other rates.  Please consult the
-`project wiki <http://www.nsnam.org/wiki>`_ on how to do this.
-
-Available attributes:
-
-* DataMode (default WifiMode::OfdmRate6Mbps): specify a mode for
-  all non-unicast packets
-* ControlMode (default WifiMode::OfdmRate6Mbps): specify a mode for
-  all 'request' control packets
-
-IdealWifiManager
-================
-
-The ideal rate control algorithm selects the best
-mode according to the SNR of the previous packet sent.
-Consider node *A* sending a unicast packet to node *B*.
-When *B* successfully receives the packet sent from *A*,
-*B* records the SNR of the received packet into a ``ns3::SnrTag``
-and adds the tag to an ACK back to *A*.
-By doing this, *A* is able to learn the SNR of the packet sent to *B*
-using an out-of-band mechanism (thus the name 'ideal').
-*A* then uses the SNR to select a transmission mode based
-on a set of SNR thresholds, which was built from a target BER and
-mode-specific SNR/BER curves.
-
-Available attribute:
-
-* BerThreshold (default 10e-6): The maximum Bit Error Rate
-  that is used to calculate the SNR threshold for each mode.
-
-MinstrelWifiManager
-===================
-
-The minstrel rate control algorithm is a rate control algorithm originated from
-madwifi project.  It is currently the default rate control algorithm of the Linux kernel.
-
-Minstrel keeps track of the probability of successfully sending a frame of each available rate.
-Minstrel then calculates the expected throughput by multiplying the probability with the rate.
-This approach is chosen to make sure that lower rates are not selected in favor of the higher
-rates (since lower rates are more likely to have higher probability).
-
-In minstrel, roughly 10 percent of transmissions are sent at the so-called lookaround rate.
-The goal of the lookaround rate is to force minstrel to try higher rate than the currently used rate.
-
-For a more detailed information about minstrel, see [linuxminstrel]_.
-
-Modifying Wifi model
-********************
-
-Modifying the default wifi model is one of the common tasks when performing research.
-We provide an overview of how to make changes to the default wifi model in this section.
-Depending on your goal, the common tasks are (in no particular order):
-
-* 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 
-  ``mac-low.*`` to accomplish this.  Handling of control frames is performed in
-  ``MacLow::ReceiveOk``.
-* 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.
-* Wi-Fi queue management.  The files ``dca-txop.*`` and ``edca-txop-n.*`` are of interested for this task.
-* Channel access management.  Users should modify the files ``dcf-manager.*``, which grant access to
-  ``DcaTxop`` and ``EdcaTxopN``.
-* Fragmentation and RTS threholds are handled by Wi-Fi remote station manager.  Note that Wi-Fi remote
-  station manager simply indicates if fragmentation and RTS are needed.  Fragmentation is handled by
-  ``DcaTxop`` or ``EdcaTxopN`` while RTS/CTS transaction is hanled by ``MacLow``.
-* Modifying or creating new rate control algorithms can be done by creating a new child class of Wi-Fi remote
-  station manager or modifying the existing ones.
-
-Note on the current implementation
-**********************************
-
-* 802.11g does not support 9 microseconds slot
-* PHY_RXSTART is not supported
-* 802.11e TXOP is not supported
-* 802.11n MIMO is not supported
-* PLCP preamble reception is not modeled
-* BSSBasicRateSet for 802.11b has been assumed to be 1-2 Mbit/s
-* BSSBasicRateSet for 802.11a has been assumed to be 6-12-24 Mbit/s
-* cases where RTS/CTS and ACK are transmitted using HT formats are not
-supported
-* rate control algorithms are not aware of HT rates; they will only use the 802.11a BSSBasicRateSet when 802.11n is configured
-
-Wifi Tracing
-************
-
-Should link to the list of traces exported by Doxygen
-
-
-References
-**********
-
-.. [ieee80211] IEEE Std 802.11-2007 *Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications*
-
-.. [pei80211b] \G. Pei and Tom Henderson, `Validation of ns-3 802.11b PHY model <http://www.nsnam.org/~pei/80211b.pdf>`__ 
-
-.. [pei80211ofdm] \G. Pei and Tom Henderson, `Validation of OFDM error rate model in ns-3 <http://www.nsnam.org/~pei/80211ofdm.pdf>`__ 
-
-.. [lacage2006yans] \M. Lacage and T. Henderson, `Yet another Network Simulator <http://cutebugs.net/files/wns2-yans.pdf>`__ 
-
-.. [Haccoun] \D. Haccoun and G. Begin, *High-Rate Punctured Convolutional Codes for Viterbi Sequential Decoding*, IEEE Transactions on Communications, Vol. 32, Issue 3, pp.315-319.
-
-.. [Frenger] \Pâl Frenger et al., "Multi-rate Convolutional Codes".
-
-.. [ji2004sslswn] \Z. Ji, J. Zhou, M. Takai and R. Bagrodia, *Scalable simulation of large-scale wireless networks with bounded inaccuracies*, in Proc. of the Seventh ACM Symposium on Modeling, Analysis and Simulation of Wireless and Mobile Systems, October 2004.
-
-.. [linuxminstrel] `minstrel linux wireless <http://wireless.kernel.org/en/developers/Documentation/mac80211/RateControl/minstrel>`_
-
-.. [lacage2004aarfamrr] \ M. Lacage, H. Manshaei, and T. Turletti, *IEEE 802.11 rate adaptation: a practical approach*, in Proc. 7th ACM International Symposium on Modeling, Analysis and Simulation of Wireless and Mobile Systems, 2004.
-
-.. [kim2006cara] \ J. Kim, S. Kim, S. Choi, and D. Qiao, *CARA: Collision-Aware Rate Adaptation for IEEE 802.11 WLANs*, in Proc. 25th IEEE International Conference on Computer Communications, 2006
-
-.. [wong2006rraa] \ S. Wong, H. Yang, S. Lu, and V. Bharghavan, *Robust Rate Adaptation for 802.11 Wireless Networks*, in Proc. 12th Annual International Conference on Mobile Computing and Networking, 2006
-
-.. [maguolo2008aarfcd] \ F. Maguolo, M. Lacage, and T. Turletti, *Efficient collision detection for auto rate fallback algorithm*, in IEEE Symposium on Computers and Communications, 2008
-
-.. [akella2007parf] \ A. Akella, G. Judd, S. Seshan, and P. Steenkiste, 'Self-management in chaotic wireless deployments', in Wireless Networks, Kluwer Academic Publishers, 2007, 13, 737-755.  `<http://www.cs.odu.edu/~nadeem/classes/cs795-WNS-S13/papers/enter-006.pdf>`__
-
-.. [chevillat2005aparf] \  Chevillat, P.; Jelitto, J., and Truong, H. L., 'Dynamic data rate and transmit power adjustment in IEEE 802.11 wireless LANs', in International Journal of Wireless Information Networks, Springer, 2005, 12, 123-145.  `<http://www.cs.mun.ca/~yzchen/papers/papers/rate_adaptation/80211_dynamic_rate_power_adjustment_chevillat_j2005.pdf>`__
diff -Naur ns-3.23/src/wifi/examples/test-interference-helper.cc ns-3.24/src/wifi/examples/test-interference-helper.cc
--- ns-3.23/src/wifi/examples/test-interference-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/examples/test-interference-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,274 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015
+ *
+ * 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: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+//
+// This script is used to verify the behavior of InterferenceHelper.
+//
+// The scenario consists of two IEEE 802.11 hidden stations and an access point.
+// The two stations have both a packet to transmit to the access point.
+//
+//
+// (xA,0,0)     (0,0,0)      (xB,0,0)
+//
+//    *   ----->   *   <-----   *
+//    |            |            |
+//   STA A         AP          STA B
+//
+//
+// The program can be configured at run-time by passing command-line arguments.
+// It enables to configure the delay between the transmission from station A
+// and the transmission from station B (--delay option). It is also possible to
+// select the tx power level (--txPowerA and --txPowerB options), the packet size
+// (--packetSizeA and --packetSizeB options) and the modulation (--txModeA and
+// --txModeB options) used for the respective transmissions.
+//
+// By default, IEEE 802.11a with long preamble type is considered, but those
+// parameters can be also picked among other IEEE 802.11 flavors and preamble
+// types available in the simulator (--standard and --preamble options).
+// Note that the program checks the consistency between the selected standard
+// the selected preamble type.
+//
+// The output of the program displays InterfenceHelper and YansWifiPhy trace
+// logs associated to the chosen scenario.
+//
+
+#include "ns3/core-module.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/yans-wifi-channel.h"
+#include "ns3/yans-wifi-phy.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/propagation-delay-model.h"
+#include "ns3/error-rate-model.h"
+#include "ns3/yans-error-rate-model.h"
+#include "ns3/ptr.h"
+#include "ns3/mobility-model.h"
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/vector.h"
+#include "ns3/packet.h"
+#include "ns3/simulator.h"
+#include "ns3/nstime.h"
+#include "ns3/command-line.h"
+#include "ns3/wifi-tx-vector.h"
+
+using namespace ns3;
+
+class InterferenceExperiment
+{
+public:
+  struct Input
+  {
+    Input ();
+    Time interval;
+    double xA;
+    double xB;
+    std::string txModeA;
+    std::string txModeB;
+    uint32_t txPowerLevelA;
+    uint32_t txPowerLevelB;
+    uint32_t packetSizeA;
+    uint32_t packetSizeB;
+    enum WifiPhyStandard standard;
+    enum WifiPreamble preamble;
+  };
+
+  InterferenceExperiment ();
+  void Run (struct InterferenceExperiment::Input input);
+
+private:
+  void SendA (void) const;
+  void SendB (void) const;
+  Ptr<YansWifiPhy> m_txA;
+  Ptr<YansWifiPhy> m_txB;
+  struct Input m_input;
+};
+
+void
+InterferenceExperiment::SendA (void) const
+{
+  Ptr<Packet> p = Create<Packet> (m_input.packetSizeA);
+  WifiTxVector txVector;
+  txVector.SetTxPowerLevel (m_input.txPowerLevelA);
+  txVector.SetMode (WifiMode (m_input.txModeA));
+  m_txA->SendPacket (p, txVector, m_input.preamble, 0, 0);
+}
+
+void
+InterferenceExperiment::SendB (void) const
+{
+  Ptr<Packet> p = Create<Packet> (m_input.packetSizeB);
+  WifiTxVector txVector;
+  txVector.SetTxPowerLevel (m_input.txPowerLevelB);
+  txVector.SetMode (WifiMode (m_input.txModeB));
+  m_txB->SendPacket (p, txVector, m_input.preamble, 0, 0);
+}
+
+InterferenceExperiment::InterferenceExperiment ()
+{
+}
+InterferenceExperiment::Input::Input ()
+  : interval (MicroSeconds (0)),
+    xA (-5),
+    xB (5),
+    txModeA ("OfdmRate54Mbps"),
+    txModeB ("OfdmRate54Mbps"),
+    txPowerLevelA (0),
+    txPowerLevelB (0),
+    packetSizeA (1500),
+    packetSizeB (1500),
+    standard (WIFI_PHY_STANDARD_80211a),
+    preamble (WIFI_PREAMBLE_LONG)
+{
+}
+
+void
+InterferenceExperiment::Run (struct InterferenceExperiment::Input input)
+{
+  m_input = input;
+
+  double range = std::max (std::abs (input.xA), input.xB);
+  Config::SetDefault ("ns3::RangePropagationLossModel::MaxRange", DoubleValue (range));
+
+  Ptr<YansWifiChannel> channel = CreateObject<YansWifiChannel> ();
+  channel->SetPropagationDelayModel (CreateObject<ConstantSpeedPropagationDelayModel> ());
+  Ptr<RangePropagationLossModel> loss = CreateObject<RangePropagationLossModel> ();
+  channel->SetPropagationLossModel (loss);
+
+  Ptr<MobilityModel> posTxA = CreateObject<ConstantPositionMobilityModel> ();
+  posTxA->SetPosition (Vector (input.xA, 0.0, 0.0));
+  Ptr<MobilityModel> posTxB = CreateObject<ConstantPositionMobilityModel> ();
+  posTxB->SetPosition (Vector (input.xB, 0.0, 0.0));
+  Ptr<MobilityModel> posRx = CreateObject<ConstantPositionMobilityModel> ();
+  posRx->SetPosition (Vector (0.0, 0.0, 0.0));
+
+  m_txA = CreateObject<YansWifiPhy> ();
+  m_txB = CreateObject<YansWifiPhy> ();
+  Ptr<YansWifiPhy> rx = CreateObject<YansWifiPhy> ();
+
+  Ptr<ErrorRateModel> error = CreateObject<YansErrorRateModel> ();
+  m_txA->SetErrorRateModel (error);
+  m_txB->SetErrorRateModel (error);
+  rx->SetErrorRateModel (error);
+  m_txA->SetChannel (channel);
+  m_txB->SetChannel (channel);
+  rx->SetChannel (channel);
+  m_txA->SetMobility (posTxA);
+  m_txB->SetMobility (posTxB);
+  rx->SetMobility (posRx);
+
+  m_txA->ConfigureStandard (input.standard);
+  m_txB->ConfigureStandard (input.standard);
+  rx->ConfigureStandard (input.standard);
+
+  Simulator::Schedule (Seconds (0), &InterferenceExperiment::SendA, this);
+  Simulator::Schedule (Seconds (0) + input.interval, &InterferenceExperiment::SendB, this);
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+}
+
+
+int main (int argc, char *argv[])
+{
+  InterferenceExperiment::Input input;
+  std::string str_standard = "WIFI_PHY_STANDARD_80211a";
+  std::string str_preamble = "WIFI_PREAMBLE_LONG";
+  double delay = 0; //microseconds
+
+  CommandLine cmd;
+  cmd.AddValue ("delay", "Delay in microseconds between frame transmission from sender A and frame transmission from sender B", delay);
+  cmd.AddValue ("xA", "The position of transmitter A (< 0)", input.xA);
+  cmd.AddValue ("xB", "The position of transmitter B (> 0)", input.xB);
+  cmd.AddValue ("packetSizeA", "Packet size in bytes of transmitter A", input.packetSizeA);
+  cmd.AddValue ("packetSizeB", "Packet size in bytes of transmitter B", input.packetSizeB);
+  cmd.AddValue ("txPowerA", "TX power level of transmitter A", input.txPowerLevelA);
+  cmd.AddValue ("txPowerB", "TX power level of transmitter B", input.txPowerLevelB);
+  cmd.AddValue ("txModeA", "Wifi mode used for payload transmission of sender A", input.txModeA);
+  cmd.AddValue ("txModeB", "Wifi mode used for payload transmission of sender B", input.txModeB);
+  cmd.AddValue ("standard", "IEEE 802.11 flavor", str_standard);
+  cmd.AddValue ("preamble", "Type of preamble", str_preamble);
+  cmd.Parse (argc, argv);
+
+  LogComponentEnable ("YansWifiPhy", LOG_LEVEL_ALL);
+  LogComponentEnable ("InterferenceHelper", LOG_LEVEL_ALL);
+
+  input.interval = MicroSeconds (delay);
+
+  if (input.xA >= 0 || input.xB <= 0)
+    {
+      std::cout << "Value of xA must be smaller than 0 and value of xB must be bigger than 0!" << std::endl;
+      return 0;
+    }
+
+  if (str_standard == "WIFI_PHY_STANDARD_80211a")
+    {
+      input.standard = WIFI_PHY_STANDARD_80211a;
+    }
+  else if (str_standard == "WIFI_PHY_STANDARD_80211b")
+    {
+      input.standard = WIFI_PHY_STANDARD_80211b;
+    }
+  else if (str_standard == "WIFI_PHY_STANDARD_80211g")
+    {
+      input.standard = WIFI_PHY_STANDARD_80211g;
+    }
+  else if (str_standard == "WIFI_PHY_STANDARD_80211n_2_4GHZ")
+    {
+      input.standard = WIFI_PHY_STANDARD_80211n_2_4GHZ;
+    }
+  else if (str_standard == "WIFI_PHY_STANDARD_80211n_5GHZ")
+    {
+      input.standard = WIFI_PHY_STANDARD_80211n_5GHZ;
+    }
+  else if (str_standard == "WIFI_PHY_STANDARD_80211ac")
+    {
+      input.standard = WIFI_PHY_STANDARD_80211ac;
+    }
+
+  if (str_preamble == "WIFI_PREAMBLE_LONG" && (input.standard == WIFI_PHY_STANDARD_80211a || input.standard == WIFI_PHY_STANDARD_80211b || input.standard == WIFI_PHY_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))
+    {
+      input.preamble = WIFI_PREAMBLE_SHORT;
+    }
+  else if (str_preamble == "WIFI_PREAMBLE_HT_MF" && (input.standard == WIFI_PHY_STANDARD_80211n_2_4GHZ || input.standard == WIFI_PHY_STANDARD_80211n_5GHZ))
+    {
+      input.preamble = WIFI_PREAMBLE_HT_MF;
+    }
+  else if (str_preamble == "WIFI_PREAMBLE_HT_GF" && (input.standard == WIFI_PHY_STANDARD_80211n_2_4GHZ || input.standard == WIFI_PHY_STANDARD_80211n_5GHZ))
+    {
+      input.preamble = WIFI_PREAMBLE_HT_GF;
+    }
+  else if (str_preamble == "WIFI_PREAMBLE_VHT" && input.standard == WIFI_PHY_STANDARD_80211ac)
+    {
+      input.preamble = WIFI_PREAMBLE_VHT;
+    }
+  else
+    {
+      std::cout << "Preamble does not exist or is not compatible with the selected standard!" << std::endl;
+      return 0;
+    }
+
+  InterferenceExperiment experiment;
+  experiment.Run (input);
+
+  return 0;
+}
diff -Naur ns-3.23/src/wifi/examples/wifi-phy-test.cc ns-3.24/src/wifi/examples/wifi-phy-test.cc
--- ns-3.23/src/wifi/examples/wifi-phy-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/examples/wifi-phy-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "ns3/wifi-net-device.h"
 #include "ns3/yans-wifi-channel.h"
 #include "ns3/yans-wifi-phy.h"
@@ -73,7 +74,7 @@
   WifiTxVector txVector;
   txVector.SetTxPowerLevel (m_input.txPowerLevel);
   txVector.SetMode (mode);
-  m_tx->SendPacket (p, txVector, WIFI_PREAMBLE_SHORT, 0);
+  m_tx->SendPacket (p, txVector, WIFI_PREAMBLE_LONG, 0, 0);
 }
 
 void
@@ -120,6 +121,9 @@
   tx->SetMobility (posTx);
   rx->SetMobility (posRx);
 
+  tx->ConfigureStandard (WIFI_PHY_STANDARD_80211a);
+  rx->ConfigureStandard (WIFI_PHY_STANDARD_80211a);
+
   rx->SetReceiveOkCallback (MakeCallback (&PsrExperiment::Receive, this));
 
   for (uint32_t i = 0; i < m_input.nPackets; ++i)
@@ -128,7 +132,7 @@
     }
   m_tx = tx;
   Simulator::Run ();
-  Simulator::Destroy();
+  Simulator::Destroy ();
   return m_output;
 }
 
@@ -178,7 +182,7 @@
   WifiTxVector txVector;
   txVector.SetTxPowerLevel (m_input.txPowerLevelA);
   txVector.SetMode (WifiMode (m_input.txModeA));
-  m_txA->SendPacket (p, txVector, WIFI_PREAMBLE_SHORT, 0);
+  m_txA->SendPacket (p, txVector, WIFI_PREAMBLE_LONG, 0, 0);
 }
 
 void
@@ -189,7 +193,7 @@
   WifiTxVector txVector;
   txVector.SetTxPowerLevel (m_input.txPowerLevelB);
   txVector.SetMode (WifiMode (m_input.txModeB));
-  m_txB->SendPacket (p, txVector, WIFI_PREAMBLE_SHORT, 0);
+  m_txB->SendPacket (p, txVector, WIFI_PREAMBLE_LONG, 0, 0);
 }
 
 void
@@ -263,6 +267,9 @@
   txB->SetMobility (posTxB);
   rx->SetMobility (posRx);
 
+  txA->ConfigureStandard (WIFI_PHY_STANDARD_80211a);
+  txB->ConfigureStandard (WIFI_PHY_STANDARD_80211a);
+  rx->ConfigureStandard (WIFI_PHY_STANDARD_80211a);
 
   rx->SetReceiveOkCallback (MakeCallback (&CollisionExperiment::Receive, this));
 
@@ -277,7 +284,7 @@
   m_txA = txA;
   m_txB = txB;
   Simulator::Run ();
-  Simulator::Destroy();
+  Simulator::Destroy ();
   return m_output;
 }
 
@@ -320,6 +327,7 @@
   cmd.AddValue ("NPackets", "The number of packets to send", input.nPackets);
   cmd.AddValue ("PacketSize", "The size of each packet sent", input.packetSize);
   cmd.Parse (argc, argv);
+
   for (input.distance = 1.0; input.distance < 165; input.distance += 2.0)
     {
       std::cout << input.distance;
@@ -372,6 +380,7 @@
   cmd.AddValue ("NPackets", "The number of packets to send", input.nPackets);
   cmd.AddValue ("TargetPsr", "The psr needed to assume that we are within range", targetPsr);
   cmd.Parse (argc, argv);
+
   for (input.packetSize = 10; input.packetSize < 3000; input.packetSize += 40)
     {
       double precision = 0.1;
@@ -406,6 +415,8 @@
   cmd.AddValue ("NPackets", "The number of packets to send for each transmitter", input.nPackets);
   cmd.AddValue ("xA", "the position of transmitter A", input.xA);
   cmd.AddValue ("xB", "the position of transmitter B", input.xB);
+  cmd.Parse (argc, argv);
+
   for (uint32_t i = 0; i < 100; i += 1)
     {
       CollisionExperiment experiment;
@@ -429,7 +440,6 @@
 }
 
 
-
 int main (int argc, char *argv[])
 {
   if (argc <= 1)
@@ -462,6 +472,10 @@
     {
       PrintPsrVsCollisionInterval (argc, argv);
     }
+  else
+    {
+      std::cout << "Wrong arguments!" << std::endl;
+    }
 
   return 0;
 }
diff -Naur ns-3.23/src/wifi/examples/wscript ns-3.24/src/wifi/examples/wscript
--- ns-3.23/src/wifi/examples/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/examples/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -7,3 +7,7 @@
     obj = bld.create_ns3_program('wifi-phy-test',
         ['core', 'mobility', 'network', 'wifi'])
     obj.source = 'wifi-phy-test.cc'
+
+    obj = bld.create_ns3_program('test-interference-helper',
+        ['core', 'mobility', 'network', 'wifi'])
+    obj.source = 'test-interference-helper.cc'
diff -Naur ns-3.23/src/wifi/helper/athstats-helper.cc ns-3.24/src/wifi/helper/athstats-helper.cc
--- ns-3.23/src/wifi/helper/athstats-helper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/athstats-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -29,7 +29,6 @@
 #include <iostream>
 #include <fstream>
 
-
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("Athstats");
@@ -73,7 +72,6 @@
   EnableAthstats (filename, nd->GetNode ()->GetId (), nd->GetIfIndex ());
 }
 
-
 void
 AthstatsHelper::EnableAthstats (std::string filename, NetDeviceContainer d)
 {
@@ -84,7 +82,6 @@
     }
 }
 
-
 void
 AthstatsHelper::EnableAthstats (std::string filename, NodeContainer n)
 {
@@ -100,10 +97,6 @@
   EnableAthstats (filename, devs);
 }
 
-
-
-
-
 NS_OBJECT_ENSURE_REGISTERED (AthstatsWifiTraceSink);
 
 TypeId
@@ -188,7 +181,6 @@
   ++m_rxCount;
 }
 
-
 void
 AthstatsWifiTraceSink::TxRtsFailedTrace (std::string context, Mac48Address address)
 {
@@ -217,8 +209,6 @@
   ++m_exceededRetryCount;
 }
 
-
-
 void
 AthstatsWifiTraceSink::PhyRxOkTrace (std::string context, Ptr<const Packet> packet, double snr, WifiMode mode, enum WifiPreamble preamble)
 {
@@ -240,7 +230,6 @@
   ++m_phyTxCount;
 }
 
-
 void
 AthstatsWifiTraceSink::PhyStateTrace (std::string context, Time start, Time duration, enum WifiPhy::State state)
 {
@@ -248,8 +237,6 @@
 
 }
 
-
-
 void
 AthstatsWifiTraceSink::Open (std::string const &name)
 {
@@ -269,26 +256,25 @@
   NS_LOG_LOGIC ("Writer opened successfully");
 }
 
-
 void
 AthstatsWifiTraceSink::WriteStats ()
 {
   NS_ABORT_MSG_UNLESS (this, "function called with null this pointer, now=" << Now () );
-  // the comments below refer to how each value maps to madwifi's athstats
-  // I know C strings are ugly but that's the quickest way to use exactly the same format as in madwifi
+  //The comments below refer to how each value maps to madwifi's athstats
+  //I know C strings are ugly but that's the quickest way to use exactly the same format as in madwifi
   char str[200];
   snprintf (str, 200, "%8u %8u %7u %7u %7u %6u %6u %6u %7u %4u %3uM\n",
             (unsigned int) m_txCount, // /proc/net/dev transmitted packets to which we should subract mgmt frames
             (unsigned int) m_rxCount, // /proc/net/dev received packets but subracts mgmt frames from it
-            (unsigned int) 0,        // ast_tx_altrate,
-            (unsigned int) m_shortRetryCount,    // ast_tx_shortretry,
-            (unsigned int) m_longRetryCount,     // ast_tx_longretry,
-            (unsigned int) m_exceededRetryCount, // ast_tx_xretries,
-            (unsigned int) m_phyRxErrorCount,    // ast_rx_crcerr,
-            (unsigned int) 0,        // ast_rx_badcrypt,
-            (unsigned int) 0,        // ast_rx_phyerr,
-            (unsigned int) 0,        // ast_rx_rssi,
-            (unsigned int) 0         // rate
+            (unsigned int) 0, // ast_tx_altrate
+            (unsigned int) m_shortRetryCount, // ast_tx_shortretry
+            (unsigned int) m_longRetryCount, // ast_tx_longretry
+            (unsigned int) m_exceededRetryCount, // ast_tx_xretries
+            (unsigned int) m_phyRxErrorCount,    // ast_rx_crcerr
+            (unsigned int) 0, // ast_rx_badcrypt
+            (unsigned int) 0, // ast_rx_phyerr
+            (unsigned int) 0, // ast_rx_rssi
+            (unsigned int) 0 // rate
             );
 
   if (m_writer)
@@ -301,9 +287,4 @@
     }
 }
 
-
-
-
-} // namespace ns3
-
-
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/helper/athstats-helper.h ns-3.24/src/wifi/helper/athstats-helper.h
--- ns-3.23/src/wifi/helper/athstats-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/athstats-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -34,7 +34,6 @@
 
 namespace ns3 {
 
-
 class NetDevice;
 
 /**
@@ -56,8 +55,6 @@
 };
 
 
-
-
 /**
  * @brief trace sink for wifi device that mimics madwifi's athstats tool.
  *
@@ -86,7 +83,6 @@
   AthstatsWifiTraceSink ();
   virtual ~AthstatsWifiTraceSink ();
 
-
   /**
    * function to be called when the net device transmits a packet
    *
@@ -192,8 +188,8 @@
    */
   void Open (std::string const& name);
 
-private:
 
+private:
   void WriteStats ();
   void ResetCounters ();
 
@@ -210,14 +206,8 @@
 
   Time m_interval;
 
-}; // class AthstatsWifiTraceSink
-
-
-
+}; //class AthstatsWifiTraceSink
 
 } // namespace ns3
 
-
-
-
 #endif /* ATHSTATS_HELPER_H */
diff -Naur ns-3.23/src/wifi/helper/ht-wifi-mac-helper.cc ns-3.24/src/wifi/helper/ht-wifi-mac-helper.cc
--- ns-3.23/src/wifi/helper/ht-wifi-mac-helper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/ht-wifi-mac-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Ghada Badawy <gbadawy@gmail.com>
  */
+
 #include "ht-wifi-mac-helper.h"
 #include "ns3/wifi-mac.h"
 #include "ns3/edca-txop-n.h"
@@ -39,10 +40,6 @@
 {
   HtWifiMacHelper helper;
 
-  // We're making Ht-enabled Wi-Fi MACs here, so we set the necessary
-  // attribute. I've carefully positioned this here so that someone
-  // who knows what they're doing can override with explicit
-  // attributes.
   helper.SetType ("ns3::StaWifiMac",
                   "QosSupported", BooleanValue (true),
                   "HtSupported", BooleanValue (true));
@@ -50,6 +47,17 @@
   return helper;
 }
 
+StringValue
+HtWifiMacHelper::DataRateForMcs (int mcs)
+{
+  std::stringstream sstmp;
+  std::string strtmp, dataRate;
 
-} // namespace ns3
+  sstmp << mcs;
+  sstmp >> strtmp;
+  dataRate = "HtMcs" + strtmp;
+  
+  return StringValue (dataRate);
+}
 
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/helper/ht-wifi-mac-helper.h ns-3.24/src/wifi/helper/ht-wifi-mac-helper.h
--- ns-3.23/src/wifi/helper/ht-wifi-mac-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/ht-wifi-mac-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,9 +17,11 @@
  *
  * Author: Ghada Badawy <gbadawy@gmail.com>
  */
+
 #ifndef HT_WIFI_MAC_HELPER_H
 #define HT_WIFI_MAC_HELPER_H
 
+#include "ns3/string.h"
 #include "wifi-helper.h"
 #include "ns3/qos-utils.h"
 #include "qos-wifi-mac-helper.h"
@@ -37,7 +39,7 @@
 {
 public:
   /**
-   * Create a QosWifiMacHelper that is used to make life easier when working
+   * Create a HtWifiMacHelper that is used to make life easier when working
    * with Wifi devices using a QOS MAC layer.
    */
   HtWifiMacHelper ();
@@ -52,8 +54,12 @@
    */
   static HtWifiMacHelper Default (void);
 
- };
+  /**
+   * Converts a HT MCS value into a DataRate value
+   */
+  static StringValue DataRateForMcs (int mcs);
+};
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* HT_WIFI_MAC_HELPER_H */
diff -Naur ns-3.23/src/wifi/helper/nqos-wifi-mac-helper.cc ns-3.24/src/wifi/helper/nqos-wifi-mac-helper.cc
--- ns-3.23/src/wifi/helper/nqos-wifi-mac-helper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/nqos-wifi-mac-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "nqos-wifi-mac-helper.h"
 #include "ns3/wifi-mac.h"
 #include "ns3/pointer.h"
@@ -37,10 +38,9 @@
 NqosWifiMacHelper::Default (void)
 {
   NqosWifiMacHelper helper;
-  // We're making non QoS-enabled Wi-Fi MACs here, so we set the
-  // necessary attribute. I've carefully positioned this here so that
-  // someone who knows what they're doing can override with explicit
-  // attributes.
+  //We're making non QoS-enabled Wi-Fi MACs here, so we set the
+  //necessary attribute. I've carefully positioned this here so that
+  //someone who knows what they're doing can override with explicit attributes.
   helper.SetType ("ns3::AdhocWifiMac",
                   "QosSupported", BooleanValue (false));
   return helper;
@@ -75,4 +75,4 @@
   return mac;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/helper/nqos-wifi-mac-helper.h ns-3.24/src/wifi/helper/nqos-wifi-mac-helper.h
--- ns-3.23/src/wifi/helper/nqos-wifi-mac-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/nqos-wifi-mac-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef NQOS_WIFI_MAC_HELPER_H
 #define NQOS_WIFI_MAC_HELPER_H
 
@@ -72,14 +73,14 @@
    * in the requested mac.
    */
   virtual void SetType (std::string type,
-                std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
-                std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
-                std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
-                std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue (),
-                std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
-                std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
-                std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
-                std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
+                        std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
+                        std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
+                        std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
+                        std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue (),
+                        std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
+                        std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
+                        std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
+                        std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
 protected:
   ObjectFactory m_mac;
 private:
diff -Naur ns-3.23/src/wifi/helper/qos-wifi-mac-helper.cc ns-3.24/src/wifi/helper/qos-wifi-mac-helper.cc
--- ns-3.23/src/wifi/helper/qos-wifi-mac-helper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/qos-wifi-mac-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "qos-wifi-mac-helper.h"
 #include "ns3/msdu-aggregator.h"
 #include "ns3/wifi-mac.h"
@@ -42,10 +43,9 @@
 {
   QosWifiMacHelper helper;
 
-  // We're making QoS-enabled Wi-Fi MACs here, so we set the necessary
-  // attribute. I've carefully positioned this here so that someone
-  // who knows what they're doing can override with explicit
-  // attributes.
+  //We're making QoS-enabled Wi-Fi MACs here, so we set the necessary
+  //attribute. I've carefully positioned this here so that someone
+  //who knows what they're doing can override with explicit attributes.
   helper.SetType ("ns3::StaWifiMac",
                   "QosSupported", BooleanValue (true));
 
@@ -114,7 +114,7 @@
   m_mpduAggregator.Set (n0, v0);
   m_mpduAggregator.Set (n1, v1);
   m_mpduAggregator.Set (n2, v2);
-  m_mpduAggregator.Set (n3, v3); 
+  m_mpduAggregator.Set (n3, v3);
 }
 
 void
@@ -137,10 +137,10 @@
   mac->GetAttribute (dcaAttrName, ptr);
   Ptr<EdcaTxopN> edca = ptr.Get<EdcaTxopN> ();
 
-  if (m_mpduAggregator.GetTypeId().GetUid() != 0)
+  if (m_mpduAggregator.GetTypeId ().GetUid () != 0)
     {
       Ptr<MpduAggregator> mpduaggregator = m_mpduAggregator.Create<MpduAggregator> ();
-      Ptr<MacLow> low = edca->Low();
+      Ptr<MacLow> low = edca->Low ();
       low->SetMpduAggregator (mpduaggregator);
     }
   if (it != m_aggregators.end ())
@@ -172,4 +172,4 @@
   return mac;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/helper/qos-wifi-mac-helper.h ns-3.24/src/wifi/helper/qos-wifi-mac-helper.h
--- ns-3.23/src/wifi/helper/qos-wifi-mac-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/qos-wifi-mac-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef QOS_WIFI_MAC_HELPER_H
 #define QOS_WIFI_MAC_HELPER_H
 
@@ -77,19 +78,19 @@
    * in the requested mac.
    */
   virtual void SetType (std::string type,
-                std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
-                std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
-                std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
-                std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue (),
-                std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
-                std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
-                std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
-                std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
+                        std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
+                        std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
+                        std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
+                        std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue (),
+                        std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
+                        std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
+                        std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
+                        std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
   /**
    * Set the class, type and attributes for the Msdu aggregator
    *
-   * \param ac access category for which we are setting aggregator. Possibilities
-   *  are: AC_BK, AC_BE, AC_VI, AC_VO.
+   * \param ac access category for which we are setting aggregator.
+   *        Possibilities are: AC_BK, AC_BE, AC_VI, AC_VO.
    * \param type the type of ns3::MsduAggregator to create.
    * \param n0 the name of the attribute to set
    * \param v0 the value of the attribute to set
@@ -108,36 +109,36 @@
                                std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
                                std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
                                std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue ());
- /**
-  * Set the class, type and attributes for the Mpdu aggregator
-  *
-  * \param ac access category for which we are setting aggregator. Possibilities
-  *  are: AC_BK, AC_BE, AC_VI, AC_VO.
-  * \param type the type of ns3::MsduAggregator to create.
-  * \param n0 the name of the attribute to set
-  * \param v0 the value of the attribute to set
-  * \param n1 the name of the attribute to set
-  * \param v1 the value of the attribute to set
-  * \param n2 the name of the attribute to set
-  * \param v2 the value of the attribute to set
-  * \param n3 the name of the attribute to set
-  * \param v3 the value of the attribute to set
-  *
-  * All the attributes specified in this method should exist
-  * in the requested aggregator.
-  */
+  /**
+   * Set the class, type and attributes for the Mpdu aggregator
+   *
+   * \param ac access category for which we are setting aggregator.
+   *        Possibilities are: AC_BK, AC_BE, AC_VI, AC_VO.
+   * \param type the type of ns3::MsduAggregator to create.
+   * \param n0 the name of the attribute to set
+   * \param v0 the value of the attribute to set
+   * \param n1 the name of the attribute to set
+   * \param v1 the value of the attribute to set
+   * \param n2 the name of the attribute to set
+   * \param v2 the value of the attribute to set
+   * \param n3 the name of the attribute to set
+   * \param v3 the value of the attribute to set
+   *
+   * All the attributes specified in this method should exist
+   * in the requested aggregator.
+   */
   void SetMpduAggregatorForAc (enum AcIndex ac, std::string type,
                                std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
                                std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
                                std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
-                               std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue ()); //A-MPDU
+                               std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue ());
   /**
    * This method sets value of block ack threshold for a specific access class.
    * If number of packets in the respective queue reaches this value block ack mechanism
    * is used.
    *
-   * \param ac access category for which we are setting block ack threshold. Possibilities
-   * are: AC_BK, AC_BE, AC_VI, AC_VO.
+   * \param ac access category for which we are setting block ack threshold.
+   *        Possibilities are: AC_BK, AC_BE, AC_VI, AC_VO.
    * \param threshold the threshold (number of packets)
    */
   void SetBlockAckThresholdForAc (enum AcIndex ac, uint8_t threshold);
@@ -148,13 +149,17 @@
    * that a block ack request or a MPDU with ack policy BLOCK ACK is received.
    * Timer is reset in a originator station every time that a block ack frame is received.
    *
-   * \param ac access category for which we are setting block ack threshold. Possibilities
-   * are: AC_BK, AC_BE, AC_VI, AC_VO.
+   * \param ac access category for which we are setting block ack threshold.
+   *        Possibilities are: AC_BK, AC_BE, AC_VI, AC_VO.
    * \param timeout number of block of 1024 microseconds.
    */
   void SetBlockAckInactivityTimeoutForAc (enum AcIndex ac, uint16_t timeout);
+
+
 protected:
   ObjectFactory m_mac;
+
+
 private:
   /**
    * \returns a newly-created MAC object.
@@ -164,8 +169,8 @@
   virtual Ptr<WifiMac> Create (void) const;
   void Setup (Ptr<WifiMac> mac, enum AcIndex ac, std::string dcaAttrName) const;
 
-  std::map<AcIndex, ObjectFactory> m_aggregators; //!<
-  ObjectFactory m_mpduAggregator;                 //!<
+  std::map<AcIndex, ObjectFactory> m_aggregators;
+  ObjectFactory m_mpduAggregator;
   /*
    * Next maps contain, for every access category, the values for
    * block ack threshold and block ack inactivity timeout.
@@ -174,6 +179,6 @@
   std::map<AcIndex, uint16_t> m_bAckInactivityTimeouts;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* QOS_WIFI_MAC_HELPER_H */
diff -Naur ns-3.23/src/wifi/helper/vht-wifi-mac-helper.cc ns-3.24/src/wifi/helper/vht-wifi-mac-helper.cc
--- ns-3.23/src/wifi/helper/vht-wifi-mac-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/helper/vht-wifi-mac-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,70 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 SEBASTIEN DERONNE
+ *
+ * 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: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "vht-wifi-mac-helper.h"
+#include "ns3/wifi-mac.h"
+#include "ns3/edca-txop-n.h"
+#include "ns3/pointer.h"
+#include "ns3/boolean.h"
+#include "ns3/uinteger.h"
+
+namespace ns3 {
+
+VhtWifiMacHelper::VhtWifiMacHelper ()
+{
+}
+
+VhtWifiMacHelper::~VhtWifiMacHelper ()
+{
+}
+
+VhtWifiMacHelper
+VhtWifiMacHelper::Default (void)
+{
+  VhtWifiMacHelper helper;
+
+  helper.SetType ("ns3::StaWifiMac",
+                  "QosSupported", BooleanValue (true),
+                  "HtSupported", BooleanValue (true), //by default, it also supports HT features
+                  "VhtSupported", BooleanValue (true));
+
+  //MPDU aggregation is always supported
+  helper.SetMpduAggregatorForAc (AC_VO, "ns3::MpduStandardAggregator");
+  helper.SetMpduAggregatorForAc (AC_VI, "ns3::MpduStandardAggregator");
+  helper.SetMpduAggregatorForAc (AC_BE, "ns3::MpduStandardAggregator");
+  helper.SetMpduAggregatorForAc (AC_BK, "ns3::MpduStandardAggregator");
+
+  return helper;
+}
+
+StringValue
+VhtWifiMacHelper::DataRateForMcs (int mcs)
+{
+  std::stringstream sstmp;
+  std::string strtmp, dataRate;
+
+  sstmp << mcs;
+  sstmp >> strtmp;
+  dataRate = "VhtMcs" + strtmp;
+  
+  return StringValue (dataRate);
+}
+
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/helper/vht-wifi-mac-helper.h ns-3.24/src/wifi/helper/vht-wifi-mac-helper.h
--- ns-3.23/src/wifi/helper/vht-wifi-mac-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/helper/vht-wifi-mac-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,66 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 SEBASTIEN DERONNE
+ *
+ * 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: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef VHT_WIFI_MAC_HELPER_H
+#define VHT_WIFI_MAC_HELPER_H
+
+#include "ns3/string.h"
+#include "wifi-helper.h"
+#include "ns3/qos-utils.h"
+#include "qos-wifi-mac-helper.h"
+#include <map>
+
+namespace ns3 {
+
+/**
+ * \brief create VHT-enabled MAC layers for a ns3::WifiNetDevice.
+ *
+ * This class can create MACs of type ns3::ApWifiMac, ns3::StaWifiMac,
+ * and, ns3::AdhocWifiMac, with QosSupported, HTSupported and VHTSupported attributes set to True.
+ */
+class VhtWifiMacHelper : public QosWifiMacHelper
+{
+public:
+  /**
+   * Create a VhtWifiMacHelper that is used to make life easier when working
+   * with Wifi devices using a QOS MAC layer.
+   */
+  VhtWifiMacHelper ();
+
+  /**
+   * \internal
+   * Destroy a VhtWifiMacHelper
+   */
+  virtual ~VhtWifiMacHelper ();
+
+  /**
+   * Create a mac helper in a default working state.
+   */
+  static VhtWifiMacHelper Default (void);
+
+  /**
+   * Converts a VHT MCS value into a DataRate value
+   */
+  static StringValue DataRateForMcs (int mcs);
+};
+
+} //namespace ns3
+
+#endif /* VHT_WIFI_MAC_HELPER_H */
diff -Naur ns-3.23/src/wifi/helper/wifi-helper.cc ns-3.24/src/wifi/helper/wifi-helper.cc
--- ns-3.23/src/wifi/helper/wifi-helper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/wifi-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -16,9 +16,10 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "wifi-helper.h"
 #include "ns3/wifi-net-device.h"
 #include "ns3/wifi-mac.h"
@@ -184,10 +185,10 @@
       Ptr<WifiNetDevice> wifi = DynamicCast<WifiNetDevice> (netDevice);
       if (wifi)
         {
-          // Handle any random numbers in the PHY objects.
+          //Handle any random numbers in the PHY objects.
           currentStream += wifi->GetPhy ()->AssignStreams (currentStream);
 
-          // Handle any random numbers in the station managers.
+          //Handle any random numbers in the station managers.
           Ptr<WifiRemoteStationManager> manager = wifi->GetRemoteStationManager ();
           Ptr<MinstrelWifiManager> minstrel = DynamicCast<MinstrelWifiManager> (manager);
           if (minstrel)
@@ -195,7 +196,7 @@
               currentStream += minstrel->AssignStreams (currentStream);
             }
 
-          // Handle any random numbers in the MAC objects.
+          //Handle any random numbers in the MAC objects.
           Ptr<WifiMac> mac = wifi->GetMac ();
           Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
           if (rmac)
@@ -221,7 +222,7 @@
               Ptr<EdcaTxopN> bk_edcaTxopN = ptr.Get<EdcaTxopN> ();
               currentStream += bk_edcaTxopN->AssignStreams (currentStream);
 
-              // if an AP, handle any beacon jitter
+              //if an AP, handle any beacon jitter
               Ptr<ApWifiMac> apmac = DynamicCast<ApWifiMac> (rmac);
               if (apmac)
                 {
@@ -233,4 +234,4 @@
   return (currentStream - stream);
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/helper/wifi-helper.h ns-3.24/src/wifi/helper/wifi-helper.h
--- ns-3.23/src/wifi/helper/wifi-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/wifi-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -16,9 +16,10 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef WIFI_HELPER_H
 #define WIFI_HELPER_H
 
@@ -51,6 +52,7 @@
   /**
    * \param node the node on which the PHY object will reside
    * \param device the device within which the PHY object will reside
+   *
    * \returns a new PHY object.
    *
    * Subclasses must implement this method to allow the ns3::WifiHelper class
@@ -63,6 +65,7 @@
   virtual Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<NetDevice> device) const = 0;
 };
 
+
 /**
  * \brief create MAC objects
  *
@@ -82,6 +85,7 @@
   virtual Ptr<WifiMac> Create (void) const = 0;
 };
 
+
 /**
  * \brief helps to create WifiNetDevice objects
  *
@@ -147,7 +151,7 @@
    * \returns a device container which contains all the devices created by this method.
    */
   virtual NetDeviceContainer Install (const WifiPhyHelper &phy,
-                              const WifiMacHelper &mac, NodeContainer c) const;
+                                      const WifiMacHelper &mac, NodeContainer c) const;
   /**
    * \param phy the PHY helper to create PHY objects
    * \param mac the MAC helper to create MAC objects
@@ -155,7 +159,7 @@
    * \returns a device container which contains all the devices created by this method.
    */
   virtual NetDeviceContainer Install (const WifiPhyHelper &phy,
-                              const WifiMacHelper &mac, Ptr<Node> node) const;
+                                      const WifiMacHelper &mac, Ptr<Node> node) const;
   /**
    * \param phy the PHY helper to create PHY objects
    * \param mac the MAC helper to create MAC objects
@@ -163,7 +167,7 @@
    * \returns a device container which contains all the devices created by this method.
    */
   virtual NetDeviceContainer Install (const WifiPhyHelper &phy,
-                              const WifiMacHelper &mac, std::string nodeName) const;
+                                      const WifiMacHelper &mac, std::string nodeName) const;
   /**
    * \param standard the phy standard to configure during installation
    *
@@ -204,18 +208,19 @@
   * have been assigned. The Install() method should have previously been
   * called by the user.
   *
-  * \param c NetDeviceContainer of the set of net devices for which the 
+  * \param c NetDeviceContainer of the set of net devices for which the
   *          WifiNetDevice should be modified to use fixed streams
   * \param stream first stream index to use
   * \return the number of stream indices assigned by this helper
   */
   int64_t AssignStreams (NetDeviceContainer c, int64_t stream);
 
+
 protected:
   ObjectFactory m_stationManager;
   enum WifiPhyStandard m_standard;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* WIFI_HELPER_H */
diff -Naur ns-3.23/src/wifi/helper/wifi-radio-energy-model-helper.cc ns-3.24/src/wifi/helper/wifi-radio-energy-model-helper.cc
--- ns-3.23/src/wifi/helper/wifi-radio-energy-model-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/helper/wifi-radio-energy-model-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,143 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
+ *
+ * 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: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
+ */
+
+#include "wifi-radio-energy-model-helper.h"
+#include "ns3/basic-energy-source-helper.h"
+#include "ns3/wifi-phy.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/config.h"
+#include "ns3/names.h"
+#include "ns3/wifi-tx-current-model.h"
+
+namespace ns3 {
+
+WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper ()
+{
+  m_radioEnergy.SetTypeId ("ns3::WifiRadioEnergyModel");
+  m_depletionCallback.Nullify ();
+  m_rechargedCallback.Nullify ();
+}
+
+WifiRadioEnergyModelHelper::~WifiRadioEnergyModelHelper ()
+{
+}
+
+void
+WifiRadioEnergyModelHelper::Set (std::string name, const AttributeValue &v)
+{
+  m_radioEnergy.Set (name, v);
+}
+
+void
+WifiRadioEnergyModelHelper::SetDepletionCallback (
+  WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback)
+{
+  m_depletionCallback = callback;
+}
+
+void
+WifiRadioEnergyModelHelper::SetRechargedCallback (
+  WifiRadioEnergyModel::WifiRadioEnergyRechargedCallback callback)
+{
+  m_rechargedCallback = callback;
+}
+
+void
+WifiRadioEnergyModelHelper::SetTxCurrentModel (std::string name,
+                                               std::string n0, const AttributeValue& v0,
+                                               std::string n1, const AttributeValue& v1,
+                                               std::string n2, const AttributeValue& v2,
+                                               std::string n3, const AttributeValue& v3,
+                                               std::string n4, const AttributeValue& v4,
+                                               std::string n5, const AttributeValue& v5,
+                                               std::string n6, const AttributeValue& v6,
+                                               std::string n7, const AttributeValue& v7)
+{
+  ObjectFactory factory;
+  factory.SetTypeId (name);
+  factory.Set (n0, v0);
+  factory.Set (n1, v1);
+  factory.Set (n2, v2);
+  factory.Set (n3, v3);
+  factory.Set (n4, v4);
+  factory.Set (n5, v5);
+  factory.Set (n6, v6);
+  factory.Set (n7, v7);
+  m_txCurrentModel = factory;
+}
+
+
+/*
+ * Private function starts here.
+ */
+
+Ptr<DeviceEnergyModel>
+WifiRadioEnergyModelHelper::DoInstall (Ptr<NetDevice> device,
+                                       Ptr<EnergySource> source) const
+{
+  NS_ASSERT (device != NULL);
+  NS_ASSERT (source != NULL);
+  // check if device is WifiNetDevice
+  std::string deviceName = device->GetInstanceTypeId ().GetName ();
+  if (deviceName.compare ("ns3::WifiNetDevice") != 0)
+    {
+      NS_FATAL_ERROR ("NetDevice type is not WifiNetDevice!");
+    }
+  Ptr<Node> node = device->GetNode ();
+  Ptr<WifiRadioEnergyModel> model = m_radioEnergy.Create ()->GetObject<WifiRadioEnergyModel> ();
+  NS_ASSERT (model != NULL);
+  // set energy source pointer
+  model->SetEnergySource (source);
+  // set energy depletion callback
+  // if none is specified, make a callback to WifiPhy::SetSleepMode
+  Ptr<WifiNetDevice> wifiDevice = DynamicCast<WifiNetDevice> (device);
+  Ptr<WifiPhy> wifiPhy = wifiDevice->GetPhy ();
+  if (m_depletionCallback.IsNull ())
+    {
+      model->SetEnergyDepletionCallback (MakeCallback (&WifiPhy::SetSleepMode, wifiPhy));
+    }
+  else
+    {
+      model->SetEnergyDepletionCallback (m_depletionCallback);
+    }
+  // set energy recharged callback
+  // if none is specified, make a callback to WifiPhy::ResumeFromSleep
+  if (m_rechargedCallback.IsNull ())
+    {
+      model->SetEnergyRechargedCallback (MakeCallback (&WifiPhy::ResumeFromSleep, wifiPhy));
+    }
+  else
+    {
+      model->SetEnergyRechargedCallback (m_rechargedCallback);
+    }
+  // add model to device model list in energy source
+  source->AppendDeviceEnergyModel (model);
+  // create and register energy model phy listener
+  wifiPhy->RegisterListener (model->GetPhyListener ());
+  //
+  if (m_txCurrentModel.GetTypeId ().GetUid ())
+    {
+      Ptr<WifiTxCurrentModel> txcurrent = m_txCurrentModel.Create<WifiTxCurrentModel> ();
+      model->SetTxCurrentModel (txcurrent);
+    }
+  return model;
+}
+
+} // namespace ns3
diff -Naur ns-3.23/src/wifi/helper/wifi-radio-energy-model-helper.h ns-3.24/src/wifi/helper/wifi-radio-energy-model-helper.h
--- ns-3.23/src/wifi/helper/wifi-radio-energy-model-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/helper/wifi-radio-energy-model-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,124 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+* Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
+*
+* 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: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
+*/
+
+#ifndef WIFI_RADIO_ENERGY_MODEL_HELPER_H
+#define WIFI_RADIO_ENERGY_MODEL_HELPER_H
+
+#include "ns3/energy-model-helper.h"
+#include "ns3/wifi-radio-energy-model.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup energy
+ * \brief Assign WifiRadioEnergyModel to wifi devices.
+ *
+ * This installer installs WifiRadioEnergyModel for only WifiNetDevice objects.
+ *
+ */
+class WifiRadioEnergyModelHelper : public DeviceEnergyModelHelper
+{
+public:
+  /**
+   * Construct a helper which is used to add a radio energy model to a node
+   */
+  WifiRadioEnergyModelHelper ();
+
+  /**
+   * Destroy a RadioEnergy Helper
+   */
+  ~WifiRadioEnergyModelHelper ();
+
+  /**
+   * \param name the name of the attribute to set
+   * \param v the value of the attribute
+   *
+   * Sets an attribute of the underlying PHY object.
+   */
+  void Set (std::string name, const AttributeValue &v);
+
+  /**
+   * \param callback Callback function for energy depletion handling.
+   *
+   * Sets the callback to be invoked when energy is depleted.
+   */
+  void SetDepletionCallback (
+    WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback);
+
+  /**
+   * \param callback Callback function for energy recharged handling.
+   *
+   * Sets the callback to be invoked when energy is recharged.
+   */
+  void SetRechargedCallback (
+    WifiRadioEnergyModel::WifiRadioEnergyRechargedCallback callback);
+
+  /**
+   * \param name the name of the model to set
+   * \param n0 the name of the attribute to set
+   * \param v0 the value of the attribute to set
+   * \param n1 the name of the attribute to set
+   * \param v1 the value of the attribute to set
+   * \param n2 the name of the attribute to set
+   * \param v2 the value of the attribute to set
+   * \param n3 the name of the attribute to set
+   * \param v3 the value of the attribute to set
+   * \param n4 the name of the attribute to set
+   * \param v4 the value of the attribute to set
+   * \param n5 the name of the attribute to set
+   * \param v5 the value of the attribute to set
+   * \param n6 the name of the attribute to set
+   * \param v6 the value of the attribute to set
+   * \param n7 the name of the attribute to set
+   * \param v7 the value of the attribute to set
+   *
+   * Configure a propagation delay for this channel.
+   */
+  void SetTxCurrentModel (std::string name,
+                          std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
+                          std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
+                          std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
+                          std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue (),
+                          std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
+                          std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
+                          std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
+                          std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
+
+private:
+  /**
+   * \param device Pointer to the NetDevice to install DeviceEnergyModel.
+   * \param source Pointer to EnergySource to install.
+   *
+   * Implements DeviceEnergyModel::Install.
+   */
+  virtual Ptr<DeviceEnergyModel> DoInstall (Ptr<NetDevice> device,
+                                            Ptr<EnergySource> source) const;
+
+private:
+  ObjectFactory m_radioEnergy;
+  WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback m_depletionCallback;
+  WifiRadioEnergyModel::WifiRadioEnergyRechargedCallback m_rechargedCallback;
+  ObjectFactory m_txCurrentModel;
+
+};
+
+} // namespace ns3
+
+#endif /* WIFI_RADIO_ENERGY_MODEL_HELPER_H */
diff -Naur ns-3.23/src/wifi/helper/yans-wifi-helper.cc ns-3.24/src/wifi/helper/yans-wifi-helper.cc
--- ns-3.23/src/wifi/helper/yans-wifi-helper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/yans-wifi-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,7 +15,8 @@
  * 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>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
 #include "ns3/trace-helper.h"
@@ -25,6 +26,7 @@
 #include "ns3/propagation-delay-model.h"
 #include "ns3/yans-wifi-channel.h"
 #include "ns3/yans-wifi-phy.h"
+#include "ns3/ampdu-subframe-header.h"
 #include "ns3/wifi-net-device.h"
 #include "ns3/radiotap-header.h"
 #include "ns3/pcap-file-wrapper.h"
@@ -172,7 +174,7 @@
   return channel;
 }
 
-int64_t 
+int64_t
 YansWifiChannelHelper::AssignStreams (Ptr<YansWifiChannel> c, int64_t stream)
 {
   return c->AssignStreams (stream);
@@ -198,12 +200,14 @@
 {
   m_channel = channel;
 }
+
 void
 YansWifiPhyHelper::SetChannel (std::string channelName)
 {
   Ptr<YansWifiChannel> channel = Names::Find<YansWifiChannel> (channelName);
   m_channel = channel;
 }
+
 void
 YansWifiPhyHelper::Set (std::string name, const AttributeValue &v)
 {
@@ -240,7 +244,6 @@
   Ptr<ErrorRateModel> error = m_errorRateModel.Create<ErrorRateModel> ();
   phy->SetErrorRateModel (error);
   phy->SetChannel (m_channel);
-  phy->SetMobility (node);
   phy->SetDevice (device);
   return phy;
 }
@@ -248,12 +251,13 @@
 static void
 PcapSniffTxEvent (
   Ptr<PcapFileWrapper> file,
-  Ptr<const Packet>   packet,
-  uint16_t            channelFreqMhz,
-  uint16_t            channelNumber,
-  uint32_t            rate,
-  bool                isShortPreamble,
-  uint8_t             txPower)
+  Ptr<const Packet>    packet,
+  uint16_t             channelFreqMhz,
+  uint16_t             channelNumber,
+  uint32_t             rate,
+  WifiPreamble         preamble,
+  WifiTxVector         txVector,
+  struct mpduInfo      aMpdu)
 {
   uint32_t dlt = file->GetDataLinkType ();
 
@@ -274,24 +278,29 @@
         uint8_t frameFlags = RadiotapHeader::FRAME_FLAG_NONE;
         header.SetTsft (Simulator::Now ().GetMicroSeconds ());
 
-        // Our capture includes the FCS, so we set the flag to say so.
+        //Our capture includes the FCS, so we set the flag to say so.
         frameFlags |= RadiotapHeader::FRAME_FLAG_FCS_INCLUDED;
 
-        if (isShortPreamble)
+        if (preamble == WIFI_PREAMBLE_SHORT)
           {
             frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE;
           }
 
+        if (txVector.IsShortGuardInterval ())
+          {
+            frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_GUARD;
+          }
+
         header.SetFrameFlags (frameFlags);
         header.SetRate (rate);
 
         uint16_t channelFlags = 0;
         switch (rate)
           {
-          case 2:  // 1Mbps
-          case 4:  // 2Mbps
-          case 10: // 5Mbps
-          case 22: // 11Mbps
+          case 2:  //1Mbps
+          case 4:  //2Mbps
+          case 10: //5Mbps
+          case 22: //11Mbps
             channelFlags |= RadiotapHeader::CHANNEL_FLAG_CCK;
             break;
 
@@ -310,7 +319,118 @@
           }
 
         header.SetChannelFrequencyAndFlags (channelFreqMhz, channelFlags);
-        
+
+        if (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF || preamble == WIFI_PREAMBLE_NONE)
+          {
+            uint8_t mcsRate = 0;
+            uint8_t mcsKnown = RadiotapHeader::MCS_KNOWN_NONE;
+            uint8_t mcsFlags = RadiotapHeader::MCS_FLAGS_NONE;
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_INDEX;
+            mcsRate = rate - 128;
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_BANDWIDTH;
+            if (txVector.GetChannelWidth () == 40000000)
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_BANDWIDTH_40;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_GUARD_INTERVAL;
+            if (txVector.IsShortGuardInterval ())
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_GUARD_INTERVAL;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_HT_FORMAT;
+            if (preamble == WIFI_PREAMBLE_HT_GF)
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_HT_GREENFIELD;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS;
+            if (txVector.GetNess () & 0x01) //bit 1
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_NESS_BIT_0;
+              }
+            if (txVector.GetNess () & 0x02) //bit 2
+              {
+                mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS_BIT_1;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_FEC_TYPE; //only BCC is currently supported
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_STBC;
+            if (txVector.IsStbc ())
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_STBC_STREAMS;
+              }
+
+            header.SetMcsFields (mcsKnown, mcsFlags, mcsRate);
+          }
+
+        if (txVector.IsAggregation ())
+          {
+            uint16_t ampduStatusFlags = RadiotapHeader::A_MPDU_STATUS_NONE;
+            ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_DELIMITER_CRC_KNOWN;
+            ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
+            /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
+            AmpduSubframeHeader hdr;
+            uint32_t extractedLength;
+            p->RemoveHeader (hdr);
+            extractedLength = hdr.GetLength ();
+            p = p->CreateFragment (0, static_cast<uint32_t> (extractedLength));
+            if (aMpdu.packetType == 2 || (hdr.GetEof () == true && hdr.GetLength () > 0))
+              {
+                ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
+              }
+            header.SetAmpduStatus (aMpdu.referenceNumber, ampduStatusFlags, hdr.GetCrc ());
+          }
+
+        if (preamble == WIFI_PREAMBLE_VHT)
+          {
+            uint16_t vhtKnown = RadiotapHeader::VHT_KNOWN_NONE;
+            uint8_t vhtFlags = RadiotapHeader::VHT_FLAGS_NONE;
+            uint8_t vhtBandwidth = 0;
+            uint8_t vhtMcsNss[4] = {0,0,0,0};
+            uint8_t vhtCoding = 0;
+            uint8_t vhtGroupId = 0;
+            uint16_t vhtPartialAid = 0;
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_STBC;
+            if (txVector.IsStbc ())
+              {
+                vhtFlags |= RadiotapHeader::VHT_FLAGS_STBC;
+              }
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_GUARD_INTERVAL;
+            if (txVector.IsShortGuardInterval ())
+              {
+                vhtFlags |= RadiotapHeader::VHT_FLAGS_GUARD_INTERVAL;
+              }
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_BEAMFORMED; //Beamforming is currently not supported
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_BANDWIDTH;
+            //not all bandwidth values are currently supported
+            if (txVector.GetChannelWidth () == 40000000)
+              {
+                vhtBandwidth = 1;
+              }
+            else if (txVector.GetChannelWidth () == 80000000)
+              {
+                vhtBandwidth = 4;
+              }
+            else if (txVector.GetChannelWidth () == 160000000)
+              {
+                vhtBandwidth = 11;
+              }
+
+            //only SU PPDUs are currently supported
+            vhtMcsNss[0] |= (txVector.GetNss () & 0x0f);
+            vhtMcsNss[0] |= (((rate - 128) << 4) & 0xf0);
+
+            header.SetVhtFields (vhtKnown, vhtFlags, vhtBandwidth, vhtMcsNss, vhtCoding, vhtGroupId, vhtPartialAid);
+          }
 
         p->AddHeader (header);
         file->Write (Simulator::Now (), p);
@@ -323,14 +443,15 @@
 
 static void
 PcapSniffRxEvent (
-  Ptr<PcapFileWrapper> file,
-  Ptr<const Packet> packet,
-  uint16_t channelFreqMhz,
-  uint16_t channelNumber,
-  uint32_t rate,
-  bool isShortPreamble,
-  double signalDbm,
-  double noiseDbm)
+  Ptr<PcapFileWrapper>  file,
+  Ptr<const Packet>     packet,
+  uint16_t              channelFreqMhz,
+  uint16_t              channelNumber,
+  uint32_t              rate,
+  WifiPreamble          preamble,
+  WifiTxVector          txVector,
+  struct mpduInfo       aMpdu,
+  struct signalNoiseDbm signalNoise)
 {
   uint32_t dlt = file->GetDataLinkType ();
 
@@ -351,24 +472,29 @@
         uint8_t frameFlags = RadiotapHeader::FRAME_FLAG_NONE;
         header.SetTsft (Simulator::Now ().GetMicroSeconds ());
 
-        // Our capture includes the FCS, so we set the flag to say so.
+        //Our capture includes the FCS, so we set the flag to say so.
         frameFlags |= RadiotapHeader::FRAME_FLAG_FCS_INCLUDED;
 
-        if (isShortPreamble)
+        if (preamble == WIFI_PREAMBLE_SHORT)
           {
             frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE;
           }
 
+        if (txVector.IsShortGuardInterval ())
+          {
+            frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_GUARD;
+          }
+
         header.SetFrameFlags (frameFlags);
         header.SetRate (rate);
 
         uint16_t channelFlags = 0;
         switch (rate)
           {
-          case 2:  // 1Mbps
-          case 4:  // 2Mbps
-          case 10: // 5Mbps
-          case 22: // 11Mbps
+          case 2:  //1Mbps
+          case 4:  //2Mbps
+          case 10: //5Mbps
+          case 22: //11Mbps
             channelFlags |= RadiotapHeader::CHANNEL_FLAG_CCK;
             break;
 
@@ -388,8 +514,120 @@
 
         header.SetChannelFrequencyAndFlags (channelFreqMhz, channelFlags);
 
-        header.SetAntennaSignalPower (signalDbm);
-        header.SetAntennaNoisePower (noiseDbm);
+        header.SetAntennaSignalPower (signalNoise.signal);
+        header.SetAntennaNoisePower (signalNoise.noise);
+
+        if (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF || preamble == WIFI_PREAMBLE_NONE)
+          {
+            uint8_t mcsRate = 0;
+            uint8_t mcsKnown = RadiotapHeader::MCS_KNOWN_NONE;
+            uint8_t mcsFlags = RadiotapHeader::MCS_FLAGS_NONE;
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_INDEX;
+            mcsRate = rate - 128;
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_BANDWIDTH;
+            if (txVector.GetChannelWidth () == 40000000)
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_BANDWIDTH_40;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_GUARD_INTERVAL;
+            if (txVector.IsShortGuardInterval ())
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_GUARD_INTERVAL;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_HT_FORMAT;
+            if (preamble == WIFI_PREAMBLE_HT_GF)
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_HT_GREENFIELD;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS;
+            if (txVector.GetNess () & 0x01) //bit 1
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_NESS_BIT_0;
+              }
+            if (txVector.GetNess () & 0x02) //bit 2
+              {
+                mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS_BIT_1;
+              }
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_FEC_TYPE; //only BCC is currently supported
+
+            mcsKnown |= RadiotapHeader::MCS_KNOWN_STBC;
+            if (txVector.IsStbc ())
+              {
+                mcsFlags |= RadiotapHeader::MCS_FLAGS_STBC_STREAMS;
+              }
+
+            header.SetMcsFields (mcsKnown, mcsFlags, mcsRate);
+          }
+
+        if (txVector.IsAggregation ())
+          {
+            uint16_t ampduStatusFlags = 0;
+            ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_DELIMITER_CRC_KNOWN;
+            ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
+            /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
+            AmpduSubframeHeader hdr;
+            uint32_t extractedLength;
+            p->RemoveHeader (hdr);
+            extractedLength = hdr.GetLength ();
+            p = p->CreateFragment (0, static_cast<uint32_t> (extractedLength));
+            if (aMpdu.packetType == 2 || (hdr.GetEof () == true && hdr.GetLength () > 0))
+              {
+                ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
+              }
+            header.SetAmpduStatus (aMpdu.referenceNumber, ampduStatusFlags, hdr.GetCrc ());
+          }
+
+        if (preamble == WIFI_PREAMBLE_VHT)
+          {
+            uint16_t vhtKnown = RadiotapHeader::VHT_KNOWN_NONE;
+            uint8_t vhtFlags = RadiotapHeader::VHT_FLAGS_NONE;
+            uint8_t vhtBandwidth = 0;
+            uint8_t vhtMcsNss[4] = {0,0,0,0};
+            uint8_t vhtCoding = 0;
+            uint8_t vhtGroupId = 0;
+            uint16_t vhtPartialAid = 0;
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_STBC;
+            if (txVector.IsStbc ())
+              {
+                vhtFlags |= RadiotapHeader::VHT_FLAGS_STBC;
+              }
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_GUARD_INTERVAL;
+            if (txVector.IsShortGuardInterval ())
+              {
+                vhtFlags |= RadiotapHeader::VHT_FLAGS_GUARD_INTERVAL;
+              }
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_BEAMFORMED; //Beamforming is currently not supported
+
+            vhtKnown |= RadiotapHeader::VHT_KNOWN_BANDWIDTH;
+            //not all bandwidth values are currently supported
+            if (txVector.GetChannelWidth () == 40000000)
+              {
+                vhtBandwidth = 1;
+              }
+            else if (txVector.GetChannelWidth () == 80000000)
+              {
+                vhtBandwidth = 4;
+              }
+            else if (txVector.GetChannelWidth () == 160000000)
+              {
+                vhtBandwidth = 11;
+              }
+
+            //only SU PPDUs are currently supported
+            vhtMcsNss[0] |= (txVector.GetNss () & 0x0f);
+            vhtMcsNss[0] |= (((rate - 128) << 4) & 0xf0);
+
+            header.SetVhtFields (vhtKnown, vhtFlags, vhtBandwidth, vhtMcsNss, vhtCoding, vhtGroupId, vhtPartialAid);
+          }
 
         p->AddHeader (header);
         file->Write (Simulator::Now (), p);
@@ -428,11 +666,9 @@
 void
 YansWifiPhyHelper::EnablePcapInternal (std::string prefix, Ptr<NetDevice> nd, bool promiscuous, bool explicitFilename)
 {
-  //
-  // All of the Pcap enable functions vector through here including the ones
-  // that are wandering through all of devices on perhaps all of the nodes in
-  // the system.  We can only deal with devices of type WifiNetDevice.
-  //
+  //All of the Pcap enable functions vector through here including the ones
+  //that are wandering through all of devices on perhaps all of the nodes in
+  //the system. We can only deal with devices of type WifiNetDevice.
   Ptr<WifiNetDevice> device = nd->GetObject<WifiNetDevice> ();
   if (device == 0)
     {
@@ -468,11 +704,9 @@
   Ptr<NetDevice> nd,
   bool explicitFilename)
 {
-  //
-  // All of the ascii enable functions vector through here including the ones
-  // that are wandering through all of devices on perhaps all of the nodes in
-  // the system.  We can only deal with devices of type WifiNetDevice.
-  //
+  //All of the ascii enable functions vector through here including the ones
+  //that are wandering through all of devices on perhaps all of the nodes in
+  //the system. We can only deal with devices of type WifiNetDevice.
   Ptr<WifiNetDevice> device = nd->GetObject<WifiNetDevice> ();
   if (device == 0)
     {
@@ -480,29 +714,23 @@
       return;
     }
 
-  //
-  // Our trace sinks are going to use packet printing, so we have to make sure
-  // that is turned on.
-  //
+  //Our trace sinks are going to use packet printing, so we have to make sure
+  //that is turned on.
   Packet::EnablePrinting ();
 
   uint32_t nodeid = nd->GetNode ()->GetId ();
   uint32_t deviceid = nd->GetIfIndex ();
   std::ostringstream oss;
 
-  //
-  // If we are not provided an OutputStreamWrapper, we are expected to create
-  // one using the usual trace filename conventions and write our traces
-  // without a context since there will be one file per context and therefore
-  // the context would be redundant.
-  //
+  //If we are not provided an OutputStreamWrapper, we are expected to create
+  //one using the usual trace filename conventions and write our traces
+  //without a context since there will be one file per context and therefore
+  //the context would be redundant.
   if (stream == 0)
     {
-      //
-      // Set up an output stream object to deal with private ofstream copy
-      // constructor and lifetime issues.  Let the helper decide the actual
-      // name of the file given the prefix.
-      //
+      //Set up an output stream object to deal with private ofstream copy
+      //constructor and lifetime issues. Let the helper decide the actual
+      //name of the file given the prefix.
       AsciiTraceHelper asciiTraceHelper;
 
       std::string filename;
@@ -516,12 +744,10 @@
         }
 
       Ptr<OutputStreamWrapper> theStream = asciiTraceHelper.CreateFileStream (filename);
-      //
-      // We could go poking through the phy and the state looking for the
-      // correct trace source, but we can let Config deal with that with
-      // some search cost.  Since this is presumably happening at topology
-      // creation time, it doesn't seem much of a price to pay.
-      //
+      //We could go poking through the phy and the state looking for the
+      //correct trace source, but we can let Config deal with that with
+      //some search cost.  Since this is presumably happening at topology
+      //creation time, it doesn't seem much of a price to pay.
       oss.str ("");
       oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/RxOk";
       Config::ConnectWithoutContext (oss.str (), MakeBoundCallback (&AsciiPhyReceiveSinkWithoutContext, theStream));
@@ -533,13 +759,11 @@
       return;
     }
 
-  //
-  // If we are provided an OutputStreamWrapper, we are expected to use it, and
-  // to provide a context.  We are free to come up with our own context if we
-  // want, and use the AsciiTraceHelper Hook*WithContext functions, but for
-  // compatibility and simplicity, we just use Config::Connect and let it deal
-  // with coming up with a context.
-  //
+  //If we are provided an OutputStreamWrapper, we are expected to use it, and
+  //to provide a context. We are free to come up with our own context if we
+  //want, and use the AsciiTraceHelper Hook*WithContext functions, but for
+  //compatibility and simplicity, we just use Config::Connect and let it deal
+  //with coming up with a context.
   oss.str ("");
   oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::WifiNetDevice/Phy/State/RxOk";
   Config::Connect (oss.str (), MakeBoundCallback (&AsciiPhyReceiveSinkWithContext, stream));
@@ -549,4 +773,4 @@
   Config::Connect (oss.str (), MakeBoundCallback (&AsciiPhyTransmitSinkWithContext, stream));
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/helper/yans-wifi-helper.h ns-3.24/src/wifi/helper/yans-wifi-helper.h
--- ns-3.23/src/wifi/helper/yans-wifi-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/helper/yans-wifi-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef YANS_WIFI_HELPER_H
 #define YANS_WIFI_HELPER_H
 
@@ -128,12 +129,13 @@
   /**
   * Assign a fixed random variable stream number to the random variables
   * used by the channel.  Typically this corresponds to random variables
-  * used in the propagation loss models.  Return the number of streams 
-  * (possibly zero) that have been assigned. 
+  * used in the propagation loss models.  Return the number of streams
+  * (possibly zero) that have been assigned.
   *
-  * \param c NetDeviceContainer of the set of net devices for which the 
+  * \param c NetDeviceContainer of the set of net devices for which the
   *          WifiNetDevice should be modified to use fixed streams
   * \param stream first stream index to use
+  *
   * \return the number of stream indices assigned by this helper
   */
   int64_t AssignStreams (Ptr<YansWifiChannel> c, int64_t stream);
@@ -144,6 +146,7 @@
   ObjectFactory m_propagationDelay;
 };
 
+
 /**
  * \brief Make it easy to create and manage PHY objects for the yans model.
  *
@@ -244,7 +247,7 @@
   void SetPcapDataLinkType (enum SupportedPcapDataLinkTypes dlt);
 
   /**
-   * Get the data link type of PCAP traces to be used. 
+   * Get the data link type of PCAP traces to be used.
    *
    * @see SupportedPcapDataLinkTypes
    *
@@ -300,6 +303,6 @@
   uint32_t m_pcapDlt;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* YANS_WIFI_HELPER_H */
diff -Naur ns-3.23/src/wifi/model/aarfcd-wifi-manager.cc ns-3.24/src/wifi/model/aarfcd-wifi-manager.cc
--- ns-3.23/src/wifi/model/aarfcd-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/aarfcd-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -48,10 +48,8 @@
   bool m_recovery;
   bool m_justModifyRate;
   uint32_t m_retry;
-
   uint32_t m_successThreshold;
   uint32_t m_timerTimeout;
-
   uint32_t m_rate;
   bool m_rtsOn;
   uint32_t m_rtsWnd;
@@ -115,22 +113,25 @@
   ;
   return tid;
 }
+
 AarfcdWifiManager::AarfcdWifiManager ()
   : WifiRemoteStationManager ()
 {
   NS_LOG_FUNCTION (this);
 }
+
 AarfcdWifiManager::~AarfcdWifiManager ()
 {
   NS_LOG_FUNCTION (this);
 }
+
 WifiRemoteStation *
 AarfcdWifiManager::DoCreateStation (void) const
 {
   NS_LOG_FUNCTION (this);
   AarfcdWifiRemoteStation *station = new AarfcdWifiRemoteStation ();
 
-  // aarf fields below
+  //aarf fields below
   station->m_successThreshold = m_minSuccessThreshold;
   station->m_timerTimeout = m_minTimerThreshold;
   station->m_rate = 0;
@@ -140,7 +141,7 @@
   station->m_retry = 0;
   station->m_timer = 0;
 
-  // aarf-cd specific fields below
+  //aarf-cd specific fields below
   station->m_rtsOn = false;
   station->m_rtsWnd = m_minRtsWnd;
   station->m_rtsCounter = 0;
@@ -190,7 +191,7 @@
       station->m_rtsCounter = station->m_rtsWnd;
       if (station->m_retry == 1)
         {
-          // need recovery fallback
+          //need recovery fallback
           if (m_turnOffRtsAfterRateDecrease)
             {
               TurnOffRts (station);
@@ -214,7 +215,7 @@
       station->m_rtsCounter = station->m_rtsWnd;
       if (((station->m_retry - 1) % 2) == 1)
         {
-          // need normal fallback
+          //need normal fallback
           if (m_turnOffRtsAfterRateDecrease)
             {
               TurnOffRts (station);
@@ -234,12 +235,14 @@
     }
   CheckRts (station);
 }
+
 void
 AarfcdWifiManager::DoReportRxOk (WifiRemoteStation *station,
                                  double rxSnr, WifiMode txMode)
 {
   NS_LOG_FUNCTION (this << station << rxSnr << txMode);
 }
+
 void
 AarfcdWifiManager::DoReportRtsOk (WifiRemoteStation *st,
                                   double ctsSnr, WifiMode ctsMode, double rtsSnr)
@@ -249,6 +252,7 @@
   NS_LOG_DEBUG ("station=" << station << " rts ok");
   station->m_rtsCounter--;
 }
+
 void
 AarfcdWifiManager::DoReportDataOk (WifiRemoteStation *st,
                                    double ackSnr, WifiMode ackMode, double dataSnr)
@@ -282,11 +286,13 @@
     }
   CheckRts (station);
 }
+
 void
 AarfcdWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
 {
   NS_LOG_FUNCTION (this << station);
 }
+
 void
 AarfcdWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
 {
@@ -298,8 +304,15 @@
 {
   NS_LOG_FUNCTION (this << st << size);
   AarfcdWifiRemoteStation *station = (AarfcdWifiRemoteStation *) st;
-  return WifiTxVector (GetSupported (station, station->m_rate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, station->m_rate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
+
 WifiTxVector
 AarfcdWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
 {
@@ -307,7 +320,13 @@
   /// \todo we could/should implement the Aarf algorithm for
   /// RTS only by picking a single rate within the BasicRateSet.
   AarfcdWifiRemoteStation *station = (AarfcdWifiRemoteStation *) st;
-  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
 bool
@@ -377,4 +396,4 @@
 }
 
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/aarfcd-wifi-manager.h ns-3.24/src/wifi/model/aarfcd-wifi-manager.h
--- ns-3.23/src/wifi/model/aarfcd-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/aarfcd-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Federico Maguolo <maguolof@dei.unipd.it>
  */
+
 #ifndef AARFCD_WIFI_MANAGER_H
 #define AARFCD_WIFI_MANAGER_H
 
@@ -104,20 +105,20 @@
    */
   void TurnOnRts (AarfcdWifiRemoteStation *station);
 
-  // aarf fields below
+  //aarf fields below
   uint32_t m_minTimerThreshold;
   uint32_t m_minSuccessThreshold;
   double m_successK;
   uint32_t m_maxSuccessThreshold;
   double m_timerK;
 
-  // aarf-cd fields below
+  //aarf-cd fields below
   uint32_t m_minRtsWnd;
   uint32_t m_maxRtsWnd;
   bool m_turnOffRtsAfterRateDecrease;
   bool m_turnOnRtsAfterRateIncrease;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* AARFCD_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/aarf-wifi-manager.cc ns-3.24/src/wifi/model/aarf-wifi-manager.cc
--- ns-3.23/src/wifi/model/aarf-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/aarf-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -19,7 +19,6 @@
  */
 
 #include "aarf-wifi-manager.h"
-
 #include "ns3/double.h"
 #include "ns3/uinteger.h"
 #include "ns3/log.h"
@@ -44,14 +43,11 @@
   uint32_t m_failed;
   bool m_recovery;
   uint32_t m_retry;
-
   uint32_t m_timerTimeout;
   uint32_t m_successThreshold;
-
   uint32_t m_rate;
 };
 
-
 NS_OBJECT_ENSURE_REGISTERED (AarfWifiManager);
 
 TypeId
@@ -93,6 +89,7 @@
 {
   NS_LOG_FUNCTION (this);
 }
+
 AarfWifiManager::~AarfWifiManager ()
 {
   NS_LOG_FUNCTION (this);
@@ -147,7 +144,7 @@
       NS_ASSERT (station->m_retry >= 1);
       if (station->m_retry == 1)
         {
-          // need recovery fallback
+          //need recovery fallback
           station->m_successThreshold = (int)(Min (station->m_successThreshold * m_successK,
                                                    m_maxSuccessThreshold));
           station->m_timerTimeout = (int)(Max (station->m_timerTimeout * m_timerK,
@@ -164,7 +161,7 @@
       NS_ASSERT (station->m_retry >= 1);
       if (((station->m_retry - 1) % 2) == 1)
         {
-          // need normal fallback
+          //need normal fallback
           station->m_timerTimeout = m_minTimerThreshold;
           station->m_successThreshold = m_minSuccessThreshold;
           if (station->m_rate != 0)
@@ -178,12 +175,14 @@
         }
     }
 }
+
 void
 AarfWifiManager::DoReportRxOk (WifiRemoteStation *station,
                                double rxSnr, WifiMode txMode)
 {
   NS_LOG_FUNCTION (this << station << rxSnr << txMode);
 }
+
 void
 AarfWifiManager::DoReportRtsOk (WifiRemoteStation *station,
                                 double ctsSnr, WifiMode ctsMode, double rtsSnr)
@@ -191,6 +190,7 @@
   NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
   NS_LOG_DEBUG ("station=" << station << " rts ok");
 }
+
 void
 AarfWifiManager::DoReportDataOk (WifiRemoteStation *st,
                                  double ackSnr, WifiMode ackMode, double dataSnr)
@@ -214,11 +214,13 @@
       station->m_recovery = true;
     }
 }
+
 void
 AarfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
 {
   NS_LOG_FUNCTION (this << station);
 }
+
 void
 AarfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
 {
@@ -230,8 +232,15 @@
 {
   NS_LOG_FUNCTION (this << st << size);
   AarfWifiRemoteStation *station = (AarfWifiRemoteStation *) st;
-  return WifiTxVector (GetSupported (station, station->m_rate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, station->m_rate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
+
 WifiTxVector
 AarfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
 {
@@ -239,7 +248,13 @@
   /// \todo we could/should implement the Aarf algorithm for
   /// RTS only by picking a single rate within the BasicRateSet.
   AarfWifiRemoteStation *station = (AarfWifiRemoteStation *) st;
-  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
 bool
@@ -249,4 +264,4 @@
   return true;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/aarf-wifi-manager.h ns-3.24/src/wifi/model/aarf-wifi-manager.h
--- ns-3.23/src/wifi/model/aarf-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/aarf-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef AARF_WIFI_MANAGER_H
 #define AARF_WIFI_MANAGER_H
 
@@ -40,7 +41,7 @@
   AarfWifiManager ();
   virtual ~AarfWifiManager ();
 private:
-  // overriden from base class
+  //overriden from base class
   virtual WifiRemoteStation * DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
@@ -63,7 +64,6 @@
   double m_timerK;
 };
 
-} // namespace ns3
-
+} //namespace ns3
 
 #endif /* AARF_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/adhoc-wifi-mac.cc ns-3.24/src/wifi/model/adhoc-wifi-mac.cc
--- ns-3.23/src/wifi/model/adhoc-wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/adhoc-wifi-mac.cc	2015-09-15 11:18:44.000000000 -0700
@@ -16,17 +16,16 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
-#include "adhoc-wifi-mac.h"
 
+#include "adhoc-wifi-mac.h"
 #include "ns3/pointer.h"
 #include "ns3/log.h"
 #include "ns3/string.h"
 #include "ns3/boolean.h"
 #include "ns3/trace-source-accessor.h"
-
 #include "qos-tag.h"
 #include "mac-low.h"
 #include "dcf-manager.h"
@@ -56,8 +55,7 @@
 AdhocWifiMac::AdhocWifiMac ()
 {
   NS_LOG_FUNCTION (this);
-
-  // Let the lower layers know that we are acting in an IBSS
+  //Let the lower layers know that we are acting in an IBSS
   SetTypeOfStation (ADHOC_STA);
 }
 
@@ -70,12 +68,12 @@
 AdhocWifiMac::SetAddress (Mac48Address address)
 {
   NS_LOG_FUNCTION (this << address);
-  // In an IBSS, the BSSID is supposed to be generated per Section
-  // 11.1.3 of IEEE 802.11. We don't currently do this - instead we
-  // make an IBSS STA a bit like an AP, with the BSSID for frames
-  // transmitted by each STA set to that STA's address.
+  //In an IBSS, the BSSID is supposed to be generated per Section
+  //11.1.3 of IEEE 802.11. We don't currently do this - instead we
+  //make an IBSS STA a bit like an AP, with the BSSID for frames
+  //transmitted by each STA set to that STA's address.
   //
-  // This is why we're overriding this method.
+  //This is why we're overriding this method.
   RegularWifiMac::SetAddress (address);
   RegularWifiMac::SetBssid (address);
 }
@@ -86,40 +84,40 @@
   NS_LOG_FUNCTION (this << packet << to);
   if (m_stationManager->IsBrandNew (to))
     {
-      // In ad hoc mode, we assume that every destination supports all
-      // the rates we support.
+      //In ad hoc mode, we assume that every destination supports all
+      //the rates we support.
       m_stationManager->AddAllSupportedModes (to);
       m_stationManager->RecordDisassociated (to);
     }
 
   WifiMacHeader hdr;
 
-  // If we are not a QoS STA then we definitely want to use AC_BE to
-  // transmit the packet. A TID of zero will map to AC_BE (through \c
-  // QosUtilsMapTidToAc()), so we use that as our default here.
+  //If we are not a QoS STA then we definitely want to use AC_BE to
+  //transmit the packet. A TID of zero will map to AC_BE (through \c
+  //QosUtilsMapTidToAc()), so we use that as our default here.
   uint8_t tid = 0;
 
-  // For now, a STA that supports QoS does not support non-QoS
-  // associations, and vice versa. In future the STA model should fall
-  // back to non-QoS if talking to a peer that is also non-QoS. At
-  // that point there will need to be per-station QoS state maintained
-  // by the association state machine, and consulted here.
+  //For now, a STA that supports QoS does not support non-QoS
+  //associations, and vice versa. In future the STA model should fall
+  //back to non-QoS if talking to a peer that is also non-QoS. At
+  //that point there will need to be per-station QoS state maintained
+  //by the association state machine, and consulted here.
   if (m_qosSupported)
     {
       hdr.SetType (WIFI_MAC_QOSDATA);
       hdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
       hdr.SetQosNoEosp ();
       hdr.SetQosNoAmsdu ();
-      // Transmission of multiple frames in the same TXOP is not
-      // supported for now
+      //Transmission of multiple frames in the same TXOP is not
+      //supported for now
       hdr.SetQosTxopLimit (0);
 
-      // Fill in the QoS control field in the MAC header
+      //Fill in the QoS control field in the MAC header
       tid = QosUtilsGetTidForPacket (packet);
-      // Any value greater than 7 is invalid and likely indicates that
-      // the packet had no QoS tag, so we revert to zero, which'll
-      // mean that AC_BE is used.
-      if (tid >= 7)
+      //Any value greater than 7 is invalid and likely indicates that
+      //the packet had no QoS tag, so we revert to zero, which will
+      //mean that AC_BE is used.
+      if (tid > 7)
         {
           tid = 0;
         }
@@ -138,7 +136,7 @@
 
   if (m_qosSupported)
     {
-      // Sanity check that the TID is valid
+      //Sanity check that the TID is valid
       NS_ASSERT (tid < 8);
       m_edca[QosUtilsMapTidToAc (tid)]->Queue (packet, hdr);
     }
@@ -154,9 +152,9 @@
   NS_LOG_FUNCTION (this << &linkUp);
   RegularWifiMac::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
-  // callback if one is set
+  //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
+  //callback if one is set
   linkUp ();
 }
 
@@ -181,10 +179,10 @@
       return;
     }
 
-  // Invoke the receive handler of our parent class to deal with any
-  // other frames. Specifically, this will handle Block Ack-related
-  // Management Action frames.
+  //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 (packet, hdr);
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/adhoc-wifi-mac.h ns-3.24/src/wifi/model/adhoc-wifi-mac.h
--- ns-3.23/src/wifi/model/adhoc-wifi-mac.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/adhoc-wifi-mac.h	2015-09-15 11:18:44.000000000 -0700
@@ -16,14 +16,13 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
 #ifndef ADHOC_WIFI_MAC_H
 #define ADHOC_WIFI_MAC_H
 
 #include "regular-wifi-mac.h"
-
 #include "amsdu-subframe-header.h"
 
 namespace ns3 {
@@ -61,10 +60,11 @@
    */
   virtual void Enqueue (Ptr<const Packet> packet, Mac48Address to);
 
+
 private:
   virtual void Receive (Ptr<Packet> packet, const WifiMacHeader *hdr);
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* ADHOC_WIFI_MAC_H */
diff -Naur ns-3.23/src/wifi/model/ampdu-subframe-header.cc ns-3.24/src/wifi/model/ampdu-subframe-header.cc
--- ns-3.23/src/wifi/model/ampdu-subframe-header.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ampdu-subframe-header.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Ghada Badawy <gbadawy@gmail.com>
  */
+
 #include "ampdu-subframe-header.h"
 #include "ns3/address-utils.h"
 
@@ -42,7 +43,8 @@
 }
 
 AmpduSubframeHeader::AmpduSubframeHeader ()
-  : m_length (0)
+  : m_length (0),
+    m_eof (0)
 {
 }
 
@@ -59,7 +61,7 @@
 void
 AmpduSubframeHeader::Serialize (Buffer::Iterator i) const
 {
-  i.WriteHtolsbU16 (m_length);
+  i.WriteHtolsbU16 ((m_eof << 15) | m_length);
   i.WriteU8 (m_crc);
   i.WriteU8 (m_sig);
 }
@@ -68,7 +70,9 @@
 AmpduSubframeHeader::Deserialize (Buffer::Iterator start)
 {
   Buffer::Iterator i = start;
-  m_length = i.ReadLsbtohU16 ();
+  uint16_t field = i.ReadLsbtohU16 ();
+  m_eof = (field & 0x8000) >> 15;
+  m_length = (field & 0x3fff);
   m_crc = i.ReadU8 ();
   m_sig = i.ReadU8 ();
   return i.GetDistanceFrom (start);
@@ -77,7 +81,7 @@
 void
 AmpduSubframeHeader::Print (std::ostream &os) const
 {
-  os << "length = " << m_length << ", CRC = " << m_crc << ", Signature = " << m_sig;
+  os << "EOF = " << m_eof << "length = " << m_length << ", CRC = " << m_crc << ", Signature = " << m_sig;
 }
 
 void
@@ -98,6 +102,12 @@
   m_length = length;
 }
 
+void
+AmpduSubframeHeader::SetEof (bool eof)
+{
+  m_eof = eof;
+}
+
 uint8_t
 AmpduSubframeHeader::GetCrc (void) const
 {
@@ -116,4 +126,10 @@
   return m_length;
 }
 
-} // namespace ns3
+bool
+AmpduSubframeHeader::GetEof (void) const
+{
+  return m_eof;
+}
+
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/ampdu-subframe-header.h ns-3.24/src/wifi/model/ampdu-subframe-header.h
--- ns-3.23/src/wifi/model/ampdu-subframe-header.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ampdu-subframe-header.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,91 +1,105 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013
- *
- * 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: Ghada Badawy <gbadawy@gmail.com>
- */
-#ifndef AMPDU_SUBFRAME_HEADER_H
-#define AMPDU_SUBFRAME_HEADER_H
-
-#include "ns3/header.h"
-#include "ns3/mac48-address.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- *
- *
- */
-class AmpduSubframeHeader : public Header
-{
-public:
-  AmpduSubframeHeader ();
-  virtual ~AmpduSubframeHeader ();
-
-  static TypeId GetTypeId (void);
-  virtual TypeId GetInstanceTypeId (void) const;
-  virtual void Print (std::ostream &os) const;
-  virtual uint32_t GetSerializedSize (void) const;
-  virtual void Serialize (Buffer::Iterator start) const;
-  virtual uint32_t Deserialize (Buffer::Iterator start);
-
-  /**
-   * Set the CRC field.
-   *
-   * \param crc
-   */
-  void SetCrc (uint8_t crc);
-  /**
-   * Set the SIG field.
-   *
-   * \param crc
-   */
-  void SetSig ();
-  /**
-   * Set the length field.
-   *
-   * \param length
-   */
-  void SetLength (uint16_t length);
-  /**
-   * Return the CRC field.
-   *
-   * \return the CRC field
-   */
-  uint8_t GetCrc (void) const;
-  /**
-   * Return the SIG field.
-   *
-   * \return the SIG field
-   */
-  uint8_t GetSig (void) const;
-  /**
-   * Return the length field.
-   *
-   * \return the length field
-   */
-  uint16_t GetLength (void) const;
-
-private:
-  uint8_t m_crc;     //!< CRC field
-  uint8_t m_sig;     //!< SIG field
-  uint16_t m_length; //!< length field
-};
-
-} // namespace ns3
-
-#endif /* AMPDU_SUBFRAME_HEADER_H */
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013
+ *
+ * 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: Ghada Badawy <gbadawy@gmail.com>
+ */
+
+#ifndef AMPDU_SUBFRAME_HEADER_H
+#define AMPDU_SUBFRAME_HEADER_H
+
+#include "ns3/header.h"
+#include "ns3/mac48-address.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ *
+ *
+ */
+class AmpduSubframeHeader : public Header
+{
+public:
+  AmpduSubframeHeader ();
+  virtual ~AmpduSubframeHeader ();
+
+  static TypeId GetTypeId (void);
+  virtual TypeId GetInstanceTypeId (void) const;
+  virtual void Print (std::ostream &os) const;
+  virtual uint32_t GetSerializedSize (void) const;
+  virtual void Serialize (Buffer::Iterator start) const;
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+  /**
+   * Set the CRC field.
+   *
+   * \param crc
+   */
+  void SetCrc (uint8_t crc);
+  /**
+   * Set the SIG field.
+   *
+   * \param crc
+   */
+  void SetSig ();
+  /**
+   * Set the length field.
+   *
+   * \param length
+   */
+  void SetLength (uint16_t length);
+  /**
+  * Set the EOF field.
+  *
+  * \param eof
+  */
+  void SetEof (bool eof);
+  /**
+   * Return the CRC field.
+   *
+   * \return the CRC field
+   */
+  uint8_t GetCrc (void) const;
+  /**
+   * Return the SIG field.
+   *
+   * \return the SIG field
+   */
+  uint8_t GetSig (void) const;
+  /**
+   * Return the length field.
+   *
+   * \return the length field
+   */
+  uint16_t GetLength (void) const;
+  /**
+   * Return the EOF field.
+   *
+   * \return the EOF field
+   */
+  bool GetEof (void) const;
+
+protected:
+  uint8_t m_crc;     //!< CRC field
+  uint8_t m_sig;     //!< SIG field
+  uint16_t m_length; //!< length field
+  bool m_eof;        //!< EOF field
+};
+
+} //namespace ns3
+
+#endif /* AMPDU_SUBFRAME_HEADER_H */
diff -Naur ns-3.23/src/wifi/model/ampdu-tag.cc ns-3.24/src/wifi/model/ampdu-tag.cc
--- ns-3.23/src/wifi/model/ampdu-tag.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ampdu-tag.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Ghada Badawy <gbadawy@gmail.com>
  */
+
 #include "ampdu-tag.h"
 #include "ns3/tag.h"
 #include "ns3/uinteger.h"
@@ -102,4 +103,4 @@
   os << "A-MPDU exists=" << m_ampdu;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/ampdu-tag.h ns-3.24/src/wifi/model/ampdu-tag.h
--- ns-3.23/src/wifi/model/ampdu-tag.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ampdu-tag.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,82 +1,84 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013
- *
- * 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: Ghada Badawy <gbadawy@gmail.com>
- */
-#ifndef AMPDU_TAG_H
-#define AMPDU_TAG_H
-
-#include "ns3/packet.h"
-
-namespace ns3 {
-
-class Tag;
-
-/**
- * \ingroup wifi
- *
- * The aim of the AmpduTag is to provide means for a MAC to specify that a packet includes A-MPDU
- * since this is done in HT-SIG and there is no HT-SIG representation in ns-3
- */
-class AmpduTag : public Tag
-{
-public:
-  static TypeId GetTypeId (void);
-  virtual TypeId GetInstanceTypeId (void) const;
-
-  /**
-   * Create a AmpduTag with the default =0 no Ampdu
-   */
-  AmpduTag ();
-  /**
-   * Set m_ampdu to 1.
-   */
-  void SetAmpdu (bool supported);
-  /**
-   * \param noofmpdus the number of MPDUs
-   *
-   * Set the number of MPDUs in the A-MPDU.
-   */
-  void SetNoOfMpdus (uint8_t noofmpdus);
-
-  virtual void Serialize (TagBuffer i) const;
-  virtual void Deserialize (TagBuffer i);
-  virtual uint32_t GetSerializedSize () const;
-  virtual void Print (std::ostream &os) const;
-
-  /**
-   * \return true if it is an A-MPDU,
-   *         false otherwise.
-   *
-   * Returns m_ampdu
-   */
-  bool GetAmpdu (void) const;
-  /**
-   * \return the number of MPDUs in an A-MPDU
-   *
-   * Returns the number of MPDUs in an A-MPDU
-   */
-  uint8_t GetNoOfMpdus (void) const;
-
-private:
-  uint8_t m_ampdu;     //!< Flag whether it is an A-MPDU
-  uint8_t m_noOfMpdus; //!< number of MPDUs in the A-MPDU
-};
-
-} // namespace ns3
-
-#endif /* AMPDU_TAG_H */
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013
+ *
+ * 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: Ghada Badawy <gbadawy@gmail.com>
+ */
+
+#ifndef AMPDU_TAG_H
+#define AMPDU_TAG_H
+
+#include "ns3/packet.h"
+
+namespace ns3 {
+
+class Tag;
+
+/**
+ * \ingroup wifi
+ *
+ * The aim of the AmpduTag is to provide means for a MAC to specify that a packet includes A-MPDU
+ * since this is done in HT-SIG and there is no HT-SIG representation in ns-3
+ */
+class AmpduTag : public Tag
+{
+public:
+  static TypeId GetTypeId (void);
+  virtual TypeId GetInstanceTypeId (void) const;
+
+  /**
+   * Create a AmpduTag with the default =0 no Ampdu
+   */
+  AmpduTag ();
+  /**
+   * Set m_ampdu to 1.
+   */
+  void SetAmpdu (bool supported);
+  /**
+   * \param noofmpdus the number of MPDUs
+   *
+   * Set the number of MPDUs in the A-MPDU.
+   */
+  void SetNoOfMpdus (uint8_t noofmpdus);
+
+  virtual void Serialize (TagBuffer i) const;
+  virtual void Deserialize (TagBuffer i);
+  virtual uint32_t GetSerializedSize () const;
+  virtual void Print (std::ostream &os) const;
+
+  /**
+   * \return true if it is an A-MPDU,
+   *         false otherwise.
+   *
+   * Returns m_ampdu
+   */
+  bool GetAmpdu (void) const;
+  /**
+   * \return the number of MPDUs in an A-MPDU
+   *
+   * Returns the number of MPDUs in an A-MPDU
+   */
+  uint8_t GetNoOfMpdus (void) const;
+
+private:
+  uint8_t m_ampdu;     //!< Flag whether it is an A-MPDU
+  uint8_t m_noOfMpdus; //!< number of MPDUs in the A-MPDU
+};
+
+} //namespace ns3
+
+#endif /* AMPDU_TAG_H */
+
diff -Naur ns-3.23/src/wifi/model/amrr-wifi-manager.cc ns-3.24/src/wifi/model/amrr-wifi-manager.cc
--- ns-3.23/src/wifi/model/amrr-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/amrr-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -110,18 +110,19 @@
   return station;
 }
 
-
 void
 AmrrWifiManager::DoReportRxOk (WifiRemoteStation *station,
                                double rxSnr, WifiMode txMode)
 {
   NS_LOG_FUNCTION (this << station << rxSnr << txMode);
 }
+
 void
 AmrrWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
 {
   NS_LOG_FUNCTION (this << station);
 }
+
 void
 AmrrWifiManager::DoReportDataFailed (WifiRemoteStation *st)
 {
@@ -130,12 +131,14 @@
   station->m_retry++;
   station->m_tx_retr++;
 }
+
 void
 AmrrWifiManager::DoReportRtsOk (WifiRemoteStation *st,
                                 double ctsSnr, WifiMode ctsMode, double rtsSnr)
 {
   NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
 }
+
 void
 AmrrWifiManager::DoReportDataOk (WifiRemoteStation *st,
                                  double ackSnr, WifiMode ackMode, double dataSnr)
@@ -145,11 +148,13 @@
   station->m_retry = 0;
   station->m_tx_ok++;
 }
+
 void
 AmrrWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
 {
   NS_LOG_FUNCTION (this << station);
 }
+
 void
 AmrrWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
 {
@@ -158,12 +163,14 @@
   station->m_retry = 0;
   station->m_tx_err++;
 }
+
 bool
 AmrrWifiManager::IsMinRate (AmrrWifiRemoteStation *station) const
 {
   NS_LOG_FUNCTION (this << station);
   return (station->m_txrate == 0);
 }
+
 bool
 AmrrWifiManager::IsMaxRate (AmrrWifiRemoteStation *station) const
 {
@@ -171,24 +178,28 @@
   NS_ASSERT (station->m_txrate + 1 <= GetNSupported (station));
   return (station->m_txrate + 1 == GetNSupported (station));
 }
+
 bool
 AmrrWifiManager::IsSuccess (AmrrWifiRemoteStation *station) const
 {
   NS_LOG_FUNCTION (this << station);
   return (station->m_tx_retr + station->m_tx_err) < station->m_tx_ok * m_successRatio;
 }
+
 bool
 AmrrWifiManager::IsFailure (AmrrWifiRemoteStation *station) const
 {
   NS_LOG_FUNCTION (this << station);
   return (station->m_tx_retr + station->m_tx_err) > station->m_tx_ok * m_failureRatio;
 }
+
 bool
 AmrrWifiManager::IsEnough (AmrrWifiRemoteStation *station) const
 {
   NS_LOG_FUNCTION (this << station);
   return (station->m_tx_retr + station->m_tx_err + station->m_tx_ok) > 10;
 }
+
 void
 AmrrWifiManager::ResetCnt (AmrrWifiRemoteStation *station)
 {
@@ -197,6 +208,7 @@
   station->m_tx_err = 0;
   station->m_tx_retr = 0;
 }
+
 void
 AmrrWifiManager::IncreaseRate (AmrrWifiRemoteStation *station)
 {
@@ -204,6 +216,7 @@
   station->m_txrate++;
   NS_ASSERT (station->m_txrate < GetNSupported (station));
 }
+
 void
 AmrrWifiManager::DecreaseRate (AmrrWifiRemoteStation *station)
 {
@@ -276,6 +289,7 @@
       ResetCnt (station);
     }
 }
+
 WifiTxVector
 AmrrWifiManager::DoGetDataTxVector (WifiRemoteStation *st, uint32_t size)
 {
@@ -321,20 +335,31 @@
           rateIndex = station->m_txrate;
         }
     }
-
-  return WifiTxVector (GetSupported (station, rateIndex), GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, rateIndex), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
+
 WifiTxVector
 AmrrWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
 {
   NS_LOG_FUNCTION (this << st);
   AmrrWifiRemoteStation *station = (AmrrWifiRemoteStation *)st;
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
   UpdateMode (station);
   /// \todo can we implement something smarter ?
-  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
-
 bool
 AmrrWifiManager::IsLowLatency (void) const
 {
@@ -342,4 +367,4 @@
   return true;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/amrr-wifi-manager.h ns-3.24/src/wifi/model/amrr-wifi-manager.h
--- ns-3.23/src/wifi/model/amrr-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/amrr-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef AMRR_WIFI_MANAGER_H
 #define AMRR_WIFI_MANAGER_H
 
@@ -43,8 +44,9 @@
 
   AmrrWifiManager ();
 
+
 private:
-  // overriden from base class
+  //overriden from base class
   virtual WifiRemoteStation * DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
@@ -90,6 +92,7 @@
    * minimum rate.
    *
    * \param station
+   *
    * \return true if the current rate is the minimum rate,
    *         false otherwise
    */
@@ -99,6 +102,7 @@
    * maximum rate.
    *
    * \param station
+   *
    * \return true if the current rate is the maximum rate,
    *         false otherwise
    */
@@ -108,6 +112,7 @@
    * is less than the number of successful transmission (times ratio).
    *
    * \param station
+   *
    * \return true if the number of retransmission and transmission error
    *              is less than the number of successful transmission
    *              (times ratio), false otherwise
@@ -118,6 +123,7 @@
    * is greater than the number of successful transmission (times ratio).
    *
    * \param station
+   *
    * \return true if the number of retransmission and transmission error
    *              is less than the number of successful transmission
    *              (times ratio), false otherwise
@@ -141,6 +147,6 @@
   uint32_t m_minSuccessThreshold;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* AMRR_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/amsdu-subframe-header.cc ns-3.24/src/wifi/model/amsdu-subframe-header.cc
--- ns-3.23/src/wifi/model/amsdu-subframe-header.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/amsdu-subframe-header.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "amsdu-subframe-header.h"
 #include "ns3/address-utils.h"
 #include "ns3/log.h"
@@ -131,4 +132,4 @@
   return m_length;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/amsdu-subframe-header.h ns-3.24/src/wifi/model/amsdu-subframe-header.h
--- ns-3.23/src/wifi/model/amsdu-subframe-header.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/amsdu-subframe-header.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef AMSDU_SUBFRAME_HEADER_H
 #define AMSDU_SUBFRAME_HEADER_H
 
@@ -56,6 +57,6 @@
   uint16_t m_length;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* AMSDU_SUBFRAME_HEADER_H */
diff -Naur ns-3.23/src/wifi/model/aparf-wifi-manager.cc ns-3.24/src/wifi/model/aparf-wifi-manager.cc
--- ns-3.23/src/wifi/model/aparf-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/aparf-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,13 +17,16 @@
  *
  * Author: Matias Richart <mrichart@fing.edu.uy>
  */
+
 #include "aparf-wifi-manager.h"
 #include "wifi-phy.h"
 #include "ns3/assert.h"
 #include "ns3/log.h"
 #include "ns3/uinteger.h"
 #include "ns3/trace-source-accessor.h"
+
 #define Min(a,b) ((a < b) ? a : b)
+
 NS_LOG_COMPONENT_DEFINE ("ns3::AparfWifiManager");
 
 namespace ns3 {
@@ -37,20 +40,16 @@
 struct
 AparfWifiRemoteStation : public WifiRemoteStation
 {
-  uint32_t m_nSuccess; //!< Number of successful transmission attempts.
-  uint32_t m_nFailed; //!< Number of failed transmission attempts.
-  uint32_t m_pCount; //!< Number of power changes.
-
-  uint32_t m_successThreshold; //!< The minimum number of successful transmissions to try a new power or rate.
-  uint32_t m_failThreshold; //!< The minimum number of failed transmissions to try a new power or rate.
-
-  uint32_t m_rate; //!< Current rate.
-  uint32_t m_rateCrit; //!< Critical rate.
-  uint8_t m_power; //!< Current power.
-
-  uint32_t m_nSupported; //!< Number of supported rates by the remote station.
-  bool m_initialized; //!< For initializing variables.
-
+  uint32_t m_nSuccess;                  //!< Number of successful transmission attempts.
+  uint32_t m_nFailed;                   //!< Number of failed transmission attempts.
+  uint32_t m_pCount;                    //!< Number of power changes.
+  uint32_t m_successThreshold;          //!< The minimum number of successful transmissions to try a new power or rate.
+  uint32_t m_failThreshold;             //!< The minimum number of failed transmissions to try a new power or rate.
+  uint32_t m_rate;                      //!< Current rate.
+  uint32_t m_rateCrit;                  //!< Critical rate.
+  uint8_t m_power;                      //!< Current power.
+  uint32_t m_nSupported;                //!< Number of supported rates by the remote station.
+  bool m_initialized;                   //!< For initializing variables.
   AparfWifiManager::State m_aparfState; //!< The estimated state of the channel.
 };
 
@@ -106,11 +105,11 @@
     .AddTraceSource ("PowerChange",
                      "The transmission power has change",
                      MakeTraceSourceAccessor (&AparfWifiManager::m_powerChange),
-                     "ns3::AparfWifiManager::PowerChangeTracedCallback")
+                     "ns3::WifiRemoteStationManager::PowerChangeTracedCallback")
     .AddTraceSource ("RateChange",
                      "The transmission rate has change",
                      MakeTraceSourceAccessor (&AparfWifiManager::m_rateChange),
-                     "ns3::AparfWifiManager::RateChangeTracedCallback")
+                     "ns3::WifiRemoteStationManager::RateChangeTracedCallback")
   ;
   return tid;
 }
@@ -119,6 +118,7 @@
 {
   NS_LOG_FUNCTION (this);
 }
+
 AparfWifiManager::~AparfWifiManager ()
 {
   NS_LOG_FUNCTION (this);
@@ -127,7 +127,8 @@
 void
 AparfWifiManager::SetupPhy (Ptr<WifiPhy> phy)
 {
-  m_nPower = phy->GetNTxPower ();
+  m_minPower = phy->GetTxPowerStart ();
+  m_maxPower = phy->GetTxPowerEnd ();
   WifiRemoteStationManager::SetupPhy (phy);
 }
 
@@ -158,7 +159,7 @@
     {
       station->m_nSupported = GetNSupported (station);
       station->m_rate = station->m_nSupported - 1;
-      station->m_power = m_nPower - 1;
+      station->m_power = m_maxPower;
       station->m_rateCrit = 0;
       m_powerChange (station->m_power, station->m_state->m_address);
       m_rateChange (station->m_rate, station->m_state->m_address);
@@ -197,7 +198,7 @@
       station->m_nFailed = 0;
       station->m_nSuccess = 0;
       station->m_pCount = 0;
-      if (station->m_power == (m_nPower - 1))
+      if (station->m_power == m_maxPower)
         {
           station->m_rateCrit = station->m_rate;
           if (station->m_rate != 0)
@@ -215,11 +216,13 @@
         }
     }
 }
+
 void
 AparfWifiManager::DoReportRxOk (WifiRemoteStation *station, double rxSnr, WifiMode txMode)
 {
   NS_LOG_FUNCTION (this << station << rxSnr << txMode);
 }
+
 void
 AparfWifiManager::DoReportRtsOk (WifiRemoteStation *station, double ctsSnr,
                                  WifiMode ctsMode, double rtsSnr)
@@ -227,6 +230,7 @@
   NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
   NS_LOG_DEBUG ("station=" << station << " rts ok");
 }
+
 void
 AparfWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr,
                                   WifiMode ackMode, double dataSnr)
@@ -258,7 +262,7 @@
       station->m_nFailed = 0;
       if (station->m_rate == (station->m_state->m_operationalRateSet.size () - 1))
         {
-          if (station->m_power != 0)
+          if (station->m_power != m_minPower)
             {
               NS_LOG_DEBUG ("station=" << station << " dec power");
               station->m_power -= m_powerDec;
@@ -280,7 +284,7 @@
             {
               if (station->m_pCount == m_powerMax)
                 {
-                  station->m_power = (m_nPower - 1);
+                  station->m_power = m_maxPower;
                   m_powerChange (station->m_power, station->m_state->m_address);
                   station->m_rate = station->m_rateCrit;
                   m_rateChange (station->m_rate, station->m_state->m_address);
@@ -289,7 +293,7 @@
                 }
               else
                 {
-                  if (station->m_power != 0)
+                  if (station->m_power != m_minPower)
                     {
                       station->m_power -= m_powerDec;
                       m_powerChange (station->m_power, station->m_state->m_address);
@@ -300,11 +304,13 @@
         }
     }
 }
+
 void
 AparfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
 {
   NS_LOG_FUNCTION (this << station);
 }
+
 void
 AparfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
 {
@@ -316,9 +322,16 @@
 {
   NS_LOG_FUNCTION (this << st << size);
   AparfWifiRemoteStation *station = (AparfWifiRemoteStation *) st;
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
   CheckInit (station);
-  return WifiTxVector (GetSupported (station, station->m_rate), station->m_power, GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas ()), GetNumberOfTransmitAntennas (station), GetStbc (station));
+  return WifiTxVector (GetSupported (station, station->m_rate), station->m_power, GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
+
 WifiTxVector
 AparfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
 {
@@ -326,7 +339,13 @@
   /// \todo we could/should implement the Arf algorithm for
   /// RTS only by picking a single rate within the BasicRateSet.
   AparfWifiRemoteStation *station = (AparfWifiRemoteStation *) st;
-  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas ()), GetNumberOfTransmitAntennas (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
 bool
@@ -336,4 +355,4 @@
   return true;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/aparf-wifi-manager.h ns-3.24/src/wifi/model/aparf-wifi-manager.h
--- ns-3.23/src/wifi/model/aparf-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/aparf-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Matias Richart <mrichart@fing.edu.uy>
  */
+
 #ifndef APARF_WIFI_MANAGER_H
 #define APARF_WIFI_MANAGER_H
 
@@ -61,24 +62,8 @@
     Spread
   };
 
-  /**
-   * TracedCallback signature for power change events.
-   *
-   * \param [in] power The new power.
-   * \param [in] address The remote station MAC address.
-   */
-  typedef void (*PowerChangeTracedCallback)(const uint8_t power, const Mac48Address remoteAddress);
-
-  /**
-   * TracedCallback signature for rate change events.
-   *
-   * \param [in] rate The new rate.
-   * \param [in] address The remote station MAC address.
-   */
-  typedef void (*RateChangeTracedCallback)(const uint32_t rate, const Mac48Address remoteAddress);
-
 private:
-  // overriden from base class
+  //overriden from base class
   virtual WifiRemoteStation * DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
@@ -102,18 +87,24 @@
 
   uint32_t m_succesMax1; //!< The minimum number of successful transmissions in \"High\" state to try a new power or rate.
   uint32_t m_succesMax2; //!< The minimum number of successful transmissions in \"Low\" state to try a new power or rate.
-  uint32_t m_failMax; //!< The minimum number of failed transmissions to try a new power or rate.
-  uint32_t m_powerMax; //!< The maximum number of power changes.
-  uint32_t m_powerInc; //!< Step size for increment the power.
-  uint32_t m_powerDec; //!< Step size for decrement the power.
-  uint32_t m_rateInc; //!< Step size for increment the rate.
-  uint32_t m_rateDec; //!< Step size for decrement the rate.
+  uint32_t m_failMax;    //!< The minimum number of failed transmissions to try a new power or rate.
+  uint32_t m_powerMax;   //!< The maximum number of power changes.
+  uint32_t m_powerInc;   //!< Step size for increment the power.
+  uint32_t m_powerDec;   //!< Step size for decrement the power.
+  uint32_t m_rateInc;    //!< Step size for increment the rate.
+  uint32_t m_rateDec;    //!< Step size for decrement the rate.
+
   /**
-   * Number of power levels.
+   * Minimal power level.
    * Differently form rate, power levels do not depend on the remote station.
    * The levels depend only on the physical layer of the device.
    */
-  uint32_t m_nPower;
+  uint32_t m_minPower;  
+
+  /**
+   * Maximal power level.
+   */
+  uint32_t m_maxPower;
 
   /**
    * The trace source fired when the transmission power change
@@ -126,6 +117,6 @@
 
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* APARF_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/ap-wifi-mac.cc ns-3.24/src/wifi/model/ap-wifi-mac.cc
--- ns-3.23/src/wifi/model/ap-wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ap-wifi-mac.cc	2015-09-15 11:18:44.000000000 -0700
@@ -16,18 +16,17 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
-#include "ap-wifi-mac.h"
 
+#include "ap-wifi-mac.h"
 #include "ns3/assert.h"
 #include "ns3/log.h"
 #include "ns3/simulator.h"
 #include "ns3/string.h"
 #include "ns3/pointer.h"
 #include "ns3/boolean.h"
-
 #include "qos-tag.h"
 #include "wifi-phy.h"
 #include "dcf-manager.h"
@@ -56,7 +55,8 @@
                    MakeTimeAccessor (&ApWifiMac::GetBeaconInterval,
                                      &ApWifiMac::SetBeaconInterval),
                    MakeTimeChecker ())
-    .AddAttribute ("BeaconJitter", "A uniform random variable to cause the initial beacon starting time (after simulation time 0) to be distributed between 0 and the BeaconInterval.",
+    .AddAttribute ("BeaconJitter", "A uniform random variable to cause the initial beacon starting time (after simulation time 0) "
+                   "to be distributed between 0 and the BeaconInterval.",
                    StringValue ("ns3::UniformRandomVariable"),
                    MakePointerAccessor (&ApWifiMac::m_beaconJitter),
                    MakePointerChecker<UniformRandomVariable> ())
@@ -84,7 +84,7 @@
   m_beaconDca->SetManager (m_dcfManager);
   m_beaconDca->SetTxMiddle (m_txMiddle);
 
-  // Let the lower layers know that we are acting as an AP.
+  //Let the lower layers know that we are acting as an AP.
   SetTypeOfStation (AP);
 
   m_enableBeaconGeneration = false;
@@ -109,8 +109,8 @@
 ApWifiMac::SetAddress (Mac48Address address)
 {
   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.
+  //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);
 }
@@ -158,9 +158,9 @@
   NS_LOG_FUNCTION (this << &linkUp);
   RegularWifiMac::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
-  // one is set
+  //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
+  //one is set
   linkUp ();
 }
 
@@ -195,19 +195,19 @@
                         Mac48Address to)
 {
   NS_LOG_FUNCTION (this << packet << from << to);
-  // If we are not a QoS AP then we definitely want to use AC_BE to
-  // transmit the packet. A TID of zero will map to AC_BE (through \c
-  // QosUtilsMapTidToAc()), so we use that as our default here.
+  //If we are not a QoS AP then we definitely want to use AC_BE to
+  //transmit the packet. A TID of zero will map to AC_BE (through \c
+  //QosUtilsMapTidToAc()), so we use that as our default here.
   uint8_t tid = 0;
 
-  // If we are a QoS AP then we attempt to get a TID for this packet
+  //If we are a QoS AP then we attempt to get a TID for this packet
   if (m_qosSupported)
     {
       tid = QosUtilsGetTidForPacket (packet);
-      // Any value greater than 7 is invalid and likely indicates that
-      // the packet had no QoS tag, so we revert to zero, which'll
-      // mean that AC_BE is used.
-      if (tid >= 7)
+      //Any value greater than 7 is invalid and likely indicates that
+      //the packet had no QoS tag, so we revert to zero, which'll
+      //mean that AC_BE is used.
+      if (tid > 7)
         {
           tid = 0;
         }
@@ -223,21 +223,21 @@
   NS_LOG_FUNCTION (this << packet << from << to << static_cast<uint32_t> (tid));
   WifiMacHeader hdr;
 
-  // For now, an AP that supports QoS does not support non-QoS
-  // associations, and vice versa. In future the AP model should
-  // support simultaneously associated QoS and non-QoS STAs, at which
-  // point there will need to be per-association QoS state maintained
-  // by the association state machine, and consulted here.
+  //For now, an AP that supports QoS does not support non-QoS
+  //associations, and vice versa. In future the AP model should
+  //support simultaneously associated QoS and non-QoS STAs, at which
+  //point there will need to be per-association QoS state maintained
+  //by the association state machine, and consulted here.
   if (m_qosSupported)
     {
       hdr.SetType (WIFI_MAC_QOSDATA);
       hdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
       hdr.SetQosNoEosp ();
       hdr.SetQosNoAmsdu ();
-      // Transmission of multiple frames in the same TXOP is not
-      // supported for now
+      //Transmission of multiple frames in the same TXOP is not
+      //supported for now
       hdr.SetQosTxopLimit (0);
-      // Fill in the QoS control field in the MAC header
+      //Fill in the QoS control field in the MAC header
       hdr.SetQosTid (tid);
     }
   else
@@ -245,8 +245,10 @@
       hdr.SetTypeData ();
     }
 
-  if (m_htSupported)
-   hdr.SetNoOrder();
+  if (m_htSupported || m_vhtSupported)
+    {
+      hdr.SetNoOrder ();
+    }
   hdr.SetAddr1 (to);
   hdr.SetAddr2 (GetAddress ());
   hdr.SetAddr3 (from);
@@ -255,7 +257,7 @@
 
   if (m_qosSupported)
     {
-      // Sanity check that the TID is valid
+      //Sanity check that the TID is valid
       NS_ASSERT (tid < 8);
       m_edca[QosUtilsMapTidToAc (tid)]->Queue (packet, hdr);
     }
@@ -279,9 +281,9 @@
 ApWifiMac::Enqueue (Ptr<const Packet> packet, Mac48Address to)
 {
   NS_LOG_FUNCTION (this << packet << to);
-  // We're sending this packet with a from address that is our own. We
-  // get that address from the lower MAC and make use of the
-  // from-spoofing Enqueue() method to avoid duplicated code.
+  //We're sending this packet with a from address that is our own. We
+  //get that address from the lower MAC and make use of the
+  //from-spoofing Enqueue() method to avoid duplicated code.
   Enqueue (packet, to, m_low->GetAddress ());
 }
 
@@ -297,55 +299,108 @@
 {
   NS_LOG_FUNCTION (this);
   SupportedRates rates;
-  // If it is an HT-AP then add the BSSMembershipSelectorSet 
-  // which only includes 127 for HT now. The standard says that the BSSMembershipSelectorSet
-  // must have its MSB set to 1 (must be treated as a Basic Rate)
-  // Also the standard mentioned that at leat 1 element should be included in the SupportedRates the rest can be in the ExtendedSupportedRates
-  if (m_htSupported)
+  //If it is an HT-AP then add the BSSMembershipSelectorSet
+  //which only includes 127 for HT now. The standard says that the BSSMembershipSelectorSet
+  //must have its MSB set to 1 (must be treated as a Basic Rate)
+  //Also the standard mentioned that at leat 1 element should be included in the SupportedRates the rest can be in the ExtendedSupportedRates
+  if (m_htSupported || m_vhtSupported)
     {
-      for (uint32_t i = 0; i < m_phy->GetNBssMembershipSelectors(); i++)
+      for (uint32_t i = 0; i < m_phy->GetNBssMembershipSelectors (); i++)
         {
-          rates.SetBasicRate(m_phy->GetBssMembershipSelector(i));
+          rates.SetBasicRate (m_phy->GetBssMembershipSelector (i));
         }
     }
-  // send the set of supported rates and make sure that we indicate
-  // the Basic Rate set in this set of supported rates.
+  //Send the set of supported rates and make sure that we indicate
+  //the Basic Rate set in this set of supported rates.
   for (uint32_t i = 0; i < m_phy->GetNModes (); i++)
     {
       WifiMode mode = m_phy->GetMode (i);
-      rates.AddSupportedRate (mode.GetDataRate ());
-      // add rates that are part of the BSSBasicRateSet (manufacturer dependent!)
-      // here we choose to add the mandatory rates to the BSSBasicRateSet,
-      // exept for 802.11b where we assume that only the two lowest mandatory rates are part of the BSSBasicRateSet
-      if (mode.IsMandatory() &&
-         ((mode.GetModulationClass () != WIFI_MOD_CLASS_DSSS) || mode == WifiPhy::GetDsssRate1Mbps () || mode == WifiPhy::GetDsssRate2Mbps ()))
-      {
-        m_stationManager->AddBasicMode (mode);
-      }
+      rates.AddSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), false, 1));
+      //Add rates that are part of the BSSBasicRateSet (manufacturer dependent!)
+      //here we choose to add the mandatory rates to the BSSBasicRateSet,
+      //exept for 802.11b where we assume that only the non HR-DSSS rates are part of the BSSBasicRateSet
+      if (mode.IsMandatory () && (mode.GetModulationClass () != WIFI_MOD_CLASS_HR_DSSS))
+        {
+          m_stationManager->AddBasicMode (mode);
+        }
     }
-  // set the basic rates
+  //set the basic rates
   for (uint32_t j = 0; j < m_stationManager->GetNBasicModes (); j++)
     {
       WifiMode mode = m_stationManager->GetBasicMode (j);
-      rates.SetBasicRate (mode.GetDataRate ());
+      rates.SetBasicRate (mode.GetDataRate (m_phy->GetChannelWidth (), false, 1));
     }
-  
+
   return rates;
 }
+
 HtCapabilities
 ApWifiMac::GetHtCapabilities (void) const
 {
- HtCapabilities capabilities;
- capabilities.SetHtSupported(1);
- capabilities.SetLdpc (m_phy->GetLdpc());
- capabilities.SetShortGuardInterval20 (m_phy->GetGuardInterval());
- capabilities.SetGreenfield (m_phy->GetGreenfield());
- for (uint8_t i =0 ; i < m_phy->GetNMcs();i++)
-  {
-     capabilities.SetRxMcsBitmask(m_phy->GetMcs(i));
-  }
- return capabilities;
+  HtCapabilities capabilities;
+  capabilities.SetHtSupported (1);
+  if (m_htSupported)
+    {
+      capabilities.SetLdpc (m_phy->GetLdpc ());
+      capabilities.SetSupportedChannelWidth (m_phy->GetChannelWidth () == 40);
+      capabilities.SetShortGuardInterval20 (m_phy->GetGuardInterval ());
+      capabilities.SetShortGuardInterval40 (m_phy->GetChannelWidth () == 40 && m_phy->GetGuardInterval ());
+      capabilities.SetGreenfield (m_phy->GetGreenfield ());
+      capabilities.SetMaxAmsduLength (1); //hardcoded for now (TBD)
+      capabilities.SetLSigProtectionSupport (!m_phy->GetGreenfield ());
+      capabilities.SetMaxAmpduLength (3); //hardcoded for now (TBD)
+      uint64_t maxSupportedRate = 0; //in bit/s
+      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+        {
+          WifiMode mcs = m_phy->GetMcs (i);
+          capabilities.SetRxMcsBitmask (mcs.GetMcsValue ());
+          if (mcs.GetDataRate (m_phy->GetGuardInterval (), m_phy->GetGuardInterval (), 1) > maxSupportedRate)
+            {
+              maxSupportedRate = mcs.GetDataRate (m_phy->GetGuardInterval (), m_phy->GetGuardInterval (), 1);
+            }
+        }
+      capabilities.SetRxHighestSupportedDataRate (maxSupportedRate / 1e6); //in Mbit/s
+      capabilities.SetTxMcsSetDefined (m_phy->GetNMcs () > 0);
+      capabilities.SetTxMaxNSpatialStreams (m_phy->GetNumberOfTransmitAntennas ());
+    }
+  return capabilities;
+}
+
+VhtCapabilities
+ApWifiMac::GetVhtCapabilities (void) const
+{
+  VhtCapabilities capabilities;
+  capabilities.SetVhtSupported (1);
+  if (m_vhtSupported)
+    {
+      if (m_phy->GetChannelWidth () == 160)
+        {
+          capabilities.SetSupportedChannelWidthSet (1);
+        }
+      else
+        {
+          capabilities.SetSupportedChannelWidthSet (0);
+        }
+      capabilities.SetMaxMpduLength (2); //hardcoded for now (TBD)
+      capabilities.SetRxLdpc (m_phy->GetLdpc ());
+      capabilities.SetShortGuardIntervalFor80Mhz ((m_phy->GetChannelWidth () == 80) && m_phy->GetGuardInterval ());
+      capabilities.SetShortGuardIntervalFor160Mhz ((m_phy->GetChannelWidth () == 160) && m_phy->GetGuardInterval ());
+      capabilities.SetMaxAmpduLengthExponent (7); //hardcoded for now (TBD)
+      uint8_t maxMcs = 0;
+      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+        {
+          WifiMode mcs = m_phy->GetMcs (i);
+          if (mcs.GetMcsValue () > maxMcs)
+            {
+              maxMcs = mcs.GetMcsValue ();
+            }
+        }
+      capabilities.SetRxMcsMap (maxMcs, 1); //Only 1 SS is currently supported
+      capabilities.SetTxMcsMap (maxMcs, 1); //Only 1 SS is currently supported
+    }
+  return capabilities;
 }
+
 void
 ApWifiMac::SendProbeResp (Mac48Address to)
 {
@@ -362,17 +417,21 @@
   probe.SetSsid (GetSsid ());
   probe.SetSupportedRates (GetSupportedRates ());
   probe.SetBeaconIntervalUs (m_beaconInterval.GetMicroSeconds ());
-if (m_htSupported)
+  if (m_htSupported || m_vhtSupported)
     {
-      probe.SetHtCapabilities (GetHtCapabilities());
-      hdr.SetNoOrder();
+      probe.SetHtCapabilities (GetHtCapabilities ());
+      hdr.SetNoOrder ();
+    }
+  if (m_vhtSupported)
+    {
+      probe.SetVhtCapabilities (GetVhtCapabilities ());
     }
   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.
+  //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_dca->Queue (packet, hdr);
 }
 
@@ -401,17 +460,21 @@
   assoc.SetSupportedRates (GetSupportedRates ());
   assoc.SetStatusCode (code);
 
- if (m_htSupported)
+  if (m_htSupported || m_vhtSupported)
+    {
+      assoc.SetHtCapabilities (GetHtCapabilities ());
+      hdr.SetNoOrder ();
+    }
+  if (m_vhtSupported)
     {
-      assoc.SetHtCapabilities (GetHtCapabilities());
-      hdr.SetNoOrder();
+      assoc.SetVhtCapabilities (GetVhtCapabilities ());
     }
   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.
+  //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_dca->Queue (packet, hdr);
 }
 
@@ -431,14 +494,18 @@
   beacon.SetSsid (GetSsid ());
   beacon.SetSupportedRates (GetSupportedRates ());
   beacon.SetBeaconIntervalUs (m_beaconInterval.GetMicroSeconds ());
-  if (m_htSupported)
+  if (m_htSupported || m_vhtSupported)
+    {
+      beacon.SetHtCapabilities (GetHtCapabilities ());
+      hdr.SetNoOrder ();
+    }
+  if (m_vhtSupported)
     {
-      beacon.SetHtCapabilities (GetHtCapabilities());
-      hdr.SetNoOrder();
+      beacon.SetVhtCapabilities (GetVhtCapabilities ());
     }
   packet->AddHeader (beacon);
 
-  // The beacon has it's own special queue, so we load it in there
+  //The beacon has it's own special queue, so we load it in there
   m_beaconDca->Queue (packet, hdr);
   m_beaconEvent = Simulator::Schedule (m_beaconInterval, &ApWifiMac::SendOneBeacon, this);
 }
@@ -514,9 +581,9 @@
               NS_LOG_DEBUG ("forwarding frame from=" << from << ", to=" << to);
               Ptr<Packet> copy = packet->Copy ();
 
-              // If the frame we are forwarding is of type QoS Data,
-              // then we need to preserve the UP in the QoS control
-              // header...
+              //If the frame we are forwarding is of type QoS Data,
+              //then we need to preserve the UP in the QoS control
+              //header...
               if (hdr->IsQosData ())
                 {
                   ForwardDown (packet, from, to, hdr->GetQosTid ());
@@ -535,14 +602,14 @@
       else if (hdr->IsFromDs ()
                && hdr->IsToDs ())
         {
-          // this is an AP-to-AP frame
-          // we ignore for now.
+          //this is an AP-to-AP frame
+          //we ignore for now.
           NotifyRxDrop (packet);
         }
       else
         {
-          // we can ignore these frames since
-          // they are not targeted at the AP
+          //we can ignore these frames since
+          //they are not targeted at the AP
           NotifyRxDrop (packet);
         }
       return;
@@ -559,8 +626,8 @@
         {
           if (hdr->IsAssocReq ())
             {
-              // first, verify that the the station's supported
-              // rate set is compatible with our Basic Rate set
+              //first, verify that the the station's supported
+              //rate set is compatible with our Basic Rate set
               MgtAssocRequestHeader assocReq;
               packet->RemoveHeader (assocReq);
               SupportedRates rates = assocReq.GetSupportedRates ();
@@ -568,58 +635,86 @@
               for (uint32_t i = 0; i < m_stationManager->GetNBasicModes (); i++)
                 {
                   WifiMode mode = m_stationManager->GetBasicMode (i);
-                  if (!rates.IsSupportedRate (mode.GetDataRate ()))
+                  if (!rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), false, 1)))
                     {
                       problem = true;
                       break;
                     }
                 }
-               if (m_htSupported)
-                    {//check that the STA supports all MCSs in Basic MCS Set
-                      HtCapabilities htcapabilities = assocReq.GetHtCapabilities ();
-                      for (uint32_t i = 0; i < m_stationManager->GetNBasicMcs (); i++)
+              if (m_htSupported)
+                {
+                  //check that the STA supports all MCSs in Basic MCS Set
+                  HtCapabilities htcapabilities = assocReq.GetHtCapabilities ();
+                  for (uint32_t i = 0; i < m_stationManager->GetNBasicMcs (); i++)
+                    {
+                      WifiMode mcs = m_stationManager->GetBasicMcs (i);
+                      if (!htcapabilities.IsSupportedMcs (mcs.GetMcsValue ()))
                         {
-                          uint8_t mcs = m_stationManager->GetBasicMcs (i);
-                          if (!htcapabilities.IsSupportedMcs (mcs))
-                            {
-                              problem = true;
-                              break;
-                            }
-                         }
-                      
-                     }
+                          problem = true;
+                          break;
+                        }
+                    }
+                }
+              if (m_vhtSupported)
+                {
+                  //check that the STA supports all MCSs in Basic MCS Set
+                  VhtCapabilities vhtcapabilities = assocReq.GetVhtCapabilities ();
+                  for (uint32_t i = 0; i < m_stationManager->GetNBasicMcs (); i++)
+                    {
+                      WifiMode mcs = m_stationManager->GetBasicMcs (i);
+                      if (!vhtcapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
+                        {
+                          problem = true;
+                          break;
+                        }
+                    }
+                }
               if (problem)
                 {
-                  // one of the Basic Rate set mode is not
-                  // supported by the station. So, we return an assoc
-                  // response with an error status.
+                  //One of the Basic Rate set mode is not
+                  //supported by the station. So, we return an assoc
+                  //response with an error status.
                   SendAssocResp (hdr->GetAddr2 (), false);
                 }
               else
                 {
-                  // station supports all rates in Basic Rate Set.
-                  // record all its supported modes in its associated WifiRemoteStation
+                  //station supports all rates in Basic Rate Set.
+                  //record all its supported modes in its associated WifiRemoteStation
                   for (uint32_t j = 0; j < m_phy->GetNModes (); j++)
                     {
                       WifiMode mode = m_phy->GetMode (j);
-                      if (rates.IsSupportedRate (mode.GetDataRate ()))
+                      if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), false, 1)))
                         {
                           m_stationManager->AddSupportedMode (from, mode);
                         }
                     }
-                   if (m_htSupported)
+                  if (m_htSupported)
                     {
                       HtCapabilities htcapabilities = assocReq.GetHtCapabilities ();
                       m_stationManager->AddStationHtCapabilities (from,htcapabilities);
                       for (uint32_t j = 0; j < m_phy->GetNMcs (); j++)
-                       {
-                         uint8_t mcs = m_phy->GetMcs (j);
-                         if (htcapabilities.IsSupportedMcs (mcs))
-                           {
-                             m_stationManager->AddSupportedMcs (from, mcs);
-                           }
+                        {
+                          WifiMode mcs = m_phy->GetMcs (j);
+                          if (mcs.GetModulationClass () == WIFI_MOD_CLASS_HT && htcapabilities.IsSupportedMcs (mcs.GetMcsValue ()))
+                            {
+                              m_stationManager->AddSupportedMcs (from, mcs);
+                            }
                         }
-                     }
+                    }
+                  if (m_vhtSupported)
+                    {
+                      VhtCapabilities vhtCapabilities = assocReq.GetVhtCapabilities ();
+                      m_stationManager->AddStationVhtCapabilities (from, vhtCapabilities);
+                      for (uint32_t i = 0; i < m_phy->GetNMcs (); i++)
+                        {
+                          WifiMode mcs = m_phy->GetMcs (i);
+                          if (mcs.GetModulationClass () == WIFI_MOD_CLASS_VHT && vhtCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
+                            {
+                              m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
+                              //here should add a control to add basic MCS when it is implemented
+                            }
+                        }
+                    }
                   m_stationManager->RecordWaitAssocTxOk (from);
                   // send assoc response with success status.
                   SendAssocResp (hdr->GetAddr2 (), true);
@@ -634,9 +729,9 @@
         }
     }
 
-  // Invoke the receive handler of our parent class to deal with any
-  // other frames. Specifically, this will handle Block Ack-related
-  // Management Action frames.
+  //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 (packet, hdr);
 }
 
@@ -677,16 +772,16 @@
       if (m_enableBeaconJitter)
         {
           int64_t jitter = m_beaconJitter->GetValue (0, m_beaconInterval.GetMicroSeconds ());
-          NS_LOG_DEBUG ("Scheduling initial beacon for access point " << GetAddress() << " at time " << jitter << " microseconds");
+          NS_LOG_DEBUG ("Scheduling initial beacon for access point " << GetAddress () << " at time " << jitter << " microseconds");
           m_beaconEvent = Simulator::Schedule (MicroSeconds (jitter), &ApWifiMac::SendOneBeacon, this);
         }
       else
         {
-          NS_LOG_DEBUG ("Scheduling initial beacon for access point " << GetAddress() << " at time 0");
+          NS_LOG_DEBUG ("Scheduling initial beacon for access point " << GetAddress () << " at time 0");
           m_beaconEvent = Simulator::ScheduleNow (&ApWifiMac::SendOneBeacon, this);
         }
     }
   RegularWifiMac::DoInitialize ();
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/ap-wifi-mac.h ns-3.24/src/wifi/model/ap-wifi-mac.h
--- ns-3.23/src/wifi/model/ap-wifi-mac.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ap-wifi-mac.h	2015-09-15 11:18:44.000000000 -0700
@@ -16,9 +16,10 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef AP_WIFI_MAC_H
 #define AP_WIFI_MAC_H
 
@@ -27,6 +28,7 @@
 #include "amsdu-subframe-header.h"
 #include "supported-rates.h"
 #include "ns3/random-variable-stream.h"
+#include "vht-capabilities.h"
 
 namespace ns3 {
 
@@ -77,6 +79,7 @@
    * frames without altering the source address.
    */
   virtual void Enqueue (Ptr<const Packet> packet, Mac48Address to, Mac48Address from);
+
   virtual bool SupportsSendFrom (void) const;
 
   /**
@@ -96,16 +99,18 @@
    */
   void StartBeaconing (void);
 
- /**
-  * 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
-  */
+  /**
+   * 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);
 
+
 private:
   virtual void Receive (Ptr<Packet> packet, const WifiMacHeader *hdr);
   /**
@@ -113,7 +118,7 @@
    * (i.e. we received an ACK from the receiver).  If the packet
    * was an association response to the receiver, we record that
    * the receiver is now associated with us.
-   * 
+   *
    * \param hdr the header of the packet that we successfully sent
    */
   virtual void TxOk (const WifiMacHeader &hdr);
@@ -138,7 +143,6 @@
    */
   virtual void DeaggregateAmsduAndForward (Ptr<Packet> aggregatedPacket,
                                            const WifiMacHeader *hdr);
-
   /**
    * Forward the packet down to DCF/EDCAF (enqueue the packet). This method
    * is a wrapper for ForwardDown with traffic id.
@@ -178,11 +182,17 @@
   void SendOneBeacon (void);
   /**
    * Return the HT capability of the current AP.
-   * 
+   *
    * \return the HT capability that we support
    */
   HtCapabilities GetHtCapabilities (void) const;
   /**
+   * Return the VHT capability of the current AP.
+   *
+   * \return the VHT capability that we support
+   */
+  VhtCapabilities GetVhtCapabilities (void) const;
+  /**
    * Return an instance of SupportedRates that contains all rates that we support
    * including HT rates.
    *
@@ -201,17 +211,18 @@
    * \return true if beacons are periodically generated, false otherwise
    */
   bool GetBeaconGeneration (void) const;
+
   virtual void DoDispose (void);
   virtual void DoInitialize (void);
 
-  Ptr<DcaTxop> m_beaconDca; //!< Dedicated DcaTxop for beacons
-  Time m_beaconInterval; //!< Interval between beacons
-  bool m_enableBeaconGeneration; //!< Flag if beacons are being generated
-  EventId m_beaconEvent; //!< Event to generate one beacon
+  Ptr<DcaTxop> m_beaconDca;                  //!< Dedicated DcaTxop for beacons
+  Time m_beaconInterval;                     //!< Interval between beacons
+  bool m_enableBeaconGeneration;             //!< Flag if beacons are being generated
+  EventId m_beaconEvent;                     //!< Event to generate one beacon
   Ptr<UniformRandomVariable> m_beaconJitter; //!< UniformRandomVariable used to randomize the time of the first beacon
-  bool m_enableBeaconJitter; //!< Flag if the first beacon should be generated at random time
+  bool m_enableBeaconJitter;                 //!< Flag if the first beacon should be generated at random time
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* AP_WIFI_MAC_H */
diff -Naur ns-3.23/src/wifi/model/arf-wifi-manager.cc ns-3.24/src/wifi/model/arf-wifi-manager.cc
--- ns-3.23/src/wifi/model/arf-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/arf-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -42,10 +42,8 @@
   uint32_t m_failed;
   bool m_recovery;
   uint32_t m_retry;
-
   uint32_t m_timerTimeout;
   uint32_t m_successThreshold;
-
   uint32_t m_rate;
 };
 
@@ -75,10 +73,12 @@
 {
   NS_LOG_FUNCTION (this);
 }
+
 ArfWifiManager::~ArfWifiManager ()
 {
   NS_LOG_FUNCTION (this);
 }
+
 WifiRemoteStation *
 ArfWifiManager::DoCreateStation (void) const
 {
@@ -128,7 +128,7 @@
       NS_ASSERT (station->m_retry >= 1);
       if (station->m_retry == 1)
         {
-          // need recovery fallback
+          //need recovery fallback
           if (station->m_rate != 0)
             {
               station->m_rate--;
@@ -141,7 +141,7 @@
       NS_ASSERT (station->m_retry >= 1);
       if (((station->m_retry - 1) % 2) == 1)
         {
-          // need normal fallback
+          //need normal fallback
           if (station->m_rate != 0)
             {
               station->m_rate--;
@@ -153,18 +153,21 @@
         }
     }
 }
+
 void
 ArfWifiManager::DoReportRxOk (WifiRemoteStation *station,
                               double rxSnr, WifiMode txMode)
 {
   NS_LOG_FUNCTION (this << station << rxSnr << txMode);
 }
+
 void ArfWifiManager::DoReportRtsOk (WifiRemoteStation *station,
                                     double ctsSnr, WifiMode ctsMode, double rtsSnr)
 {
   NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
   NS_LOG_DEBUG ("station=" << station << " rts ok");
 }
+
 void ArfWifiManager::DoReportDataOk (WifiRemoteStation *st,
                                      double ackSnr, WifiMode ackMode, double dataSnr)
 {
@@ -187,11 +190,13 @@
       station->m_recovery = true;
     }
 }
+
 void
 ArfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
 {
   NS_LOG_FUNCTION (this << station);
 }
+
 void
 ArfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
 {
@@ -203,8 +208,15 @@
 {
   NS_LOG_FUNCTION (this << st << size);
   ArfWifiRemoteStation *station = (ArfWifiRemoteStation *) st;
-  return WifiTxVector (GetSupported (station, station->m_rate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, station->m_rate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 1, channelWidth, GetAggregation (station), false);
 }
+
 WifiTxVector
 ArfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
 {
@@ -212,7 +224,13 @@
   /// \todo we could/should implement the Arf algorithm for
   /// RTS only by picking a single rate within the BasicRateSet.
   ArfWifiRemoteStation *station = (ArfWifiRemoteStation *) st;
-  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
 bool
@@ -222,4 +240,4 @@
   return true;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/arf-wifi-manager.h ns-3.24/src/wifi/model/arf-wifi-manager.h
--- ns-3.23/src/wifi/model/arf-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/arf-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef ARF_WIFI_MANAGER_H
 #define ARF_WIFI_MANAGER_H
 
@@ -46,8 +47,9 @@
   ArfWifiManager ();
   virtual ~ArfWifiManager ();
 
+
 private:
-  // overriden from base class
+  //overriden from base class
   virtual WifiRemoteStation * DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
@@ -67,6 +69,6 @@
   uint32_t m_successThreshold;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* ARF_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/block-ack-agreement.cc ns-3.24/src/wifi/model/block-ack-agreement.cc
--- ns-3.23/src/wifi/model/block-ack-agreement.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/block-ack-agreement.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "block-ack-agreement.h"
 #include "ns3/log.h"
 
@@ -58,12 +59,14 @@
   NS_ASSERT (bufferSize % 16 == 0);
   m_bufferSize = bufferSize;
 }
+
 void
 BlockAckAgreement::SetTimeout (uint16_t timeout)
 {
   NS_LOG_FUNCTION (this << timeout);
   m_timeout = timeout;
 }
+
 void
 BlockAckAgreement::SetStartingSequence (uint16_t seq)
 {
@@ -71,18 +74,29 @@
   NS_ASSERT (seq < 4096);
   m_startingSeq = seq;
 }
+
+void
+BlockAckAgreement::SetStartingSequenceControl (uint16_t seq)
+{
+  NS_LOG_FUNCTION (this << seq);
+  NS_ASSERT (((seq >> 4) & 0x0fff) < 4096);
+  m_startingSeq = (seq >> 4) & 0x0fff;
+}
+
 void
 BlockAckAgreement::SetImmediateBlockAck (void)
 {
   NS_LOG_FUNCTION (this);
   m_blockAckPolicy = 1;
 }
+
 void
 BlockAckAgreement::SetDelayedBlockAck (void)
 {
   NS_LOG_FUNCTION (this);
   m_blockAckPolicy = 0;
 }
+
 void
 BlockAckAgreement::SetAmsduSupport (bool supported)
 {
@@ -96,70 +110,81 @@
   NS_LOG_FUNCTION (this);
   return m_tid;
 }
+
 Mac48Address
 BlockAckAgreement::GetPeer (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_peer;
 }
+
 uint16_t
 BlockAckAgreement::GetBufferSize (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_bufferSize;
 }
+
 uint16_t
 BlockAckAgreement::GetTimeout (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_timeout;
 }
+
 uint16_t
 BlockAckAgreement::GetStartingSequence (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_startingSeq;
 }
+
 uint16_t
 BlockAckAgreement::GetStartingSequenceControl (void) const
 {
   NS_LOG_FUNCTION (this);
-  uint16_t seqControl = (m_startingSeq << 4) | 0xfff0;
+  uint16_t seqControl = (m_startingSeq << 4) & 0xfff0;
   return seqControl;
 }
+
 bool
 BlockAckAgreement::IsImmediateBlockAck (void) const
 {
   NS_LOG_FUNCTION (this);
   return (m_blockAckPolicy == 1);
 }
+
 bool
 BlockAckAgreement::IsAmsduSupported (void) const
 {
   NS_LOG_FUNCTION (this);
   return (m_amsduSupported == 1) ? true : false;
 }
+
 uint16_t
 BlockAckAgreement::GetWinEnd (void) const
 {
   return m_winEnd;
 }
+
 void
 BlockAckAgreement::SetWinEnd (uint16_t seq)
 {
   m_winEnd = seq;
 }
+
 void
 BlockAckAgreement::SetHtSupported (bool htSupported)
 {
   NS_LOG_FUNCTION (this << htSupported);
   m_htSupported = htSupported;
 }
+
 bool
 BlockAckAgreement::IsHtSupported (void) const
 {
-    NS_LOG_FUNCTION (this);
-    return (m_htSupported == 1) ? true : false;
+  NS_LOG_FUNCTION (this);
+  return (m_htSupported == 1) ? true : false;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/block-ack-agreement.h ns-3.24/src/wifi/model/block-ack-agreement.h
--- ns-3.23/src/wifi/model/block-ack-agreement.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/block-ack-agreement.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef BLOCK_ACK_AGREEMENT_H
 #define BLOCK_ACK_AGREEMENT_H
 
@@ -31,6 +32,8 @@
 class BlockAckAgreement
 {
   friend class MacLow;
+
+
 public:
   BlockAckAgreement ();
   /**
@@ -60,6 +63,12 @@
    */
   void SetStartingSequence (uint16_t seq);
   /**
+   * Set starting sequence control.
+   *
+   * \param seq the starting sequence control
+   */
+  void SetStartingSequenceControl (uint16_t seq);
+  /**
    * Set Block ACK policy to immediate ACK.
    */
   void SetImmediateBlockAck (void);
@@ -110,7 +119,7 @@
    */
   uint16_t GetStartingSequence (void) const;
   /**
-   * Return the starting squence control
+   * Return the starting sequence control
    *
    * \return starting sequence control
    */
@@ -149,6 +158,7 @@
    */
   bool IsHtSupported (void) const;
 
+
 protected:
   Mac48Address m_peer;       //!< Peer address
   uint8_t m_amsduSupported;  //!< Flag whether MSDU aggregation is supported
@@ -159,9 +169,9 @@
   uint16_t m_startingSeq;    //!< Starting squence control
   uint16_t m_winEnd;         //!< Ending sequence number
   uint8_t m_htSupported;     //!< Flag whether HT is supported
-  EventId m_inactivityEvent; //!<
+  EventId m_inactivityEvent;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* BLOCK_ACK_AGREEMENT_H */
diff -Naur ns-3.23/src/wifi/model/block-ack-cache.cc ns-3.24/src/wifi/model/block-ack-cache.cc
--- ns-3.23/src/wifi/model/block-ack-cache.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/block-ack-cache.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "block-ack-cache.h"
 #include "ctrl-headers.h"
 #include "wifi-mac-header.h"
@@ -146,4 +147,4 @@
     }
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/block-ack-cache.h ns-3.24/src/wifi/model/block-ack-cache.h
--- ns-3.23/src/wifi/model/block-ack-cache.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/block-ack-cache.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef BLOCK_ACK_CACHE_H
 #define BLOCK_ACK_CACHE_H
 
@@ -38,15 +39,17 @@
   void Init (uint16_t winStart, uint16_t winSize);
 
   void UpdateWithMpdu (const WifiMacHeader *hdr);
-    void UpdateWithBlockAckReq (uint16_t startingSeq);
- /**
-  * When an A-MPDU is received, the window start may change to a new value
-  * depending on the sequence number of the received MPDU (standard11n page 134).
-  * This function is used to retrieve this value in order to add it to the BlockAck.
-  */
+  void UpdateWithBlockAckReq (uint16_t startingSeq);
+  /**
+   * When an A-MPDU is received, the window start may change to a new value
+   * depending on the sequence number of the received MPDU (standard11n page 134).
+   * This function is used to retrieve this value in order to add it to the BlockAck.
+   */
   uint16_t GetWinStart (void);
 
   void FillBlockAckBitmap (CtrlBAckResponseHeader *blockAckHeader);
+
+
 private:
   void ResetPortionOfBitmap (uint16_t start, uint16_t end);
   bool IsInWindow (uint16_t seq);
@@ -58,6 +61,6 @@
   uint16_t m_bitmap[4096];
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* BLOCK_ACK_CACHE_H */
diff -Naur ns-3.23/src/wifi/model/block-ack-manager.cc ns-3.24/src/wifi/model/block-ack-manager.cc
--- ns-3.23/src/wifi/model/block-ack-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/block-ack-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,11 +17,11 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "ns3/log.h"
 #include "ns3/assert.h"
 #include "ns3/simulator.h"
 #include "ns3/fatal-error.h"
-
 #include "block-ack-manager.h"
 #include "mgt-headers.h"
 #include "ctrl-headers.h"
@@ -116,10 +116,10 @@
   std::pair<Mac48Address, uint8_t> key (recipient, reqHdr->GetTid ());
   OriginatorBlockAckAgreement agreement (recipient, reqHdr->GetTid ());
   agreement.SetStartingSequence (reqHdr->GetStartingSequence ());
-  /* for now we assume that originator doesn't use this field. Use of this field
+  /* For now we assume that originator doesn't use this field. Use of this field
      is mandatory only for recipient */
   agreement.SetBufferSize (64);
-  agreement.SetWinEnd ((agreement.GetStartingSequence()+ agreement.GetBufferSize()-1) % 4096);
+  agreement.SetWinEnd ((agreement.GetStartingSequence () + agreement.GetBufferSize () - 1) % 4096);
   agreement.SetTimeout (reqHdr->GetTimeout ());
   agreement.SetAmsduSupport (reqHdr->IsAmsduSupported ());
   agreement.SetHtSupported (m_stationManager->HasHtSupported ());
@@ -145,7 +145,7 @@
   AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
   if (it != m_agreements.end ())
     {
-      for (std::list<PacketQueueI>::iterator i = m_retryPackets.begin (); i != m_retryPackets.end ();)
+      for (std::list<PacketQueueI>::iterator i = m_retryPackets.begin (); i != m_retryPackets.end (); )
         {
           if ((*i)->hdr.GetAddr1 () == recipient && (*i)->hdr.GetQosTid () == tid)
             {
@@ -158,7 +158,7 @@
         }
       m_agreements.erase (it);
       //remove scheduled bar
-      for (std::list<Bar>::iterator i = m_bars.begin (); i != m_bars.end ();)
+      for (std::list<Bar>::iterator i = m_bars.begin (); i != m_bars.end (); )
         {
           if (i->recipient == recipient && i->tid == tid)
             {
@@ -218,26 +218,26 @@
   AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
   NS_ASSERT (it != m_agreements.end ());
   PacketQueueI queueIt = it->second.second.begin ();
-  for (; queueIt != it->second.second.end ();)
-  {
-      if(((hdr.GetSequenceNumber () - queueIt->hdr.GetSequenceNumber () + 4096) % 4096) > 2047)
-      {
+  for (; queueIt != it->second.second.end (); )
+    {
+      if (((hdr.GetSequenceNumber () - queueIt->hdr.GetSequenceNumber () + 4096) % 4096) > 2047)
+        {
           queueIt = it->second.second.insert (queueIt, item);
           break;
-      }
+        }
       else
-      {
+        {
           queueIt++;
-      }
-  }
-  if(queueIt == it->second.second.end ())
-  {
-    it->second.second.push_back (item);
-  }
+        }
+    }
+  if (queueIt == it->second.second.end ())
+    {
+      it->second.second.push_back (item);
+    }
 }
 
 void
-BlockAckManager::CompleteAmpduExchange(Mac48Address recipient, uint8_t tid)
+BlockAckManager::CompleteAmpduExchange (Mac48Address recipient, uint8_t tid)
 {
   AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
   NS_ASSERT (it != m_agreements.end ());
@@ -247,70 +247,78 @@
 
 Ptr<const Packet>
 BlockAckManager::GetNextPacket (WifiMacHeader &hdr)
- {
-   NS_LOG_FUNCTION (this << &hdr);
-   Ptr<const Packet> packet = 0;
-   uint8_t tid;
-   Mac48Address recipient;
-   CleanupBuffers ();
-   if (!m_retryPackets.empty())
-     {
-       NS_LOG_DEBUG("Retry buffer size is " << m_retryPackets.size ());
-       std::list<PacketQueueI>::iterator it = m_retryPackets.begin ();  
-       while (it != m_retryPackets.end ())
-         {  
-           if ((*it)->hdr.IsQosData ())
-             tid = (*it)->hdr.GetQosTid ();
-           else
-             NS_FATAL_ERROR("Packet in blockAck manager retry queue is not Qos Data");
-           recipient = (*it)->hdr.GetAddr1 ();
-           AgreementsI agreement = m_agreements.find (std::make_pair (recipient, tid));
-           NS_ASSERT (agreement != m_agreements.end());
-           if (QosUtilsIsOldPacket (agreement->second.first.GetStartingSequence (),(*it)->hdr.GetSequenceNumber ()))
-             {
-               //standard says the originator should not send a packet with seqnum < winstart
-               NS_LOG_DEBUG("The Retry packet have sequence number < WinStartO --> Discard " << (*it)->hdr.GetSequenceNumber () << " " << agreement->second.first.GetStartingSequence ());
-               agreement->second.second.erase ((*it));   
-               it = m_retryPackets.erase (it);
-               continue;
-             }
-           else if ((*it)->hdr.GetSequenceNumber () > (agreement->second.first.GetStartingSequence ()+63) %4096)
-             {
-               agreement->second.first.SetStartingSequence ((*it)->hdr.GetSequenceNumber ());
-             }
-           packet = (*it)->packet->Copy();
-           hdr = (*it)->hdr;
-           hdr.SetRetry ();
-           NS_LOG_INFO ("Retry packet seq = " << hdr.GetSequenceNumber ());
-           if (hdr.IsQosData ())
-             tid = hdr.GetQosTid ();
-           else
-             NS_FATAL_ERROR("Packet in blockAck manager retry queue is not Qos Data");
-           recipient = hdr.GetAddr1 ();
-           if (!agreement->second.first.IsHtSupported ()
-               && (ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED)
+{
+  NS_LOG_FUNCTION (this << &hdr);
+  Ptr<const Packet> packet = 0;
+  uint8_t tid;
+  Mac48Address recipient;
+  CleanupBuffers ();
+  if (!m_retryPackets.empty ())
+    {
+      NS_LOG_DEBUG ("Retry buffer size is " << m_retryPackets.size ());
+      std::list<PacketQueueI>::iterator it = m_retryPackets.begin ();
+      while (it != m_retryPackets.end ())
+        {
+          if ((*it)->hdr.IsQosData ())
+            {
+              tid = (*it)->hdr.GetQosTid ();
+            }
+          else
+            {
+              NS_FATAL_ERROR ("Packet in blockAck manager retry queue is not Qos Data");
+            }
+          recipient = (*it)->hdr.GetAddr1 ();
+          AgreementsI agreement = m_agreements.find (std::make_pair (recipient, tid));
+          NS_ASSERT (agreement != m_agreements.end ());
+          if (QosUtilsIsOldPacket (agreement->second.first.GetStartingSequence (),(*it)->hdr.GetSequenceNumber ()))
+            {
+              //Standard says the originator should not send a packet with seqnum < winstart
+              NS_LOG_DEBUG ("The Retry packet have sequence number < WinStartO --> Discard " << (*it)->hdr.GetSequenceNumber () << " " << agreement->second.first.GetStartingSequence ());
+              agreement->second.second.erase ((*it));
+              it = m_retryPackets.erase (it);
+              continue;
+            }
+          else if ((*it)->hdr.GetSequenceNumber () > (agreement->second.first.GetStartingSequence () + 63) % 4096)
+            {
+              agreement->second.first.SetStartingSequence ((*it)->hdr.GetSequenceNumber ());
+            }
+          packet = (*it)->packet->Copy ();
+          hdr = (*it)->hdr;
+          hdr.SetRetry ();
+          NS_LOG_INFO ("Retry packet seq = " << hdr.GetSequenceNumber ());
+          if (hdr.IsQosData ())
+            {
+              tid = hdr.GetQosTid ();
+            }
+          else
+            {
+              NS_FATAL_ERROR ("Packet in blockAck manager retry queue is not Qos Data");
+            }
+          recipient = hdr.GetAddr1 ();
+          if (!agreement->second.first.IsHtSupported ()
+              && (ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED)
                   || SwitchToBlockAckIfNeeded (recipient, tid, hdr.GetSequenceNumber ())))
-             {
-                hdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
-             }
-           else
-            {
-               /* From section 9.10.3 in IEEE802.11e standard:
-                * In order to improve efficiency, originators using the Block Ack facility
-                * may send MPDU frames with the Ack Policy subfield in QoS control frames
-                * set to Normal Ack if only a few MPDUs are available for transmission.[...]
-                * When there are sufficient number of MPDUs, the originator may switch back to
-                * the use of Block Ack.
-                */
-               hdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
-               AgreementsI i = m_agreements.find (std::make_pair (recipient, tid));
-               i->second.second.erase (*it);
-             }
-           it = m_retryPackets.erase (it);
-           NS_LOG_DEBUG("Removed one packet retry buffer size = " <<m_retryPackets.size () );
-           break;
-         }
-     }
+            {
+              hdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
+            }
+          else
+            {
+              /* From section 9.10.3 in IEEE802.11e standard:
+               * In order to improve efficiency, originators using the Block Ack facility
+               * may send MPDU frames with the Ack Policy subfield in QoS control frames
+               * set to Normal Ack if only a few MPDUs are available for transmission.[...]
+               * When there are sufficient number of MPDUs, the originator may switch back to
+               * the use of Block Ack.
+               */
+              hdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
+              AgreementsI i = m_agreements.find (std::make_pair (recipient, tid));
+              i->second.second.erase (*it);
+            }
+          it = m_retryPackets.erase (it);
+          NS_LOG_DEBUG ("Removed one packet, retry buffer size = " << m_retryPackets.size () );
+          break;
+        }
+    }
   return packet;
 }
 
@@ -322,51 +330,55 @@
   Ptr<const Packet> packet = 0;
   CleanupBuffers ();
   AgreementsI agreement = m_agreements.find (std::make_pair (recipient, tid));
-  NS_ASSERT (agreement != m_agreements.end());
-  std::list<PacketQueueI>::iterator it = m_retryPackets.begin ();    
-  for (; it != m_retryPackets.end();it++)
-    {
-       if ((*it)->hdr.GetAddr1 () == recipient && (*it)->hdr.GetQosTid () == tid)
-       {
-         if (QosUtilsIsOldPacket (agreement->second.first.GetStartingSequence (),(*it)->hdr.GetSequenceNumber ()))
-           { 
-               //standard says the originator should not send a packet with seqnum < winstart
-               NS_LOG_DEBUG("The Retry packet have sequence number < WinStartO --> Discard " << (*it)->hdr.GetSequenceNumber () << " " << agreement->second.first.GetStartingSequence ());
-               agreement->second.second.erase ((*it));   
-               it = m_retryPackets.erase (it);
-                it--; 
-               continue;
-           }
+  NS_ASSERT (agreement != m_agreements.end ());
+  std::list<PacketQueueI>::iterator it = m_retryPackets.begin ();
+  for (; it != m_retryPackets.end (); it++)
+    {
+      if (!(*it)->hdr.IsQosData ())
+        {
+          NS_FATAL_ERROR ("Packet in blockAck manager retry queue is not Qos Data");
+        }
+      if ((*it)->hdr.GetAddr1 () == recipient && (*it)->hdr.GetQosTid () == tid)
+        {
+          if (QosUtilsIsOldPacket (agreement->second.first.GetStartingSequence (),(*it)->hdr.GetSequenceNumber ()))
+            {
+              //standard says the originator should not send a packet with seqnum < winstart
+              NS_LOG_DEBUG ("The Retry packet have sequence number < WinStartO --> Discard " << (*it)->hdr.GetSequenceNumber () << " " << agreement->second.first.GetStartingSequence ());
+              agreement->second.second.erase ((*it));
+              it = m_retryPackets.erase (it);
+              it--;
+              continue;
+            }
           else if ((*it)->hdr.GetSequenceNumber () > (agreement->second.first.GetStartingSequence () + 63) % 4096)
             {
-               agreement->second.first.SetStartingSequence ((*it)->hdr.GetSequenceNumber ());
+              agreement->second.first.SetStartingSequence ((*it)->hdr.GetSequenceNumber ());
             }
-        packet = (*it)->packet->Copy();
-        hdr = (*it)->hdr;
-        hdr.SetRetry ();
-        *tstamp = (*it)->timestamp;
-        NS_LOG_INFO ("Retry packet seq = " << hdr.GetSequenceNumber ());
-            Mac48Address recipient = hdr.GetAddr1 ();
-           if (!agreement->second.first.IsHtSupported ()
-               && (ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED)
+          packet = (*it)->packet->Copy ();
+          hdr = (*it)->hdr;
+          hdr.SetRetry ();
+          *tstamp = (*it)->timestamp;
+          NS_LOG_INFO ("Retry packet seq = " << hdr.GetSequenceNumber ());
+          Mac48Address recipient = hdr.GetAddr1 ();
+          if (!agreement->second.first.IsHtSupported ()
+              && (ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED)
                   || SwitchToBlockAckIfNeeded (recipient, tid, hdr.GetSequenceNumber ())))
-             {
-                hdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
-             }
+            {
+              hdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
+            }
           else
             {
-                /* From section 9.10.3 in IEEE802.11e standard:
-                 * In order to improve efficiency, originators using the Block Ack facility
-                 * may send MPDU frames with the Ack Policy subfield in QoS control frames
-                 * set to Normal Ack if only a few MPDUs are available for transmission.[...]
-                 * When there are sufficient number of MPDUs, the originator may switch back to
-                 * the use of Block Ack.
-                 */
-                hdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
-             }
-          NS_LOG_DEBUG("Peeked one packet from retry buffer size = " << m_retryPackets.size () );
-         return packet;        
-      }
+              /* From section 9.10.3 in IEEE802.11e standard:
+               * In order to improve efficiency, originators using the Block Ack facility
+               * may send MPDU frames with the Ack Policy subfield in QoS control frames
+               * set to Normal Ack if only a few MPDUs are available for transmission.[...]
+               * When there are sufficient number of MPDUs, the originator may switch back to
+               * the use of Block Ack.
+               */
+              hdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
+            }
+          NS_LOG_DEBUG ("Peeked one packet from retry buffer size = " << m_retryPackets.size () );
+          return packet;
+        }
     }
   return packet;
 }
@@ -375,9 +387,13 @@
 BlockAckManager::RemovePacket (uint8_t tid, Mac48Address recipient, uint16_t seqnumber)
 {
 
-  std::list<PacketQueueI>::iterator it = m_retryPackets.begin ();                
+  std::list<PacketQueueI>::iterator it = m_retryPackets.begin ();
   for (; it != m_retryPackets.end (); it++)
     {
+      if (!(*it)->hdr.IsQosData ())
+        {
+          NS_FATAL_ERROR ("Packet in blockAck manager retry queue is not Qos Data");
+        }
       if ((*it)->hdr.GetAddr1 () == recipient && (*it)->hdr.GetQosTid () == tid && (*it)->hdr.GetSequenceNumber () == seqnumber)
         {
           WifiMacHeader hdr = (*it)->hdr;
@@ -386,9 +402,9 @@
 
           AgreementsI i = m_agreements.find (std::make_pair (recipient, tid));
           i->second.second.erase ((*it));
-         
-          m_retryPackets.erase (it);  
-          NS_LOG_DEBUG("Removed Packet from retry queue = " << hdr.GetSequenceNumber () << " " << (uint32_t) tid << " " << recipient << " Buffer Size = " << m_retryPackets.size ());
+
+          m_retryPackets.erase (it);
+          NS_LOG_DEBUG ("Removed Packet from retry queue = " << hdr.GetSequenceNumber () << " " << (uint32_t) tid << " " << recipient << " Buffer Size = " << m_retryPackets.size ());
           return true;
         }
     }
@@ -451,6 +467,10 @@
       std::list<PacketQueueI>::const_iterator it = m_retryPackets.begin ();
       while (it != m_retryPackets.end ())
         {
+          if (!(*it)->hdr.IsQosData ())
+            {
+              NS_FATAL_ERROR ("Packet in blockAck manager retry queue is not Qos Data");
+            }
           if ((*it)->hdr.GetAddr1 () == recipient && (*it)->hdr.GetQosTid () == tid)
             {
               currentSeq = (*it)->hdr.GetSequenceNumber ();
@@ -477,7 +497,7 @@
   NS_LOG_FUNCTION (this << static_cast<uint32_t> (nPackets));
   m_blockAckThreshold = nPackets;
 }
-    
+
 void
 BlockAckManager::SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> manager)
 {
@@ -486,16 +506,22 @@
 }
 
 bool
-BlockAckManager::AlreadyExists(uint16_t currentSeq, Mac48Address recipient, uint8_t tid)
+BlockAckManager::AlreadyExists (uint16_t currentSeq, Mac48Address recipient, uint8_t tid)
 {
   std::list<PacketQueueI>::const_iterator it = m_retryPackets.begin ();
   while (it != m_retryPackets.end ())
     {
-       NS_LOG_FUNCTION (this<<(*it)->hdr.GetType());
-       if ((*it)->hdr.GetAddr1 () == recipient && (*it)->hdr.GetQosTid () == tid && currentSeq == (*it)->hdr.GetSequenceNumber ())
-         return true;
-       it++;
-     }
+      NS_LOG_FUNCTION (this << (*it)->hdr.GetType ());
+      if (!(*it)->hdr.IsQosData ())
+        {
+          NS_FATAL_ERROR ("Packet in blockAck manager retry queue is not Qos Data");
+        }
+      if ((*it)->hdr.GetAddr1 () == recipient && (*it)->hdr.GetQosTid () == tid && currentSeq == (*it)->hdr.GetSequenceNumber ())
+        {
+          return true;
+        }
+      it++;
+    }
   return false;
 }
 
@@ -527,7 +553,7 @@
             }
           if (blockAck->IsBasic ())
             {
-              for (PacketQueueI queueIt = it->second.second.begin (); queueIt != queueEnd;)
+              for (PacketQueueI queueIt = it->second.second.begin (); queueIt != queueEnd; )
                 {
                   if (blockAck->IsFragmentReceived ((*queueIt).hdr.GetSequenceNumber (),
                                                     (*queueIt).hdr.GetFragmentNumber ()))
@@ -543,8 +569,10 @@
                           (*it).second.first.SetStartingSequence (sequenceFirstLost);
                         }
 
-                      if (!AlreadyExists((*queueIt).hdr.GetSequenceNumber (),recipient,tid))
-                        InsertInRetryQueue(queueIt);
+                      if (!AlreadyExists ((*queueIt).hdr.GetSequenceNumber (),recipient,tid))
+                        {
+                          InsertInRetryQueue (queueIt);
+                        }
 
                       queueIt++;
                     }
@@ -552,7 +580,7 @@
             }
           else if (blockAck->IsCompressed ())
             {
-              for (PacketQueueI queueIt = it->second.second.begin (); queueIt != queueEnd;)
+              for (PacketQueueI queueIt = it->second.second.begin (); queueIt != queueEnd; )
                 {
                   if (blockAck->IsPacketReceived ((*queueIt).hdr.GetSequenceNumber ()))
                     {
@@ -583,9 +611,9 @@
                         {
                           m_txFailedCallback ((*queueIt).hdr);
                         }
-                      if (!AlreadyExists((*queueIt).hdr.GetSequenceNumber (),recipient,tid))
+                      if (!AlreadyExists ((*queueIt).hdr.GetSequenceNumber (),recipient,tid))
                         {
-                          InsertInRetryQueue(queueIt);
+                          InsertInRetryQueue (queueIt);
                         }
                       queueIt++;
                     }
@@ -595,7 +623,7 @@
           if ((foundFirstLost && !SwitchToBlockAckIfNeeded (recipient, tid, sequenceFirstLost))
               || (!foundFirstLost && !SwitchToBlockAckIfNeeded (recipient, tid, newSeq)))
             {
-              it->second.first.CompleteExchange();
+              it->second.first.CompleteExchange ();
             }
         }
     }
@@ -707,8 +735,8 @@
       bar = ScheduleBlockAckReqIfNeeded (recipient, tid);
       if (bar != 0)
         {
-            Bar request (bar, recipient, tid, it->second.first.IsImmediateBlockAck ());
-            m_bars.push_back (request);
+          Bar request (bar, recipient, tid, it->second.first.IsImmediateBlockAck ());
+          m_bars.push_back (request);
         }
     }
 }
@@ -776,14 +804,18 @@
 
 bool BlockAckManager::NeedBarRetransmission (uint8_t tid, uint16_t seqNumber, Mac48Address recipient)
 {
-  //the standard says the BAR gets discarded when all MSDUs lifetime expires
+  //The standard says the BAR gets discarded when all MSDUs lifetime expires
   AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
-  NS_ASSERT (it != m_agreements.end());
-  CleanupBuffers();
-  if ((seqNumber+63) < it->second.first.GetStartingSequence())
-    return false;
+  NS_ASSERT (it != m_agreements.end ());
+  CleanupBuffers ();
+  if ((seqNumber + 63) < it->second.first.GetStartingSequence ())
+    {
+      return false;
+    }
   else
-    return true;
+    {
+      return true;
+    }
 }
 
 void
@@ -808,13 +840,13 @@
           else
             {
               /* remove retry packet iterator if it's present in retry queue */
-              for (std::list<PacketQueueI>::iterator it = m_retryPackets.begin (); it != m_retryPackets.end ();)
+              for (std::list<PacketQueueI>::iterator it = m_retryPackets.begin (); it != m_retryPackets.end (); )
                 {
                   if ((*it)->hdr.GetAddr1 () == j->second.first.GetPeer ()
                       && (*it)->hdr.GetQosTid () == j->second.first.GetTid ()
                       && (*it)->hdr.GetSequenceNumber () == i->hdr.GetSequenceNumber ())
                     {
-                        it = m_retryPackets.erase (it);
+                      it = m_retryPackets.erase (it);
                     }
                   else
                     {
@@ -870,6 +902,10 @@
   std::list<PacketQueueI>::const_iterator it = m_retryPackets.begin ();
   while (it != m_retryPackets.end ())
     {
+      if (!(*it)->hdr.IsQosData ())
+        {
+          NS_FATAL_ERROR ("Packet in blockAck manager retry queue is not Qos Data");
+        }
       if ((*it)->hdr.GetAddr1 () == recipient && (*it)->hdr.GetQosTid () == tid)
         {
           return (*it)->hdr.GetSequenceNumber ();
@@ -894,28 +930,30 @@
 void
 BlockAckManager::InsertInRetryQueue (PacketQueueI item)
 {
-  NS_LOG_INFO ("Adding to retry queue " <<(*item).hdr.GetSequenceNumber ());
+  NS_LOG_INFO ("Adding to retry queue " << (*item).hdr.GetSequenceNumber ());
   if (m_retryPackets.size () == 0)
     {
       m_retryPackets.push_back (item);
     }
   else
     {
-      for (std::list<PacketQueueI>::iterator it = m_retryPackets.begin (); it != m_retryPackets.end ();)
+      for (std::list<PacketQueueI>::iterator it = m_retryPackets.begin (); it != m_retryPackets.end (); )
         {
-            if(((item->hdr.GetSequenceNumber () - (*it)->hdr.GetSequenceNumber () + 4096) % 4096) > 2047)
+          if (((item->hdr.GetSequenceNumber () - (*it)->hdr.GetSequenceNumber () + 4096) % 4096) > 2047)
             {
               it = m_retryPackets.insert (it, item);
               break;
             }
-            else
+          else
             {
               it++;
-              if(it == m_retryPackets.end ())
-                m_retryPackets.push_back (item); 
+              if (it == m_retryPackets.end ())
+                {
+                  m_retryPackets.push_back (item);
+                }
             }
         }
     }
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/block-ack-manager.h ns-3.24/src/wifi/model/block-ack-manager.h
--- ns-3.23/src/wifi/model/block-ack-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/block-ack-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,15 +17,14 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef BLOCK_ACK_MANAGER_H
 #define BLOCK_ACK_MANAGER_H
 
 #include <map>
 #include <list>
 #include <deque>
-
 #include "ns3/packet.h"
-
 #include "wifi-mac-header.h"
 #include "originator-block-ack-agreement.h"
 #include "ctrl-headers.h"
@@ -68,6 +67,7 @@
   bool immediate;
 };
 
+
 /**
  * \brief Manages all block ack agreements for an originator station.
  * \ingroup wifi
@@ -78,10 +78,11 @@
   BlockAckManager (const BlockAckManager&);
   BlockAckManager& operator= (const BlockAckManager&);
 
+
 public:
   BlockAckManager ();
   ~BlockAckManager ();
-  
+
   /**
    * Set up WifiRemoteStationManager associated with this BlockAckManager.
    *
@@ -91,6 +92,7 @@
   /**
    * \param recipient Address of peer station involved in block ack mechanism.
    * \param tid Traffic ID.
+   *
    * \return true  if a block ack agreement exists, false otherwise
    *
    * Checks if a block ack agreement exists with station addressed by
@@ -101,6 +103,7 @@
    * \param recipient Address of peer station involved in block ack mechanism.
    * \param tid Traffic ID.
    * \param state The state for block ack agreement
+   *
    * \return true if a block ack agreement exists, false otherwise
    *
    * Checks if a block ack agreement with a state equals to <i>state</i> exists with
@@ -142,6 +145,7 @@
   void StorePacket (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp);
   /**
    * \param hdr 802.11 header of returned packet (if exists).
+   *
    * \return the packet
    *
    * This methods returns a packet (if exists) indicated as not received in
@@ -153,8 +157,8 @@
    * Returns true if there are packets that need of retransmission or at least a
    * BAR is scheduled. Returns false otherwise.
    *
-   * \return true if there are packets that need of retransmission or at least a
-   *         BAR is scheduled, false otherwise
+   * \return true if there are packets that need of retransmission or at least a BAR is scheduled,
+   *         false otherwise
    */
   bool HasPackets (void) const;
   /**
@@ -171,6 +175,7 @@
   /**
    * \param recipient Address of peer station involved in block ack mechanism.
    * \param tid Traffic ID.
+   *
    * \return the number of packets buffered for a specified agreement
    *
    * Returns number of packets buffered for a specified agreement. This methods doesn't return
@@ -180,6 +185,7 @@
   /**
    * \param recipient Address of peer station involved in block ack mechanism.
    * \param tid Traffic ID.
+   *
    * \return the number of packets for a specific agreement that need retransmission
    *
    * Returns number of packets for a specific agreement that need retransmission.
@@ -220,8 +226,8 @@
    * \param tid Traffic ID of transmitted packet.
    *
    * This method to set the number of packets waitin for blockAck = 0 since the receiver will send the blockAck right away
-   */ 
-  void CompleteAmpduExchange(Mac48Address recipient, uint8_t tid);
+   */
+  void CompleteAmpduExchange (Mac48Address recipient, uint8_t tid);
   /**
    * \param nPackets Minimum number of packets for use of block ack.
    *
@@ -229,11 +235,13 @@
    * and buffered packets) is greater of <i>nPackets</i>, they are transmitted using block ack mechanism.
    */
   void SetBlockAckThreshold (uint8_t nPackets);
+
   /**
    * \param queue The WifiMacQueue object.
    */
   void SetQueue (Ptr<WifiMacQueue> queue);
   void SetTxMiddle (MacTxMiddle* txMiddle);
+
   /**
    * \param bAckType Type of block ack
    *
@@ -271,15 +279,16 @@
    * to ns3:WifiMacQueue delay value.
    */
   void SetMaxPacketDelay (Time maxDelay);
-  /**
-   */
+
   void SetBlockAckInactivityCallback (Callback<void, Mac48Address, uint8_t, bool> callback);
   void SetBlockDestinationCallback (Callback<void, Mac48Address, uint8_t> callback);
   void SetUnblockDestinationCallback (Callback<void, Mac48Address, uint8_t> callback);
+
   /**
    * \param recipient
    * \param tid
    * \param startingSeq
+   *
    * \return true if there are packets in the queue that could be sent under block ACK,
    *         false otherwise
    *
@@ -292,6 +301,7 @@
   /**
    * \param recipient
    * \param tid
+   *
    * \return the sequence number of the next retry packet for a specific agreement
    *
    * Returns the sequence number of the next retry packet for a specific agreement.
@@ -302,7 +312,7 @@
   /**
    * Checks if the packet already exists in the retransmit queue or not if it does then it doesn't add it again
    */
-  bool AlreadyExists(uint16_t currentSeq, Mac48Address recipient, uint8_t tid);
+  bool AlreadyExists (uint16_t currentSeq, Mac48Address recipient, uint8_t tid);
   /**
    * Remove a packet after you peek in the queue and get it
    */
@@ -337,11 +347,13 @@
    * packet transmission was completed unsuccessfully.
    */
   void SetTxFailedCallback (TxFailed callback);
-    
+
+
 private:
   /**
    * \param recipient
    * \param tid
+   *
    * \return a packet
    *
    * Checks if all packets, for which a block ack agreement was established or refreshed,
@@ -350,6 +362,7 @@
    * <i>recipient</i>,<i>tid</i>) is needed.
    */
   Ptr<Packet> ScheduleBlockAckReqIfNeeded (Mac48Address recipient, uint8_t tid);
+
   /**
    * This method removes packets whose lifetime was exceeded.
    */
@@ -369,7 +382,6 @@
    * typedef for a const iterator for PacketQueue.
    */
   typedef std::list<Item>::const_iterator PacketQueueCI;
-
   /**
    * typedef for a map between MAC address and block ACK agreement.
    */
@@ -415,6 +427,7 @@
    * erased from this data structure. Pushed back in retransmission queue otherwise.
    */
   Agreements m_agreements;
+
   /**
    * This list contains all iterators to stored packets that need to be retransmitted.
    * A packet needs retransmission if it's indicated as not correctly received in a block ack
@@ -434,9 +447,9 @@
   Callback<void, Mac48Address, uint8_t> m_unblockPackets;
   TxOk m_txOkCallback;
   TxFailed m_txFailedCallback;
-  Ptr<WifiRemoteStationManager> m_stationManager; //!<
+  Ptr<WifiRemoteStationManager> m_stationManager;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* BLOCK_ACK_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/capability-information.cc ns-3.24/src/wifi/model/capability-information.cc
--- ns-3.23/src/wifi/model/capability-information.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/capability-information.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "capability-information.h"
 #include "ns3/log.h"
 
@@ -37,6 +38,7 @@
   Set (0);
   Clear (1);
 }
+
 void
 CapabilityInformation::SetIbss (void)
 {
@@ -51,6 +53,7 @@
   NS_LOG_FUNCTION (this);
   return Is (0);
 }
+
 bool
 CapabilityInformation::IsIbss (void) const
 {
@@ -82,13 +85,13 @@
   return (m_capability & mask) == mask;
 }
 
-
 uint32_t
 CapabilityInformation::GetSerializedSize (void) const
 {
   NS_LOG_FUNCTION (this);
   return 2;
 }
+
 Buffer::Iterator
 CapabilityInformation::Serialize (Buffer::Iterator start) const
 {
@@ -96,6 +99,7 @@
   start.WriteHtolsbU16 (m_capability);
   return start;
 }
+
 Buffer::Iterator
 CapabilityInformation::Deserialize (Buffer::Iterator start)
 {
@@ -104,5 +108,4 @@
   return start;
 }
 
-
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/capability-information.h ns-3.24/src/wifi/model/capability-information.h
--- ns-3.23/src/wifi/model/capability-information.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/capability-information.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef CAPABILITY_INFORMATION_H
 #define CAPABILITY_INFORMATION_H
 
@@ -64,7 +65,7 @@
   bool IsIbss (void) const;
 
   /**
-   * Return the serialized size of capability 
+   * Return the serialized size of capability
    * information.
    *
    * \return the serialized size
@@ -86,11 +87,14 @@
    *         was deserialized
    */
   Buffer::Iterator Deserialize (Buffer::Iterator start);
+
+
 private:
   /**
    * Check if bit n is set to 1.
    *
    * \param n the bit position
+   *
    * \return true if bit n is set to 1,
    *         false otherwise
    */
@@ -110,6 +114,6 @@
   uint16_t m_capability;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* CAPABILITY_INFORMATION_H */
diff -Naur ns-3.23/src/wifi/model/cara-wifi-manager.cc ns-3.24/src/wifi/model/cara-wifi-manager.cc
--- ns-3.23/src/wifi/model/cara-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/cara-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -83,6 +83,7 @@
 {
   NS_LOG_FUNCTION (this);
 }
+
 CaraWifiManager::~CaraWifiManager ()
 {
   NS_LOG_FUNCTION (this);
@@ -125,12 +126,14 @@
       station->m_timer = 0;
     }
 }
+
 void
 CaraWifiManager::DoReportRxOk (WifiRemoteStation *st,
                                double rxSnr, WifiMode txMode)
 {
   NS_LOG_FUNCTION (this << st << rxSnr << txMode);
 }
+
 void
 CaraWifiManager::DoReportRtsOk (WifiRemoteStation *st,
                                 double ctsSnr, WifiMode ctsMode, double rtsSnr)
@@ -138,6 +141,7 @@
   NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
   NS_LOG_DEBUG ("self=" << st << " rts ok");
 }
+
 void
 CaraWifiManager::DoReportDataOk (WifiRemoteStation *st,
                                  double ackSnr, WifiMode ackMode, double dataSnr)
@@ -160,11 +164,13 @@
       station->m_success = 0;
     }
 }
+
 void
 CaraWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
 {
   NS_LOG_FUNCTION (this << st);
 }
+
 void
 CaraWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
 {
@@ -177,15 +183,29 @@
 {
   NS_LOG_FUNCTION (this << st << size);
   CaraWifiRemoteStation *station = (CaraWifiRemoteStation *) st;
-  return WifiTxVector (GetSupported (station, station->m_rate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, station->m_rate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
+
 WifiTxVector
 CaraWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
 {
   NS_LOG_FUNCTION (this << st);
+  CaraWifiRemoteStation *station = (CaraWifiRemoteStation *) st;
   /// \todo we could/should implement the Arf algorithm for
   /// RTS only by picking a single rate within the BasicRateSet.
-  return WifiTxVector (GetSupported (st, 0), GetDefaultTxPowerLevel (), GetLongRetryCount (st), GetShortGuardInterval (st), Min (GetNumberOfReceiveAntennas (st),GetNumberOfTransmitAntennas()), GetNess (st), GetStbc (st));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
 bool
@@ -204,4 +224,4 @@
   return true;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/cara-wifi-manager.h ns-3.24/src/wifi/model/cara-wifi-manager.h
--- ns-3.23/src/wifi/model/cara-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/cara-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Federico Maguolo <maguolof@dei.unipd.it>
  */
+
 #ifndef CARA_WIFI_MANAGER_H
 #define CARA_WIFI_MANAGER_H
 
@@ -42,8 +43,9 @@
   CaraWifiManager ();
   virtual ~CaraWifiManager ();
 
+
 private:
-  // overriden from base class
+  //overriden from base class
   virtual WifiRemoteStation * DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
@@ -67,6 +69,6 @@
   uint32_t m_probeThreshold;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* CARA_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/constant-rate-wifi-manager.cc ns-3.24/src/wifi/model/constant-rate-wifi-manager.cc
--- ns-3.23/src/wifi/model/constant-rate-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/constant-rate-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -19,7 +19,6 @@
  */
 
 #include "constant-rate-wifi-manager.h"
-
 #include "ns3/string.h"
 #include "ns3/assert.h"
 #include "ns3/log.h"
@@ -55,12 +54,12 @@
 {
   NS_LOG_FUNCTION (this);
 }
+
 ConstantRateWifiManager::~ConstantRateWifiManager ()
 {
   NS_LOG_FUNCTION (this);
 }
 
-
 WifiRemoteStation *
 ConstantRateWifiManager::DoCreateStation (void) const
 {
@@ -69,40 +68,45 @@
   return station;
 }
 
-
 void
 ConstantRateWifiManager::DoReportRxOk (WifiRemoteStation *station,
                                        double rxSnr, WifiMode txMode)
 {
   NS_LOG_FUNCTION (this << station << rxSnr << txMode);
 }
+
 void
 ConstantRateWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
 {
   NS_LOG_FUNCTION (this << station);
 }
+
 void
 ConstantRateWifiManager::DoReportDataFailed (WifiRemoteStation *station)
 {
   NS_LOG_FUNCTION (this << station);
 }
+
 void
 ConstantRateWifiManager::DoReportRtsOk (WifiRemoteStation *st,
                                         double ctsSnr, WifiMode ctsMode, double rtsSnr)
 {
   NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
 }
+
 void
 ConstantRateWifiManager::DoReportDataOk (WifiRemoteStation *st,
                                          double ackSnr, WifiMode ackMode, double dataSnr)
 {
   NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr);
 }
+
 void
 ConstantRateWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
 {
   NS_LOG_FUNCTION (this << station);
 }
+
 void
 ConstantRateWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
 {
@@ -113,13 +117,14 @@
 ConstantRateWifiManager::DoGetDataTxVector (WifiRemoteStation *st, uint32_t size)
 {
   NS_LOG_FUNCTION (this << st << size);
-  return WifiTxVector (m_dataMode, GetDefaultTxPowerLevel (), GetLongRetryCount (st), GetShortGuardInterval (st), Min (GetNumberOfReceiveAntennas (st),GetNumberOfTransmitAntennas()), GetNess (st), GetStbc (st));
+  return WifiTxVector (m_dataMode, GetDefaultTxPowerLevel (), GetLongRetryCount (st), GetShortGuardInterval (st), 1, 0, GetChannelWidth (st), GetAggregation (st), false);
 }
+
 WifiTxVector
 ConstantRateWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
 {
   NS_LOG_FUNCTION (this << st);
-  return WifiTxVector (m_ctlMode, GetDefaultTxPowerLevel (), GetShortRetryCount (st), GetShortGuardInterval (st), Min (GetNumberOfReceiveAntennas (st),GetNumberOfTransmitAntennas()), GetNess (st), GetStbc (st));
+  return WifiTxVector (m_ctlMode, GetDefaultTxPowerLevel (), GetShortRetryCount (st), GetShortGuardInterval (st), 1, 0, GetChannelWidth (st), GetAggregation (st), false);
 }
 
 bool
@@ -129,4 +134,4 @@
   return true;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/constant-rate-wifi-manager.h ns-3.24/src/wifi/model/constant-rate-wifi-manager.h
--- ns-3.23/src/wifi/model/constant-rate-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/constant-rate-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,11 +17,11 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef CONSTANT_RATE_WIFI_MANAGER_H
 #define CONSTANT_RATE_WIFI_MANAGER_H
 
 #include <stdint.h>
-
 #include "wifi-remote-station-manager.h"
 
 namespace ns3 {
@@ -40,8 +40,9 @@
   ConstantRateWifiManager ();
   virtual ~ConstantRateWifiManager ();
 
+
 private:
-  // overriden from base class
+  //overriden from base class
   virtual WifiRemoteStation* DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
@@ -58,11 +59,9 @@
   virtual bool IsLowLatency (void) const;
 
   WifiMode m_dataMode; //!< Wifi mode for unicast DATA frames
-  WifiMode m_ctlMode; //!< Wifi mode for RTS frames
+  WifiMode m_ctlMode;  //!< Wifi mode for RTS frames
 };
 
-} // namespace ns3
-
-
+} //namespace ns3
 
 #endif /* CONSTANT_RATE_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/ctrl-headers.cc ns-3.24/src/wifi/model/ctrl-headers.cc
--- ns-3.23/src/wifi/model/ctrl-headers.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ctrl-headers.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,9 +17,9 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "ns3/fatal-error.h"
 #include "ns3/log.h"
-
 #include "ctrl-headers.h"
 
 namespace ns3 {
@@ -275,6 +275,7 @@
   return (m_multiTid && m_compressed) ? true : false;
 }
 
+
 /***********************************
  *       Block ack response
  ***********************************/
@@ -784,4 +785,4 @@
   memset (&bitmap, 0, sizeof (bitmap));
 }
 
-}  // namespace ns3
+}  //namespace ns3
diff -Naur ns-3.23/src/wifi/model/ctrl-headers.h ns-3.24/src/wifi/model/ctrl-headers.h
--- ns-3.23/src/wifi/model/ctrl-headers.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ctrl-headers.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef CTRL_HEADERS_H
 #define CTRL_HEADERS_H
 
@@ -77,10 +78,10 @@
    */
   void SetTidInfo (uint8_t tid);
   /**
-   * Set the starting sequence number from the given 
+   * Set the starting sequence number from the given
    * raw sequence control field.
    *
-   * \param seq the raw sequence control 
+   * \param seq the raw sequence control
    */
   void SetStartingSequence (uint16_t seq);
 
@@ -134,6 +135,7 @@
    */
   uint16_t GetStartingSequenceControl (void) const;
 
+
 private:
   /**
    * Set the starting sequence control with the given
@@ -168,6 +170,7 @@
   uint16_t m_startingSeq;
 };
 
+
 /**
  * \ingroup wifi
  * \brief Headers for Block ack response.
@@ -211,10 +214,10 @@
    */
   void SetTidInfo (uint8_t tid);
   /**
-   * Set the starting sequence number from the given 
+   * Set the starting sequence number from the given
    * raw sequence control field.
    *
-   * \param seq the raw sequence control 
+   * \param seq the raw sequence control
    */
   void SetStartingSequence (uint16_t seq);
 
@@ -328,6 +331,7 @@
    */
   void ResetBitmap (void);
 
+
 private:
   /**
    * Return the block ACK control.
@@ -401,6 +405,6 @@
   } bitmap;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* CTRL_HEADERS_H */
diff -Naur ns-3.23/src/wifi/model/dca-txop.cc ns-3.24/src/wifi/model/dca-txop.cc
--- ns-3.23/src/wifi/model/dca-txop.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/dca-txop.cc	2015-09-15 11:18:44.000000000 -0700
@@ -25,7 +25,6 @@
 #include "ns3/node.h"
 #include "ns3/uinteger.h"
 #include "ns3/pointer.h"
-
 #include "dca-txop.h"
 #include "dcf-manager.h"
 #include "mac-low.h"
@@ -49,6 +48,7 @@
     : m_txop (txop)
   {
   }
+
 private:
   virtual void DoNotifyAccessGranted (void)
   {
@@ -74,9 +74,11 @@
   {
     m_txop->NotifyWakeUp ();
   }
+
   DcaTxop *m_txop;
 };
 
+
 /**
  * Listener for MacLow events. Forwards to DcaTxop.
  */
@@ -90,10 +92,13 @@
    */
   TransmissionListener (DcaTxop * txop)
     : MacLowTransmissionListener (),
-      m_txop (txop) {
+      m_txop (txop)
+  {
   }
 
-  virtual ~TransmissionListener () {}
+  virtual ~TransmissionListener ()
+  {
+  }
 
   virtual void GotCts (double snr, WifiMode txMode)
   {
@@ -134,7 +139,7 @@
 DcaTxop::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::DcaTxop")
-    .SetParent (ns3::Dcf::GetTypeId ())
+    .SetParent<ns3::Dcf> ()
     .SetGroupName ("Wifi")
     .AddConstructor<DcaTxop> ()
     .AddAttribute ("Queue", "The WifiMacQueue object",
@@ -196,18 +201,21 @@
   NS_LOG_FUNCTION (this << low);
   m_low = low;
 }
+
 void
 DcaTxop::SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> remoteManager)
 {
   NS_LOG_FUNCTION (this << remoteManager);
   m_stationManager = remoteManager;
 }
+
 void
 DcaTxop::SetTxOkCallback (TxOk callback)
 {
   NS_LOG_FUNCTION (this << &callback);
   m_txOkCallback = callback;
 }
+
 void
 DcaTxop::SetTxFailedCallback (TxFailed callback)
 {
@@ -228,30 +236,35 @@
   NS_LOG_FUNCTION (this << minCw);
   m_dcf->SetCwMin (minCw);
 }
+
 void
 DcaTxop::SetMaxCw (uint32_t maxCw)
 {
   NS_LOG_FUNCTION (this << maxCw);
   m_dcf->SetCwMax (maxCw);
 }
+
 void
 DcaTxop::SetAifsn (uint32_t aifsn)
 {
   NS_LOG_FUNCTION (this << aifsn);
   m_dcf->SetAifsn (aifsn);
 }
+
 uint32_t
 DcaTxop::GetMinCw (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_dcf->GetCwMin ();
 }
+
 uint32_t
 DcaTxop::GetMaxCw (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_dcf->GetCwMax ();
 }
+
 uint32_t
 DcaTxop::GetAifsn (void) const
 {
@@ -303,7 +316,6 @@
     }
 }
 
-
 Ptr<MacLow>
 DcaTxop::Low (void)
 {
@@ -327,6 +339,7 @@
   m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   ns3::Dcf::DoInitialize ();
 }
+
 bool
 DcaTxop::NeedRtsRetransmission (void)
 {
@@ -342,6 +355,7 @@
   return m_stationManager->NeedDataRetransmission (m_currentHdr.GetAddr1 (), &m_currentHdr,
                                                    m_currentPacket);
 }
+
 bool
 DcaTxop::NeedFragmentation (void)
 {
@@ -364,6 +378,7 @@
   return m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,
                                             m_currentPacket, m_fragmentNumber);
 }
+
 bool
 DcaTxop::IsLastFragment (void)
 {
@@ -430,6 +445,7 @@
       NS_ASSERT (m_currentPacket != 0);
       uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr);
       m_currentHdr.SetSequenceNumber (sequence);
+      m_stationManager->UpdateFragmentationThreshold ();
       m_currentHdr.SetFragmentNumber (0);
       m_currentHdr.SetNoMoreFragments ();
       m_currentHdr.SetNoRetry ();
@@ -505,6 +521,7 @@
   NS_LOG_FUNCTION (this);
   NotifyCollision ();
 }
+
 void
 DcaTxop::NotifyCollision (void)
 {
@@ -521,6 +538,7 @@
   m_queue->Flush ();
   m_currentPacket = 0;
 }
+
 void
 DcaTxop::NotifySleep (void)
 {
@@ -531,6 +549,7 @@
       m_currentPacket = 0;
     }
 }
+
 void
 DcaTxop::NotifyWakeUp (void)
 {
@@ -544,6 +563,7 @@
   NS_LOG_FUNCTION (this << snr << txMode);
   NS_LOG_DEBUG ("got cts");
 }
+
 void
 DcaTxop::MissedCts (void)
 {
@@ -557,7 +577,7 @@
         {
           m_txFailedCallback (m_currentHdr);
         }
-      // to reset the dcf.
+      //to reset the dcf.
       m_currentPacket = 0;
       m_dcf->ResetCw ();
     }
@@ -568,6 +588,7 @@
   m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   RestartAccessIfNeeded ();
 }
+
 void
 DcaTxop::GotAck (double snr, WifiMode txMode)
 {
@@ -594,6 +615,7 @@
       NS_LOG_DEBUG ("got ack. tx not done, size=" << m_currentPacket->GetSize ());
     }
 }
+
 void
 DcaTxop::MissedAck (void)
 {
@@ -607,7 +629,7 @@
         {
           m_txFailedCallback (m_currentHdr);
         }
-      // to reset the dcf.
+      //to reset the dcf.
       m_currentPacket = 0;
       m_dcf->ResetCw ();
     }
@@ -620,6 +642,7 @@
   m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   RestartAccessIfNeeded ();
 }
+
 void
 DcaTxop::StartNext (void)
 {
@@ -687,4 +710,4 @@
   StartAccessIfNeeded ();
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/dca-txop.h ns-3.24/src/wifi/model/dca-txop.h
--- ns-3.23/src/wifi/model/dca-txop.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/dca-txop.h	2015-09-15 11:18:44.000000000 -0700
@@ -125,6 +125,7 @@
    * \return WifiMacQueue
    */
   Ptr<WifiMacQueue > GetQueue () const;
+
   virtual void SetMinCw (uint32_t minCw);
   virtual void SetMaxCw (uint32_t maxCw);
   virtual void SetAifsn (uint32_t aifsn);
@@ -141,16 +142,18 @@
    */
   void Queue (Ptr<const Packet> packet, const WifiMacHeader &hdr);
 
- /**
-  * 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
-  */
+  /**
+   * 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);
 
+
 private:
   class TransmissionListener;
   class NavListener;
@@ -162,7 +165,7 @@
   DcaTxop &operator = (const DcaTxop &);
   DcaTxop (const DcaTxop &o);
 
-  // Inherited from ns3::Object
+  //Inherited from ns3::Object
   /**
    * Return the MacLow associated with this DcaTxop.
    *
@@ -178,6 +181,7 @@
    *         false otherwise
    */
   bool NeedsAccess (void) const;
+
   /**
    * Notify the DCF that access has been granted.
    */
@@ -250,24 +254,29 @@
    * Request access from DCF manager if needed.
    */
   void StartAccessIfNeeded (void);
+
   /**
    * Check if the current packet should be sent with a RTS protection.
    *
    * \param packet
    * \param header
-   * \return true if RTS protection should be used, false otherwise
+   *
+   * \return true if RTS protection should be used,
+   *         false otherwise
    */
   bool NeedRts (Ptr<const Packet> packet, const WifiMacHeader *header);
   /**
    * Check if RTS should be re-transmitted if CTS was missed.
    *
-   * \return true if RTS should be re-transmitted, false otherwise
+   * \return true if RTS should be re-transmitted,
+   *         false otherwise
    */
   bool NeedRtsRetransmission (void);
   /**
    * Check if DATA should be re-transmitted if ACK was missed.
    *
-   * \return true if DATA should be re-transmitted, false otherwise
+   * \return true if DATA should be re-transmitted,
+   *         false otherwise
    */
   bool NeedDataRetransmission (void);
   /**
@@ -313,9 +322,11 @@
    * appropriate Wifi header for the fragment.
    *
    * \param hdr
+   *
    * \return the fragment with the current fragment number
    */
   Ptr<Packet> GetFragmentPacket (WifiMacHeader *hdr);
+
   virtual void DoDispose (void);
 
   Dcf *m_dcf;
@@ -335,8 +346,6 @@
   uint8_t m_fragmentNumber;
 };
 
-} // namespace ns3
-
-
+} //namespace ns3
 
 #endif /* DCA_TXOP_H */
diff -Naur ns-3.23/src/wifi/model/dcf.cc ns-3.24/src/wifi/model/dcf.cc
--- ns-3.23/src/wifi/model/dcf.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/dcf.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "dcf.h"
 #include "ns3/uinteger.h"
 #include "ns3/log.h"
@@ -51,4 +52,4 @@
   return tid;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/dcf.h ns-3.24/src/wifi/model/dcf.h
--- ns-3.23/src/wifi/model/dcf.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/dcf.h	2015-09-15 11:18:44.000000000 -0700
@@ -73,6 +73,6 @@
   virtual uint32_t GetAifsn (void) const = 0;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* DCF_H */
diff -Naur ns-3.23/src/wifi/model/dcf-manager.cc ns-3.24/src/wifi/model/dcf-manager.cc
--- ns-3.23/src/wifi/model/dcf-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/dcf-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -22,7 +22,6 @@
 #include "ns3/log.h"
 #include "ns3/simulator.h"
 #include <cmath>
-
 #include "dcf-manager.h"
 #include "wifi-phy.h"
 #include "wifi-mac.h"
@@ -58,28 +57,33 @@
 {
   m_aifsn = aifsn;
 }
+
 void
 DcfState::SetCwMin (uint32_t minCw)
 {
   m_cwMin = minCw;
   ResetCw ();
 }
+
 void
 DcfState::SetCwMax (uint32_t maxCw)
 {
   m_cwMax = maxCw;
   ResetCw ();
 }
+
 uint32_t
 DcfState::GetAifsn (void) const
 {
   return m_aifsn;
 }
+
 uint32_t
 DcfState::GetCwMin (void) const
 {
   return m_cwMin;
 }
+
 uint32_t
 DcfState::GetCwMax (void) const
 {
@@ -91,12 +95,14 @@
 {
   m_cw = m_cwMin;
 }
+
 void
 DcfState::UpdateFailedCw (void)
 {
-  // see 802.11-2012, section 9.19.2.5
+  //see 802.11-2012, section 9.19.2.5
   m_cw = std::min ( 2 * (m_cw + 1) - 1, m_cwMax);
 }
+
 void
 DcfState::UpdateBackoffSlotsNow (uint32_t nSlots, Time backoffUpdateBound)
 {
@@ -119,16 +125,19 @@
 {
   return m_cw;
 }
+
 uint32_t
 DcfState::GetBackoffSlots (void) const
 {
   return m_backoffSlots;
 }
+
 Time
 DcfState::GetBackoffStart (void) const
 {
   return m_backoffStart;
 }
+
 bool
 DcfState::IsAccessRequested (void) const
 {
@@ -139,6 +148,7 @@
 {
   m_accessRequested = true;
 }
+
 void
 DcfState::NotifyAccessGranted (void)
 {
@@ -146,26 +156,31 @@
   m_accessRequested = false;
   DoNotifyAccessGranted ();
 }
+
 void
 DcfState::NotifyCollision (void)
 {
   DoNotifyCollision ();
 }
+
 void
 DcfState::NotifyInternalCollision (void)
 {
   DoNotifyInternalCollision ();
 }
+
 void
 DcfState::NotifyChannelSwitching (void)
 {
   DoNotifyChannelSwitching ();
 }
+
 void
 DcfState::NotifySleep (void)
 {
   DoNotifySleep ();
 }
+
 void
 DcfState::NotifyWakeUp (void)
 {
@@ -215,10 +230,12 @@
   {
     m_dcf->NotifyCtsTimeoutResetNow ();
   }
+
 private:
   ns3::DcfManager *m_dcf;  //!< DcfManager to forward events to
 };
 
+
 /**
  * Listener for PHY events. Forwards to DcfManager
  */
@@ -269,10 +286,12 @@
   {
     m_dcf->NotifyWakeupNow ();
   }
+
 private:
   ns3::DcfManager *m_dcf;  //!< DcfManager to forward events to
 };
 
+
 /****************************************************************
  *      Implement the DCF manager of all DCF state holders
  ****************************************************************/
@@ -352,18 +371,21 @@
   NS_LOG_FUNCTION (this << slotTime);
   m_slotTimeUs = slotTime.GetMicroSeconds ();
 }
+
 void
 DcfManager::SetSifs (Time sifs)
 {
   NS_LOG_FUNCTION (this << sifs);
   m_sifs = sifs;
 }
+
 void
 DcfManager::SetEifsNoDifs (Time eifsNoDifs)
 {
   NS_LOG_FUNCTION (this << eifsNoDifs);
   m_eifsNoDifs = eifsNoDifs;
 }
+
 Time
 DcfManager::GetEifsNoDifs () const
 {
@@ -384,6 +406,7 @@
   NS_LOG_FUNCTION (this << a << b);
   return Max (a, b);
 }
+
 Time
 DcfManager::MostRecent (Time a, Time b, Time c) const
 {
@@ -393,6 +416,7 @@
   retval = Max (retval, c);
   return retval;
 }
+
 Time
 DcfManager::MostRecent (Time a, Time b, Time c, Time d) const
 {
@@ -402,6 +426,7 @@
   Time retval = Max (e, f);
   return retval;
 }
+
 Time
 DcfManager::MostRecent (Time a, Time b, Time c, Time d, Time e, Time f) const
 {
@@ -450,14 +475,15 @@
   return false;
 }
 
-
 void
 DcfManager::RequestAccess (DcfState *state)
 {
   NS_LOG_FUNCTION (this << state);
-  // Deny access if in sleep mode
+  //Deny access if in sleep mode
   if (m_sleeping)
-    return;
+    {
+      return;
+    }
   UpdateBackoff ();
   NS_ASSERT (!state->IsAccessRequested ());
   state->NotifyAccessRequested ();
@@ -494,7 +520,7 @@
            * needs access to the medium. i.e., it has data to send.
            */
           MY_DEBUG ("dcf " << k << " needs access. backoff expired. access granted. slots=" << state->GetBackoffSlots ());
-          i++; // go to the next item in the list.
+          i++; //go to the next item in the list.
           k++;
           std::vector<DcfState *> internalCollisionStates;
           for (States::const_iterator j = i; j != m_states.end (); j++, k++)
@@ -669,6 +695,7 @@
   m_lastRxDuration = duration;
   m_rxing = true;
 }
+
 void
 DcfManager::NotifyRxEndOkNow (void)
 {
@@ -678,6 +705,7 @@
   m_lastRxReceivedOk = true;
   m_rxing = false;
 }
+
 void
 DcfManager::NotifyRxEndErrorNow (void)
 {
@@ -687,6 +715,7 @@
   m_lastRxReceivedOk = false;
   m_rxing = false;
 }
+
 void
 DcfManager::NotifyTxStartNow (Time duration)
 {
@@ -694,8 +723,7 @@
   if (m_rxing)
     {
       //this may be caused only if PHY has started to receive a packet
-      //inside SIFS, so, we check that lastRxStart was maximum a SIFS
-      //ago
+      //inside SIFS, so, we check that lastRxStart was maximum a SIFS ago
       NS_ASSERT (Simulator::Now () - m_lastRxStart <= m_sifs);
       m_lastRxEnd = Simulator::Now ();
       m_lastRxDuration = m_lastRxEnd - m_lastRxStart;
@@ -707,6 +735,7 @@
   m_lastTxStart = Simulator::Now ();
   m_lastTxDuration = duration;
 }
+
 void
 DcfManager::NotifyMaybeCcaBusyStartNow (Time duration)
 {
@@ -717,7 +746,6 @@
   m_lastBusyDuration = duration;
 }
 
-
 void
 DcfManager::NotifySwitchingStartNow (Time duration)
 {
@@ -728,7 +756,7 @@
 
   if (m_rxing)
     {
-      // channel switching during packet reception
+      //channel switching during packet reception
       m_lastRxEnd = Simulator::Now ();
       m_lastRxDuration = m_lastRxEnd - m_lastRxStart;
       m_lastRxReceivedOk = true;
@@ -751,13 +779,13 @@
       m_lastCtsTimeoutEnd = now;
     }
 
-  // Cancel timeout
+  //Cancel timeout
   if (m_accessTimeout.IsRunning ())
     {
       m_accessTimeout.Cancel ();
     }
 
-  // Reset backoffs
+  //Reset backoffs
   for (States::iterator i = m_states.begin (); i != m_states.end (); i++)
     {
       DcfState *state = *i;
@@ -783,13 +811,13 @@
 {
   NS_LOG_FUNCTION (this);
   m_sleeping = true;
-  // Cancel timeout
+  //Cancel timeout
   if (m_accessTimeout.IsRunning ())
     {
       m_accessTimeout.Cancel ();
     }
 
-  // Reset backoffs
+  //Reset backoffs
   for (States::iterator i = m_states.begin (); i != m_states.end (); i++)
     {
       DcfState *state = *i;
@@ -834,6 +862,7 @@
    */
   DoRestartAccessTimeoutIfNeeded ();
 }
+
 void
 DcfManager::NotifyNavStartNow (Time duration)
 {
@@ -849,6 +878,7 @@
       m_lastNavDuration = duration;
     }
 }
+
 void
 DcfManager::NotifyAckTimeoutStartNow (Time duration)
 {
@@ -856,6 +886,7 @@
   NS_ASSERT (m_lastAckTimeoutEnd < Simulator::Now ());
   m_lastAckTimeoutEnd = Simulator::Now () + duration;
 }
+
 void
 DcfManager::NotifyAckTimeoutResetNow ()
 {
@@ -863,12 +894,14 @@
   m_lastAckTimeoutEnd = Simulator::Now ();
   DoRestartAccessTimeoutIfNeeded ();
 }
+
 void
 DcfManager::NotifyCtsTimeoutStartNow (Time duration)
 {
   NS_LOG_FUNCTION (this << duration);
   m_lastCtsTimeoutEnd = Simulator::Now () + duration;
 }
+
 void
 DcfManager::NotifyCtsTimeoutResetNow ()
 {
@@ -876,4 +909,4 @@
   m_lastCtsTimeoutEnd = Simulator::Now ();
   DoRestartAccessTimeoutIfNeeded ();
 }
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/dcf-manager.h ns-3.24/src/wifi/model/dcf-manager.h
--- ns-3.23/src/wifi/model/dcf-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/dcf-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -47,7 +47,6 @@
 {
 public:
   DcfState ();
-
   virtual ~DcfState ();
 
   /**
@@ -118,6 +117,7 @@
    */
   bool IsAccessRequested (void) const;
 
+
 private:
   friend class DcfManager;
 
@@ -169,7 +169,6 @@
    */
   void NotifyWakeUp (void);
 
-
   /**
    * Called by DcfManager to notify a DcfState subclass
    * that access to the medium is granted and can
@@ -213,7 +212,7 @@
   */
   virtual void DoNotifySleep (void) = 0;
   /**
-  * Called by DcfManager to notify a DcfState subclass that the device 
+  * Called by DcfManager to notify a DcfState subclass that the device
   * has begun to wake up.
   *
   * The subclass is expected to restart a new backoff by
@@ -224,9 +223,9 @@
 
   uint32_t m_aifsn;
   uint32_t m_backoffSlots;
-  // the backoffStart variable is used to keep track of the
-  // time at which a backoff was started or the time at which
-  // the backoff counter was last updated.
+  //the backoffStart variable is used to keep track of the
+  //time at which a backoff was started or the time at which
+  //the backoff counter was last updated.
   Time m_backoffStart;
   uint32_t m_cwMin;
   uint32_t m_cwMax;
@@ -234,6 +233,7 @@
   bool m_accessRequested;
 };
 
+
 /**
  * \brief Manage a set of ns3::DcfState
  * \ingroup wifi
@@ -288,7 +288,6 @@
    * one of the Notify methods has been invoked.
    */
   void SetSifs (Time sifs);
-
   /**
    * \param eifsNoDifs the duration of a EIFS minus the duration of DIFS.
    *
@@ -403,6 +402,8 @@
    * Notify that CTS timer has resetted.
    */
   void NotifyCtsTimeoutResetNow ();
+
+
 private:
   /**
    * Update backoff slots for all DcfStates.
@@ -413,6 +414,7 @@
    *
    * \param a
    * \param b
+   *
    * \return the most recent time
    */
   Time MostRecent (Time a, Time b) const;
@@ -422,6 +424,7 @@
    * \param a
    * \param b
    * \param c
+   *
    * \return the most recent time
    */
   Time MostRecent (Time a, Time b, Time c) const;
@@ -432,6 +435,7 @@
    * \param b
    * \param c
    * \param d
+   *
    * \return the most recent time
    */
   Time MostRecent (Time a, Time b, Time c, Time d) const;
@@ -444,6 +448,7 @@
    * \param d
    * \param e
    * \param f
+   *
    * \return the most recent time
    */
   Time MostRecent (Time a, Time b, Time c, Time d, Time e, Time f) const;
@@ -457,6 +462,7 @@
    * \param e
    * \param f
    * \param g
+   *
    * \return the most recent time
    */
   Time MostRecent (Time a, Time b, Time c, Time d, Time e, Time f, Time g) const;
@@ -464,8 +470,7 @@
    * Access will never be granted to the medium _before_
    * the time returned by this method.
    *
-   * \returns the absolute time at which access could start to
-   * be granted
+   * \returns the absolute time at which access could start to be granted
    */
   Time GetAccessGrantStart (void) const;
   /**
@@ -473,6 +478,7 @@
    * started for the given DcfState.
    *
    * \param state
+   *
    * \return the time when the backoff procedure started
    */
   Time GetBackoffStartFor (DcfState *state);
@@ -481,10 +487,13 @@
    * ended (or will ended) for the given DcfState.
    *
    * \param state
+   *
    * \return the time when the backoff procedure ended (or will ended)
    */
   Time GetBackoffEndFor (DcfState *state);
+
   void DoRestartAccessTimeoutIfNeeded (void);
+
   /**
    * Called when access timeout should occur
    * (e.g. backoff procedure expired).
@@ -533,6 +542,6 @@
   LowDcfListener* m_lowListener;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* DCF_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/dsss-error-rate-model.cc ns-3.24/src/wifi/model/dsss-error-rate-model.cc
--- ns-3.23/src/wifi/model/dsss-error-rate-model.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/dsss-error-rate-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -36,39 +36,39 @@
 {
   NS_LOG_FUNCTION_NOARGS ();
   return ((std::sqrt (2.0) + 1.0) / std::sqrt (8.0 * M_PI * std::sqrt (2.0)))
-    * (1.0 / std::sqrt (x)) * std::exp ( -(2.0 - std::sqrt (2.0)) * x);
+         * (1.0 / std::sqrt (x)) * std::exp ( -(2.0 - std::sqrt (2.0)) * x);
 }
 
 double
 DsssErrorRateModel::GetDsssDbpskSuccessRate (double sinr, uint32_t nbits)
 {
   NS_LOG_FUNCTION_NOARGS ();
-  double EbN0 = sinr * 22000000.0 / 1000000.0; // 1 bit per symbol with 1 MSPS
+  double EbN0 = sinr * 22000000.0 / 1000000.0; //1 bit per symbol with 1 MSPS
   double ber = 0.5 * std::exp (-EbN0);
   return std::pow ((1.0 - ber), static_cast<double> (nbits));
 }
 
 double
-DsssErrorRateModel::GetDsssDqpskSuccessRate (double sinr,uint32_t nbits)
+DsssErrorRateModel::GetDsssDqpskSuccessRate (double sinr, uint32_t nbits)
 {
   NS_LOG_FUNCTION_NOARGS ();
-  double EbN0 = sinr * 22000000.0 / 1000000.0 / 2.0; // 2 bits per symbol, 1 MSPS
+  double EbN0 = sinr * 22000000.0 / 1000000.0 / 2.0; //2 bits per symbol, 1 MSPS
   double ber = DqpskFunction (EbN0);
   return std::pow ((1.0 - ber), static_cast<double> (nbits));
 }
 
 double
-DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (double sinr,uint32_t nbits)
+DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (double sinr, uint32_t nbits)
 {
   NS_LOG_FUNCTION_NOARGS ();
 #ifdef ENABLE_GSL
-  // symbol error probability
+  //symbol error probability
   double EbN0 = sinr * 22000000.0 / 1375000.0 / 4.0;
   double sep = SymbolErrorProb16Cck (4.0 * EbN0 / 2.0);
-  return std::pow (1.0 - sep,nbits / 4.0);
+  return std::pow (1.0 - sep, nbits / 4.0);
 #else
   NS_LOG_WARN ("Running a 802.11b CCK Matlab model less accurate than GSL model");
-  // The matlab model
+  //The matlab model
   double ber;
   if (sinr > WLAN_SIR_PERFECT)
     {
@@ -80,11 +80,11 @@
     }
   else
     {
-      // fitprops.coeff from matlab berfit
-      double a1 =  5.3681634344056195e-001;
-      double a2 =  3.3092430025608586e-003;
-      double a3 =  4.1654372361004000e-001;
-      double a4 =  1.0288981434358866e+000;
+      //fitprops.coeff from matlab berfit
+      double a1 = 5.3681634344056195e-001;
+      double a2 = 3.3092430025608586e-003;
+      double a3 = 4.1654372361004000e-001;
+      double a4 = 1.0288981434358866e+000;
       ber = a1 * std::exp (-std::pow ((sinr - a2) / a3, a4));
     }
   return std::pow ((1.0 - ber), static_cast<double> (nbits));
@@ -92,17 +92,17 @@
 }
 
 double
-DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (double sinr,uint32_t nbits)
+DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (double sinr, uint32_t nbits)
 {
   NS_LOG_FUNCTION_NOARGS ();
 #ifdef ENABLE_GSL
-  // symbol error probability
+  //symbol error probability
   double EbN0 = sinr * 22000000.0 / 1375000.0 / 8.0;
   double sep = SymbolErrorProb256Cck (8.0 * EbN0 / 2.0);
   return std::pow (1.0 - sep, nbits / 8.0);
 #else
   NS_LOG_WARN ("Running a 802.11b CCK Matlab model less accurate than GSL model");
-  // The matlab model
+  //The matlab model
   double ber;
   if (sinr > WLAN_SIR_PERFECT)
     {
@@ -114,13 +114,13 @@
     }
   else
     {
-      // fitprops.coeff from matlab berfit
-      double a1 =  7.9056742265333456e-003;
+      //fitprops.coeff from matlab berfit
+      double a1 = 7.9056742265333456e-003;
       double a2 = -1.8397449399176360e-001;
-      double a3 =  1.0740689468707241e+000;
-      double a4 =  1.0523316904502553e+000;
-      double a5 =  3.0552298746496687e-001;
-      double a6 =  2.2032715128698435e+000;
+      double a3 = 1.0740689468707241e+000;
+      double a4 = 1.0523316904502553e+000;
+      double a5 = 3.0552298746496687e-001;
+      double a6 = 2.2032715128698435e+000;
       ber =  (a1 * sinr * sinr + a2 * sinr + a3) / (sinr * sinr * sinr + a4 * sinr * sinr + a5 * sinr + a6);
     }
   return std::pow ((1.0 - ber), static_cast<double> (nbits));
@@ -171,4 +171,4 @@
 
 #endif
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/dsss-error-rate-model.h ns-3.24/src/wifi/model/dsss-error-rate-model.h
--- ns-3.23/src/wifi/model/dsss-error-rate-model.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/dsss-error-rate-model.h	2015-09-15 11:18:44.000000000 -0700
@@ -20,8 +20,8 @@
 
 #ifndef DSS_ERROR_RATE_MODEL_H
 #define DSS_ERROR_RATE_MODEL_H
-#include <stdint.h>
 
+#include <stdint.h>
 #ifdef ENABLE_GSL
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_integration.h>
@@ -71,7 +71,8 @@
    * A function DQPSK
    *
    * \param x x
-   * \return DQPSK(x)
+   *
+   * \return DQPSK (x)
    */
   static double DqpskFunction (double x);
   /**
@@ -79,6 +80,7 @@
    *
    * \param sinr the SINR of the chunk
    * \param nbits the size of the chunk
+   *
    * \return the chunk success rate of the differential BPSK
    */
   static double GetDsssDbpskSuccessRate (double sinr, uint32_t nbits);
@@ -87,6 +89,7 @@
    *
    * \param sinr the SINR of the chunk
    * \param nbits the size of the chunk
+   *
    * \return the chunk success rate of the differential encoded QPSK.
    */
   static double GetDsssDqpskSuccessRate (double sinr,uint32_t nbits);
@@ -96,6 +99,7 @@
    *
    * \param sinr the SINR of the chunk
    * \param nbits the size of the chunk
+   *
    * \return the chunk success rate of the differential encoded QPSK for
    */
   static double GetDsssDqpskCck5_5SuccessRate (double sinr,uint32_t nbits);
@@ -105,19 +109,23 @@
    *
    * \param sinr the SINR of the chunk
    * \param nbits the size of the chunk
+   *
    * \return the chunk success rate of the differential encoded QPSK for
    */
   static double GetDsssDqpskCck11SuccessRate (double sinr,uint32_t nbits);
 #ifdef ENABLE_GSL
-  static double SymbolErrorProb16Cck (double e2);  /// equation (18) in Pursley's paper
-  static double SymbolErrorProb256Cck (double e1);  /// equation (17) in Pursley's paper
+  static double SymbolErrorProb16Cck (double e2); /// equation (18) in Pursley's paper
+  static double SymbolErrorProb256Cck (double e1); /// equation (17) in Pursley's paper
 #else
+
+
 protected:
   static const double WLAN_SIR_PERFECT;
   static const double WLAN_SIR_IMPOSSIBLE;
 #endif
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* DSSS_ERROR_RATE_MODEL_H */
+
diff -Naur ns-3.23/src/wifi/model/edca-txop-n.cc ns-3.24/src/wifi/model/edca-txop-n.cc
--- ns-3.23/src/wifi/model/edca-txop-n.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/edca-txop-n.cc	2015-09-15 11:18:44.000000000 -0700
@@ -16,13 +16,13 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "ns3/log.h"
 #include "ns3/assert.h"
 #include "ns3/pointer.h"
-
 #include "edca-txop-n.h"
 #include "mac-low.h"
 #include "dcf-manager.h"
@@ -49,6 +49,7 @@
     : m_txop (txop)
   {
   }
+
 private:
   virtual void DoNotifyAccessGranted (void)
   {
@@ -74,18 +75,23 @@
   {
     m_txop->NotifyWakeUp ();
   }
+
   EdcaTxopN *m_txop;
 };
 
+
 class EdcaTxopN::TransmissionListener : public MacLowTransmissionListener
 {
 public:
   TransmissionListener (EdcaTxopN * txop)
     : MacLowTransmissionListener (),
-      m_txop (txop) {
+      m_txop (txop)
+  {
   }
 
-  virtual ~TransmissionListener () {}
+  virtual ~TransmissionListener ()
+  {
+  }
 
   virtual void GotCts (double snr, WifiMode txMode)
   {
@@ -124,7 +130,7 @@
     m_txop->EndTxNoAck ();
   }
   virtual Ptr<WifiMacQueue> GetQueue (void)
-  { 
+  {
     return m_txop->GetEdcaQueue ();
   }
 
@@ -132,32 +138,36 @@
   EdcaTxopN *m_txop;
 };
 
+
 class EdcaTxopN::AggregationCapableTransmissionListener : public MacLowAggregationCapableTransmissionListener
 {
 public:
   AggregationCapableTransmissionListener (EdcaTxopN * txop)
     : MacLowAggregationCapableTransmissionListener (),
-      m_txop (txop) {
+      m_txop (txop)
+  {
+  }
+  virtual ~AggregationCapableTransmissionListener ()
+  {
   }
-  virtual ~AggregationCapableTransmissionListener () {}
 
   virtual void BlockAckInactivityTimeout (Mac48Address address, uint8_t tid)
   {
     m_txop->SendDelbaFrame (address, tid, false);
   }
   virtual Ptr<WifiMacQueue> GetQueue (void)
-  { 
+  {
     return m_txop->GetEdcaQueue ();
   }
   virtual  void CompleteTransfer (Mac48Address recipient, uint8_t tid)
   {
     m_txop->CompleteAmpduTransfer (recipient, tid);
   }
-  virtual void SetAmpdu(bool ampdu)
+  virtual void SetAmpdu (bool ampdu)
   {
     return m_txop->SetAmpduExist (ampdu);
   }
-  virtual void CompleteMpduTx(Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp)
+  virtual void CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp)
   {
     m_txop->CompleteMpduTx (packet, hdr, tstamp);
   }
@@ -175,7 +185,7 @@
   }
   virtual void RemoveFromBaQueue (uint8_t tid, Mac48Address recipient, uint16_t seqnumber)
   {
-     m_txop->RemoveRetransmitPacket(tid, recipient, seqnumber);
+    m_txop->RemoveRetransmitPacket (tid, recipient, seqnumber);
   }
   virtual bool GetBlockAckAgreementExists (Mac48Address address, uint8_t tid)
   {
@@ -190,7 +200,7 @@
     return m_txop->GetNRetryNeededPackets (recipient, tid);
   }
   virtual Ptr<MsduAggregator> GetMsduAggregator (void) const
-  { 
+  {
     return m_txop->GetMsduAggregator ();
   }
   virtual Mac48Address GetSrcAddressForAggregation (const WifiMacHeader &hdr)
@@ -212,23 +222,26 @@
 EdcaTxopN::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::EdcaTxopN")
-    .SetParent (ns3::Dcf::GetTypeId ())
+    .SetParent<ns3::Dcf> ()
     .SetGroupName ("Wifi")
     .AddConstructor<EdcaTxopN> ()
-    .AddAttribute ("BlockAckThreshold", "If number of packets in this queue reaches this value,\
-                                         block ack mechanism is used. If this value is 0, block ack is never used.",
+    .AddAttribute ("BlockAckThreshold",
+                   "If number of packets in this queue reaches this value, "
+                   "block ack mechanism is used. If this value is 0, block ack is never used.",
                    UintegerValue (0),
                    MakeUintegerAccessor (&EdcaTxopN::SetBlockAckThreshold,
                                          &EdcaTxopN::GetBlockAckThreshold),
                    MakeUintegerChecker<uint8_t> (0, 64))
-    .AddAttribute ("BlockAckInactivityTimeout", "Represents max time (blocks of 1024 micro seconds) allowed for block ack\
-                                                 inactivity. 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.",
+    .AddAttribute ("BlockAckInactivityTimeout",
+                   "Represents max time (blocks of 1024 micro seconds) allowed for block ack"
+                   "inactivity. 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 (&EdcaTxopN::SetBlockAckInactivityTimeout),
                    MakeUintegerChecker<uint16_t> ())
-    .AddAttribute ("Queue", "The WifiMacQueue object",
+    .AddAttribute ("Queue",
+                   "The WifiMacQueue object",
                    PointerValue (),
                    MakePointerAccessor (&EdcaTxopN::GetEdcaQueue),
                    MakePointerChecker<WifiMacQueue> ())
@@ -292,19 +305,19 @@
 bool
 EdcaTxopN::GetBaAgreementExists (Mac48Address address, uint8_t tid)
 {
-  return m_baManager->ExistsAgreement (address, tid); 
+  return m_baManager->ExistsAgreement (address, tid);
 }
 
 uint32_t
 EdcaTxopN::GetNOutstandingPacketsInBa (Mac48Address address, uint8_t tid)
 {
-  return m_baManager->GetNBufferedPackets (address, tid); 
+  return m_baManager->GetNBufferedPackets (address, tid);
 }
 
 uint32_t
 EdcaTxopN::GetNRetryNeededPackets (Mac48Address recipient, uint8_t tid) const
 {
- return m_baManager->GetNRetryNeededPackets (recipient, tid);
+  return m_baManager->GetNRetryNeededPackets (recipient, tid);
 }
 
 void
@@ -340,8 +353,9 @@
 {
   NS_LOG_FUNCTION (this << remoteManager);
   m_stationManager = remoteManager;
-  m_baManager->SetWifiRemoteStationManager(m_stationManager);
+  m_baManager->SetWifiRemoteStationManager (m_stationManager);
 }
+
 void
 EdcaTxopN::SetTypeOfStation (enum TypeOfStation type)
 {
@@ -452,7 +466,7 @@
 void
 EdcaTxopN::RemoveRetransmitPacket (uint8_t tid, Mac48Address recipient, uint16_t seqnumber)
 {
-   m_baManager->RemovePacket (tid, recipient, seqnumber);
+  m_baManager->RemovePacket (tid, recipient, seqnumber);
 }
 
 void
@@ -492,6 +506,7 @@
 
           uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr);
           m_currentHdr.SetSequenceNumber (sequence);
+          m_stationManager->UpdateFragmentationThreshold ();
           m_currentHdr.SetFragmentNumber (0);
           m_currentHdr.SetNoMoreFragments ();
           m_currentHdr.SetNoRetry ();
@@ -525,7 +540,7 @@
     }
   else
     {
-        if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ())
+      if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ())
         {
           params.DisableAck ();
         }
@@ -535,7 +550,7 @@
         }
       if (NeedFragmentation () && ((m_currentHdr.IsQosData ()
                                     && !m_currentHdr.IsQosAmsdu ())
-                                   || 
+                                   ||
                                    (m_currentHdr.IsData ()
                                     && !m_currentHdr.IsQosData () && m_currentHdr.IsQosAmsdu ()))
           && (m_blockAckThreshold == 0
@@ -617,8 +632,10 @@
           params.DisableNextData ();
           m_low->StartTransmission (m_currentPacket, &m_currentHdr,
                                     params, m_transmissionListener);
-          if(!GetAmpduExist())
-            CompleteTx ();
+          if (!GetAmpduExist ())
+            {
+              CompleteTx ();
+            }
         }
     }
 }
@@ -652,43 +669,56 @@
   if (!NeedRtsRetransmission ())
     {
       NS_LOG_DEBUG ("Cts Fail");
+      bool resetCurrentPacket = true;
       m_stationManager->ReportFinalRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
       if (!m_txFailedCallback.IsNull ())
         {
           m_txFailedCallback (m_currentHdr);
         }
-      if (GetAmpduExist())
+      if (GetAmpduExist ())
         {
           m_low->FlushAggregateQueue ();
-          
-          NS_LOG_DEBUG ("Transmit Block Ack Request");
-          CtrlBAckRequestHeader reqHdr;
-          reqHdr.SetType (COMPRESSED_BLOCK_ACK);
-          uint8_t tid = m_currentHdr.GetQosTid ();
-          reqHdr.SetStartingSequence (m_txMiddle->PeekNextSequenceNumberfor (&m_currentHdr));
-          reqHdr.SetTidInfo (tid);
-          reqHdr.SetHtImmediateAck(true);
-          Ptr<Packet> bar = Create<Packet> ();
-          bar->AddHeader (reqHdr);
-          Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck());
-          m_currentBar = request;
-          WifiMacHeader hdr;
-          hdr.SetType (WIFI_MAC_CTL_BACKREQ);
-          hdr.SetAddr1 (request.recipient);
-          hdr.SetAddr2 (m_low->GetAddress ());
-          hdr.SetAddr3 (m_low->GetBssid ());
-          hdr.SetDsNotTo ();
-          hdr.SetDsNotFrom ();
-          hdr.SetNoRetry ();
-          hdr.SetNoMoreFragments ();
-          m_currentPacket = request.bar;
-          m_currentHdr = hdr;
+          uint8_t tid = 0;
+          if (m_currentHdr.IsQosData ())
+            {
+              tid = m_currentHdr.GetQosTid ();
+            }
+          else
+            {
+              NS_FATAL_ERROR ("Current packet is not Qos Data");
+            }
+
+          if (GetBaAgreementExists (m_currentHdr.GetAddr1 (), tid))
+            {
+              NS_LOG_DEBUG ("Transmit Block Ack Request");
+              CtrlBAckRequestHeader reqHdr;
+              reqHdr.SetType (COMPRESSED_BLOCK_ACK);
+              reqHdr.SetStartingSequence (m_txMiddle->PeekNextSequenceNumberfor (&m_currentHdr));
+              reqHdr.SetTidInfo (tid);
+              reqHdr.SetHtImmediateAck (true);
+              Ptr<Packet> bar = Create<Packet> ();
+              bar->AddHeader (reqHdr);
+              Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck ());
+              m_currentBar = request;
+              WifiMacHeader hdr;
+              hdr.SetType (WIFI_MAC_CTL_BACKREQ);
+              hdr.SetAddr1 (request.recipient);
+              hdr.SetAddr2 (m_low->GetAddress ());
+              hdr.SetAddr3 (m_low->GetBssid ());
+              hdr.SetDsNotTo ();
+              hdr.SetDsNotFrom ();
+              hdr.SetNoRetry ();
+              hdr.SetNoMoreFragments ();
+              m_currentPacket = request.bar;
+              m_currentHdr = hdr;
+              resetCurrentPacket = false;
+            }
         }
-      else
+      //to reset the dcf.
+      if (resetCurrentPacket == true)
         {
           m_currentPacket = 0;
         }
-      // to reset the dcf.
       m_dcf->ResetCw ();
     }
   else
@@ -706,6 +736,7 @@
   m_queue->Flush ();
   m_currentPacket = 0;
 }
+
 void
 EdcaTxopN::NotifySleep (void)
 {
@@ -716,6 +747,7 @@
       m_currentPacket = 0;
     }
 }
+
 void
 EdcaTxopN::NotifyWakeUp (void)
 {
@@ -790,39 +822,54 @@
     {
       NS_LOG_DEBUG ("Ack Fail");
       m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
+      bool resetCurrentPacket = true;
       if (!m_txFailedCallback.IsNull ())
         {
           m_txFailedCallback (m_currentHdr);
         }
-      if (!GetAmpduExist())
+      if (GetAmpduExist ())
         {
-        // to reset the dcf.
-        m_currentPacket = 0;
+          uint8_t tid = 0;
+          if (m_currentHdr.IsQosData ())
+            {
+              tid = m_currentHdr.GetQosTid ();
+            }
+          else
+            {
+              NS_FATAL_ERROR ("Current packet is not Qos Data");
+            }
+
+          if (GetBaAgreementExists (m_currentHdr.GetAddr1 (), tid))
+            {
+              //send Block ACK Request in order to shift WinStart at the receiver
+              NS_LOG_DEBUG ("Transmit Block Ack Request");
+              CtrlBAckRequestHeader reqHdr;
+              reqHdr.SetType (COMPRESSED_BLOCK_ACK);
+              reqHdr.SetStartingSequence (m_txMiddle->PeekNextSequenceNumberfor (&m_currentHdr));
+              reqHdr.SetTidInfo (tid);
+              reqHdr.SetHtImmediateAck (true);
+              Ptr<Packet> bar = Create<Packet> ();
+              bar->AddHeader (reqHdr);
+              Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck ());
+              m_currentBar = request;
+              WifiMacHeader hdr;
+              hdr.SetType (WIFI_MAC_CTL_BACKREQ);
+              hdr.SetAddr1 (request.recipient);
+              hdr.SetAddr2 (m_low->GetAddress ());
+              hdr.SetAddr3 (m_low->GetBssid ());
+              hdr.SetDsNotTo ();
+              hdr.SetDsNotFrom ();
+              hdr.SetNoRetry ();
+              hdr.SetNoMoreFragments ();
+              m_currentPacket = request.bar;
+              m_currentHdr = hdr;
+              resetCurrentPacket = false;
+            }
         }
-      else
+      //to reset the dcf.
+      if (resetCurrentPacket == true)
         {
-          NS_LOG_DEBUG ("Transmit Block Ack Request");
-          CtrlBAckRequestHeader reqHdr;
-          reqHdr.SetType (COMPRESSED_BLOCK_ACK);
-          uint8_t tid = m_currentHdr.GetQosTid ();
-          reqHdr.SetStartingSequence (m_txMiddle->PeekNextSequenceNumberfor (&m_currentHdr));
-          reqHdr.SetTidInfo (tid);
-          reqHdr.SetHtImmediateAck(true);
-          Ptr<Packet> bar = Create<Packet> ();
-          bar->AddHeader (reqHdr);
-          Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck());
-          m_currentBar = request;
-          WifiMacHeader hdr;
-          hdr.SetType (WIFI_MAC_CTL_BACKREQ);
-          hdr.SetAddr1 (request.recipient);
-          hdr.SetAddr2 (m_low->GetAddress ());
-          hdr.SetAddr3 (m_low->GetBssid ());
-          hdr.SetDsNotTo ();
-          hdr.SetDsNotFrom ();
-          hdr.SetNoRetry ();
-          hdr.SetNoMoreFragments ();
-          m_currentPacket = request.bar;
-          m_currentHdr = hdr;
+          m_currentPacket = 0;
         }
       m_dcf->ResetCw ();
     }
@@ -841,68 +888,68 @@
 {
   NS_LOG_FUNCTION (this);
   NS_LOG_DEBUG ("missed block ack");
-  if (NeedBarRetransmission())
-  {
-    if (!GetAmpduExist())
-    {
-      //should i report this to station addressed by ADDR1?
-      NS_LOG_DEBUG ("Retransmit block ack request");
-      m_currentHdr.SetRetry ();
-    }
-    else
+  if (NeedBarRetransmission ())
     {
+      if (!GetAmpduExist ())
+        {
+          //should i report this to station addressed by ADDR1?
+          NS_LOG_DEBUG ("Retransmit block ack request");
+          m_currentHdr.SetRetry ();
+        }
+      else
+        {
           //standard says when loosing a BlockAck originator may send a BAR page 139
-          NS_LOG_DEBUG ("Transmit Block Ack Request"); 
+          NS_LOG_DEBUG ("Transmit Block Ack Request");
           CtrlBAckRequestHeader reqHdr;
           reqHdr.SetType (COMPRESSED_BLOCK_ACK);
           uint8_t tid = 0;
-          if (m_currentHdr.IsQosData())
+          if (m_currentHdr.IsQosData ())
             {
-               tid = m_currentHdr.GetQosTid ();
-               reqHdr.SetStartingSequence (m_currentHdr.GetSequenceNumber ());
+              tid = m_currentHdr.GetQosTid ();
+              reqHdr.SetStartingSequence (m_currentHdr.GetSequenceNumber ());
             }
-          else if (m_currentHdr.IsBlockAckReq())
+          else if (m_currentHdr.IsBlockAckReq ())
             {
               CtrlBAckRequestHeader baReqHdr;
               m_currentPacket->PeekHeader (baReqHdr);
               tid = baReqHdr.GetTidInfo ();
               reqHdr.SetStartingSequence (baReqHdr.GetStartingSequence ());
             }
-         else if (m_currentHdr.IsBlockAck())
-           {
-             CtrlBAckResponseHeader baRespHdr;
-             m_currentPacket->PeekHeader (baRespHdr);
-             tid = baRespHdr.GetTidInfo();
-             reqHdr.SetStartingSequence (m_currentHdr.GetSequenceNumber ());
-           }   
-        reqHdr.SetTidInfo (tid);
-        reqHdr.SetHtImmediateAck (true);
-        Ptr<Packet> bar = Create<Packet> ();
-        bar->AddHeader (reqHdr);
-        Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck ());
-        m_currentBar = request;
-        WifiMacHeader hdr;
-        hdr.SetType (WIFI_MAC_CTL_BACKREQ);
-        hdr.SetAddr1 (request.recipient);
-        hdr.SetAddr2 (m_low->GetAddress ());
-        hdr.SetAddr3 (m_low->GetBssid ());
-        hdr.SetDsNotTo ();
-        hdr.SetDsNotFrom ();
-        hdr.SetNoRetry ();
-        hdr.SetNoMoreFragments ();
-
-        m_currentPacket = request.bar;
-        m_currentHdr = hdr;
-      }
-  m_dcf->UpdateFailedCw ();
-  }
+          else if (m_currentHdr.IsBlockAck ())
+            {
+              CtrlBAckResponseHeader baRespHdr;
+              m_currentPacket->PeekHeader (baRespHdr);
+              tid = baRespHdr.GetTidInfo ();
+              reqHdr.SetStartingSequence (m_currentHdr.GetSequenceNumber ());
+            }
+          reqHdr.SetTidInfo (tid);
+          reqHdr.SetHtImmediateAck (true);
+          Ptr<Packet> bar = Create<Packet> ();
+          bar->AddHeader (reqHdr);
+          Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck ());
+          m_currentBar = request;
+          WifiMacHeader hdr;
+          hdr.SetType (WIFI_MAC_CTL_BACKREQ);
+          hdr.SetAddr1 (request.recipient);
+          hdr.SetAddr2 (m_low->GetAddress ());
+          hdr.SetAddr3 (m_low->GetBssid ());
+          hdr.SetDsNotTo ();
+          hdr.SetDsNotFrom ();
+          hdr.SetNoRetry ();
+          hdr.SetNoMoreFragments ();
+
+          m_currentPacket = request.bar;
+          m_currentHdr = hdr;
+        }
+      m_dcf->UpdateFailedCw ();
+    }
   else
-  {
+    {
       NS_LOG_DEBUG ("Block Ack Request Fail");
-      // to reset the dcf.
+      //to reset the dcf.
       m_currentPacket = 0;
       m_dcf->ResetCw ();
-  }
+    }
   m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
   RestartAccessIfNeeded ();
 }
@@ -964,27 +1011,27 @@
 bool
 EdcaTxopN::NeedBarRetransmission (void)
 {
-   uint8_t tid = 0;
-   uint16_t seqNumber = 0;
-   if (m_currentHdr.IsQosData ())
-     {
-       tid = m_currentHdr.GetQosTid ();
-       seqNumber = m_currentHdr.GetSequenceNumber ();
-     }
+  uint8_t tid = 0;
+  uint16_t seqNumber = 0;
+  if (m_currentHdr.IsQosData ())
+    {
+      tid = m_currentHdr.GetQosTid ();
+      seqNumber = m_currentHdr.GetSequenceNumber ();
+    }
   else if (m_currentHdr.IsBlockAckReq ())
     {
       CtrlBAckRequestHeader baReqHdr;
       m_currentPacket->PeekHeader (baReqHdr);
       tid = baReqHdr.GetTidInfo ();
       seqNumber = baReqHdr.GetStartingSequence ();
-     }
+    }
   else if (m_currentHdr.IsBlockAck ())
-     {
-        CtrlBAckResponseHeader baRespHdr;
-        m_currentPacket->PeekHeader (baRespHdr);
-        tid = baRespHdr.GetTidInfo ();
-        seqNumber = m_currentHdr.GetSequenceNumber ();
-     }  
+    {
+      CtrlBAckResponseHeader baRespHdr;
+      m_currentPacket->PeekHeader (baRespHdr);
+      tid = baRespHdr.GetTidInfo ();
+      seqNumber = m_currentHdr.GetSequenceNumber ();
+    }
   return m_baManager->NeedBarRetransmission (tid, seqNumber, m_currentHdr.GetAddr1 ());
 }
 
@@ -1214,18 +1261,18 @@
     {
       m_baManager->SwitchToBlockAckIfNeeded (recipient, tid, sequence);
     }
-  if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED))
+  if ((m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED)) && (m_low->GetMpduAggregator () == 0))
     {
-        m_currentHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
+      m_currentHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
     }
 }
 
-bool EdcaTxopN::GetAmpduExist(void)
+bool EdcaTxopN::GetAmpduExist (void)
 {
   return m_ampduExist;
 }
- 
-void EdcaTxopN::SetAmpduExist(bool ampdu)
+
+void EdcaTxopN::SetAmpduExist (bool ampdu)
 {
   m_ampduExist = ampdu;
 }
@@ -1249,10 +1296,11 @@
 void
 EdcaTxopN::CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp)
 {
-    m_baManager->StorePacket (packet, hdr, tstamp);
-    m_baManager->NotifyMpduTransmission (hdr.GetAddr1 (), hdr.GetQosTid (),
-                                         m_txMiddle->GetNextSeqNumberByTidAndAddress (hdr.GetQosTid (),
-                                                                                      hdr.GetAddr1 ()), WifiMacHeader::NORMAL_ACK);
+  NS_ASSERT (hdr.IsQosData ());
+  m_baManager->StorePacket (packet, hdr, tstamp);
+  m_baManager->NotifyMpduTransmission (hdr.GetAddr1 (), hdr.GetQosTid (),
+                                       m_txMiddle->GetNextSeqNumberByTidAndAddress (hdr.GetQosTid (),
+                                                                                    hdr.GetAddr1 ()), WifiMacHeader::NORMAL_ACK);
 }
 
 bool
@@ -1484,4 +1532,4 @@
     }
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/edca-txop-n.h ns-3.24/src/wifi/model/edca-txop-n.h
--- ns-3.23/src/wifi/model/edca-txop-n.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/edca-txop-n.h	2015-09-15 11:18:44.000000000 -0700
@@ -16,8 +16,8 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
 #ifndef EDCA_TXOP_N_H
 #define EDCA_TXOP_N_H
@@ -25,7 +25,6 @@
 #include "ns3/object.h"
 #include "ns3/mac48-address.h"
 #include "ns3/packet.h"
-
 #include "wifi-mode.h"
 #include "wifi-mac-header.h"
 #include "wifi-remote-station-manager.h"
@@ -33,7 +32,6 @@
 #include "dcf.h"
 #include "ctrl-headers.h"
 #include "block-ack-manager.h"
-
 #include <map>
 #include <list>
 
@@ -147,6 +145,7 @@
    * \return WifiMacQueue
    */
   Ptr<WifiMacQueue > GetEdcaQueue () const;
+
   virtual void SetMinCw (uint32_t minCw);
   virtual void SetMaxCw (uint32_t maxCw);
   virtual void SetAifsn (uint32_t aifsn);
@@ -160,6 +159,7 @@
    * \return MacLow
    */
   Ptr<MacLow> Low (void);
+
   Ptr<MsduAggregator> GetMsduAggregator (void) const;
   /**
    * \param recipient address of the peer station
@@ -175,7 +175,7 @@
    * \param tid traffic ID.
    * \return the number of packets buffered for a specified agreement
    *
-   * Returns number of packets buffered for a specified agreement. 
+   * Returns number of packets buffered for a specified agreement.
    */
   uint32_t GetNOutstandingPacketsInBa (Mac48Address address, uint8_t tid);
   /**
@@ -193,7 +193,7 @@
    * This function resets the status of OriginatorBlockAckAgreement after the transfer
    * of an A-MPDU with ImmediateBlockAck policy (i.e. no BAR is scheduled)
    */
-  void CompleteAmpduTransfer(Mac48Address recipient, uint8_t tid);
+  void CompleteAmpduTransfer (Mac48Address recipient, uint8_t tid);
 
   /* dcf notifications forwarded here */
   /**
@@ -290,25 +290,29 @@
   /**
    * Check if the current packet should be sent with a RTS protection.
    *
-   * \return true if RTS protection should be used, false otherwise
+   * \return true if RTS protection should be used,
+   *         false otherwise
    */
   bool NeedRts (void);
   /**
    * Check if RTS should be re-transmitted if CTS was missed.
    *
-   * \return true if RTS should be re-transmitted, false otherwise
+   * \return true if RTS should be re-transmitted,
+   *         false otherwise
    */
   bool NeedRtsRetransmission (void);
   /**
    * Check if DATA should be re-transmitted if ACK was missed.
    *
-   * \return true if DATA should be re-transmitted, false otherwise
+   * \return true if DATA should be re-transmitted,
+   *         false otherwise
    */
   bool NeedDataRetransmission (void);
   /**
    * Check if Block ACK Request should be re-transmitted.
    *
-   * \return true if BAR should be re-transmitted, false otherwise
+   * \return true if BAR should be re-transmitted,
+   *         false otherwise
    */
   bool NeedBarRetransmission (void);
   /**
@@ -357,12 +361,14 @@
    * \return the fragment with the current fragment number
    */
   Ptr<Packet> GetFragmentPacket (WifiMacHeader *hdr);
+
   /**
    * Set the access category of this EDCAF.
    *
    * \param ac
    */
   void SetAccessCategory (enum AcIndex ac);
+
   /**
    * \param packet packet to send
    * \param hdr header of packet to send.
@@ -371,7 +377,9 @@
    * can be sent safely.
    */
   void Queue (Ptr<const Packet> packet, const WifiMacHeader &hdr);
+
   void SetMsduAggregator (Ptr<MsduAggregator> aggr);
+
   /**
    * \param packet packet to send
    * \param hdr header of packet to send.
@@ -380,10 +388,12 @@
    * can be sent safely.
    */
   void PushFront (Ptr<const Packet> packet, const WifiMacHeader &hdr);
+
   /**
    * Complete block ACK configuration.
    */
   void CompleteConfig (void);
+
   /**
    * Set threshold for block ACK mechanism. If number of packets in the
    * queue reaches the threshold, block ACK mechanism is used.
@@ -397,16 +407,18 @@
    * \return the current threshold for block ACK mechanism
    */
   uint8_t GetBlockAckThreshold (void) const;
-    
+
   void SetBlockAckInactivityTimeout (uint16_t timeout);
   void SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator);
   void CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp);
   bool GetAmpduExist (void);
   void SetAmpduExist (bool ampdu);
+
   /**
    * Return the next sequence number for the given header.
    *
    * \param hdr Wi-Fi header
+   *
    * \return the next sequence number
    */
   uint16_t GetNextSequenceNumberfor (WifiMacHeader *hdr);
@@ -414,6 +426,7 @@
    * Return the next sequence number for the Traffic ID and destination, but do not pick it (i.e. the current sequence number remains unchanged).
    *
    * \param hdr Wi-Fi header
+   *
    * \return the next sequence number
    */
   uint16_t PeekNextSequenceNumberfor (WifiMacHeader *hdr);
@@ -438,16 +451,17 @@
    */
   void BaTxFailed (const WifiMacHeader &hdr);
 
- /**
-  * 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
-  */
+  /**
+   * 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);
 
+
 private:
   void DoInitialize ();
   /**
@@ -544,6 +558,6 @@
   bool m_ampduExist;
 };
 
-}  // namespace ns3
+} //namespace ns3
 
 #endif /* EDCA_TXOP_N_H */
diff -Naur ns-3.23/src/wifi/model/error-rate-model.cc ns-3.24/src/wifi/model/error-rate-model.cc
--- ns-3.23/src/wifi/model/error-rate-model.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/error-rate-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "error-rate-model.h"
 
 namespace ns3 {
@@ -35,16 +36,18 @@
 double
 ErrorRateModel::CalculateSnr (WifiMode txMode, double ber) const
 {
-  // This is a very simple binary search.
+  //This is a very simple binary search.
   double low, high, precision;
   low = 1e-25;
   high = 1e25;
   precision = 1e-12;
+  WifiTxVector txVector;
+  txVector.SetMode (txMode);
   while (high - low > precision)
     {
       NS_ASSERT (high >= low);
       double middle = low + (high - low) / 2;
-      if ((1 - GetChunkSuccessRate (txMode, middle, 1)) > ber)
+      if ((1 - GetChunkSuccessRate (txMode, txVector, middle, 1)) > ber)
         {
           low = middle;
         }
@@ -56,4 +59,4 @@
   return low;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/error-rate-model.h ns-3.24/src/wifi/model/error-rate-model.h
--- ns-3.23/src/wifi/model/error-rate-model.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/error-rate-model.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,11 +17,13 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef ERROR_RATE_MODEL_H
 #define ERROR_RATE_MODEL_H
 
 #include <stdint.h>
 #include "wifi-mode.h"
+#include "wifi-tx-vector.h"
 #include "ns3/object.h"
 
 namespace ns3 {
@@ -38,28 +40,31 @@
   /**
    * \param txMode a specific transmission mode
    * \param ber a target ber
-   * \returns the snr which corresponds to the requested
-   *          ber.
+   *
+   * \return the snr which corresponds to the requested ber
    */
   double CalculateSnr (WifiMode txMode, double ber) const;
 
   /**
    * A pure virtual method that must be implemented in the subclass.
-   * This method returns the probability that the given 'chuck' of the
+   * This method returns the probability that the given 'chunk' of the
    * packet will be successfully received by the PHY.
    *
-   * A chuck can be viewed as a part of a packet with equal SNR.
+   * A chunk can be viewed as a part of a packet with equal SNR.
    * The probability of successfully receiving the chunk depends on
    * the mode, the SNR, and the size of the chunk.
    *
    * \param mode the Wi-Fi mode the chunk is sent
+   * \param txvector TXVECTOR of the transmission
    * \param snr the SNR of the chunk
    * \param nbits the number of bits in this chunk
+   *
    * \return probability of successfully receiving the chunk
    */
-  virtual double GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const = 0;
+  virtual double GetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint32_t nbits) const = 0;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* ERROR_RATE_MODEL_H */
+
diff -Naur ns-3.23/src/wifi/model/ht-capabilities.cc ns-3.24/src/wifi/model/ht-capabilities.cc
--- ns-3.23/src/wifi/model/ht-capabilities.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ht-capabilities.cc	2015-09-15 11:18:44.000000000 -0700
@@ -3,7 +3,7 @@
  * Copyright (c) 2013
  *
  * 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 
+ * 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,
@@ -15,111 +15,171 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: Ghada Badawy <gbadawy@rim.com>
+ * Authors: Ghada Badawy <gbadawy@rim.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
 #include "ht-capabilities.h"
 #include "ns3/assert.h"
 #include "ns3/log.h"
 
-
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("HtCapabilities");
 
 HtCapabilities::HtCapabilities ()
-   :  m_ldpc(0),
-      m_supportedChannelWidth(0),
-      m_smPowerSave(0),
-      m_greenField(0),
-      m_shortGuardInterval20(0),
-      m_shortGuardInterval40(0),
-      m_txStbc(0),
-      m_rxStbc(0),
-      m_htDelayedBlockAck(0),
-      m_maxAmsduLength(0),
-      m_dssMode40(0),
-      m_reserved(0),
-      m_fortyMhzIntolerant(0),
-      m_lsigProtectionSupport(0),
-      m_maxAmpduLength(0),
-      m_minMpduStartSpace(0),
-      m_ampduReserved(0),
-      m_reservedMcsSet1(0),
-      m_rxHighestSupportedDataRate(0),
-      m_reservedMcsSet2(0),
-      m_txMcsSetDefined(0),
-      m_txRxMcsSetUnequal(0),
-      m_txMaxNSpatialStreams(0),
-      m_txUnequalModulation(0),
-      m_reservedMcsSet3(7),
-      m_htSupported(0)
-{
-  for (uint32_t k=0; k < MAX_SUPPORTED_MCS ;k++)
-   {
-     m_rxMcsBitmask[k]=0;
-   }
+  : m_ldpc (0),
+    m_supportedChannelWidth (0),
+    m_smPowerSave (0),
+    m_greenField (0),
+    m_shortGuardInterval20 (0),
+    m_shortGuardInterval40 (0),
+    m_txStbc (0),
+    m_rxStbc (0),
+    m_htDelayedBlockAck (0),
+    m_maxAmsduLength (0),
+    m_dssMode40 (0),
+    m_psmpSupport (0),
+    m_fortyMhzIntolerant (0),
+    m_lsigProtectionSupport (0),
+    m_maxAmpduLength (0),
+    m_minMpduStartSpace (0),
+    m_ampduReserved (0),
+    m_reservedMcsSet1 (0),
+    m_rxHighestSupportedDataRate (0),
+    m_reservedMcsSet2 (0),
+    m_txMcsSetDefined (0),
+    m_txRxMcsSetUnequal (0),
+    m_txMaxNSpatialStreams (0),
+    m_txUnequalModulation (0),
+    m_reservedMcsSet3 (0),
+    m_pco (0),
+    m_pcoTransitionTime (0),
+    m_reservedExtendedCapabilities (0),
+    m_mcsFeedback (0),
+    m_htcSupport (0),
+    m_reverzeDirectionResponder (0),
+    m_reservedExtendedCapabilities2 (0),
+    m_implicitRxBfCapable (0),
+    m_rxStaggeredSoundingCapable (0),
+    m_txStaggeredSoundingCapable (0),
+    m_rxNdpCapable (0),
+    m_txNdpCapable (0),
+    m_implicitTxBfCapable (0),
+    m_calibration (0),
+    m_explicitCsiTxBfCapable (0),
+    m_explicitNoncompressedSteeringCapable (0),
+    m_explicitCompressedSteeringCapable (0),
+    m_explicitTxBfCsiFeedback (0),
+    m_explicitNoncompressedBfFeedbackCapable (0),
+    m_explicitCompressedBfFeedbackCapable (0),
+    m_minimalGrouping (0),
+    m_csiNBfAntennasSupported (0),
+    m_noncompressedSteeringNBfAntennasSupported (0),
+    m_compressedSteeringNBfAntennasSupported (0),
+    m_csiMaxNRowsBfSupported (0),
+    m_channelEstimationCapability (0),
+    m_reservedTxBf (0),
+    m_antennaSelectionCapability (0),
+    m_explicitCsiFeedbackBasedTxASelCapable (0),
+    m_antennaIndicesFeedbackBasedTxASelCapable (0),
+    m_explicitCsiFeedbackCapable (0),
+    m_antennaIndicesFeedbackCapable (0),
+    m_rxASelCapable (0),
+    m_txSoundingPpdusCapable (0),
+    m_reservedASel (0),
+    m_htSupported (0)
+{
+  for (uint32_t k = 0; k < MAX_SUPPORTED_MCS; k++)
+    {
+      m_rxMcsBitmask[k] = 0;
+    }
 }
 
-
 WifiInformationElementId
 HtCapabilities::ElementId () const
 {
   return IE_HT_CAPABILITIES;
 }
 
-void 
-HtCapabilities::SetHtSupported(uint8_t htsupported)
+void
+HtCapabilities::SetHtSupported (uint8_t htsupported)
 {
   m_htSupported = htsupported;
 }
+
 void
 HtCapabilities::SetLdpc (uint8_t ldpc)
 {
- m_ldpc=ldpc;
+  m_ldpc = ldpc;
 }
 
 void
 HtCapabilities::SetSupportedChannelWidth (uint8_t supportedchannelwidth)
 {
- m_supportedChannelWidth=supportedchannelwidth;
+  m_supportedChannelWidth = supportedchannelwidth;
 }
 
 void
 HtCapabilities::SetGreenfield (uint8_t greenfield)
 {
- m_greenField=greenfield;
+  m_greenField = greenfield;
 }
 
 void
 HtCapabilities::SetShortGuardInterval20 (uint8_t shortguardinterval)
 {
- m_shortGuardInterval20=shortguardinterval;
+  m_shortGuardInterval20 = shortguardinterval;
 }
+
 void
-HtCapabilities::SetRxMcsBitmask(uint8_t index)
+HtCapabilities::SetShortGuardInterval40 (uint8_t shortguardinterval)
 {
-   m_rxMcsBitmask[index]=1;
+  m_shortGuardInterval40 = shortguardinterval;
 }
 
-uint8_t*
-HtCapabilities::GetRxMcsBitmask()
+void
+HtCapabilities::SetMaxAmsduLength (uint8_t maxamsdulength)
 {
-  uint8_t* p;
-  p= m_rxMcsBitmask;
-  return p;
+  m_maxAmsduLength = maxamsdulength;
 }
 
-bool 
-HtCapabilities::IsSupportedMcs (uint8_t mcs)
+void
+HtCapabilities::SetLSigProtectionSupport (uint8_t lsigprotection)
 {
-  if (m_rxMcsBitmask[mcs] == 1)
-   {
-      return true;
-   }
-  return false;
-  
+  m_lsigProtectionSupport = lsigprotection;
+}
+
+void
+HtCapabilities::SetMaxAmpduLength (uint8_t maxampdulength)
+{
+  m_maxAmpduLength = maxampdulength;
+}
+
+void
+HtCapabilities::SetRxMcsBitmask (uint8_t index)
+{
+  m_rxMcsBitmask[index] = 1;
+}
+
+void
+HtCapabilities::SetRxHighestSupportedDataRate (uint16_t maxsupportedrate)
+{
+  m_rxHighestSupportedDataRate = maxsupportedrate;
 }
+
+void
+HtCapabilities::SetTxMcsSetDefined (uint8_t txmcssetdefined)
+{
+  m_txMcsSetDefined = txmcssetdefined;
+}
+
+void
+HtCapabilities::SetTxMaxNSpatialStreams (uint8_t maxtxspatialstreams)
+{
+  m_txMaxNSpatialStreams = maxtxspatialstreams;
+}
+
 uint8_t
 HtCapabilities::GetLdpc (void) const
 {
@@ -137,28 +197,91 @@
 {
   return m_greenField;
 }
+
 uint8_t
-HtCapabilities::GetShortGuardInterval20(void) const
+HtCapabilities::GetShortGuardInterval20 (void) const
 {
   return m_shortGuardInterval20;
 }
 
 uint8_t
+HtCapabilities::GetShortGuardInterval40 (void) const
+{
+  return m_shortGuardInterval40;
+}
+
+uint8_t
+HtCapabilities::GetMaxAmsduLength (void) const
+{
+  return m_maxAmsduLength;
+}
+
+uint8_t
+HtCapabilities::GetLSigProtectionSupport (void) const
+{
+  return m_lsigProtectionSupport;
+}
+
+uint8_t
+HtCapabilities::GetMaxAmpduLength (void) const
+{
+  return m_maxAmpduLength;
+}
+
+uint8_t*
+HtCapabilities::GetRxMcsBitmask ()
+{
+  uint8_t* p;
+  p = m_rxMcsBitmask;
+  return p;
+}
+
+bool
+HtCapabilities::IsSupportedMcs (uint8_t mcs)
+{
+  if (m_rxMcsBitmask[mcs] == 1)
+    {
+      return true;
+    }
+  return false;
+}
+
+uint16_t
+HtCapabilities::GetRxHighestSupportedDataRate (void) const
+{
+  return m_rxHighestSupportedDataRate;
+}
+
+uint8_t
+HtCapabilities::GetTxMcsSetDefined (void) const
+{
+  return m_txMcsSetDefined;
+}
+
+uint8_t
+HtCapabilities::GetTxMaxNSpatialStreams (void) const
+{
+  return m_txMaxNSpatialStreams;
+}
+
+uint8_t
 HtCapabilities::GetInformationFieldSize () const
 {
-  // we should not be here if ht is not supported
+  //we should not be here if ht is not supported
   NS_ASSERT (m_htSupported > 0);
-  return 19;
+  return 26;
 }
+
 Buffer::Iterator
 HtCapabilities::Serialize (Buffer::Iterator i) const
 {
-  if (m_htSupported< 1)
+  if (m_htSupported < 1)
     {
-       return i;
+      return i;
     }
   return WifiInformationElement::Serialize (i);
 }
+
 uint16_t
 HtCapabilities::GetSerializedSize () const
 {
@@ -173,138 +296,256 @@
 HtCapabilities::GetHtCapabilitiesInfo (void) const
 {
   uint16_t val = 0;
-  val |= m_ldpc;
-  val |= (m_supportedChannelWidth << 1)& (0x1 << 1);
-  val |= (m_smPowerSave << 2)& (0x3 << 2) ;
-  val |= (m_greenField << 4)& (0x1 << 4) ;
-  val |= (m_shortGuardInterval20 << 5)& (0x1 << 5);
-  val |= (m_shortGuardInterval40 << 6)& (0x1 << 6);
-  val |= (m_txStbc << 7)& (0x1 << 7);
-  val |= (m_rxStbc << 8)& (0x3 << 8);
-  val |= (m_htDelayedBlockAck << 10)& (0x1 << 10);
-  val |= (m_maxAmsduLength << 11)& (0x1 << 11);
-  val |= (m_dssMode40 << 12)& (0x1 << 12);
-  val |= (m_reserved<< 13)& (0x1 << 13);
-  val |= (m_fortyMhzIntolerant << 14)& (0x1 << 14);
-  val |= (m_lsigProtectionSupport << 15)& (0x1 << 15);
+  val |= m_ldpc & 0x01;
+  val |= (m_supportedChannelWidth & 0x01) << 1;
+  val |= (m_smPowerSave & 0x03) << 2;
+  val |= (m_greenField & 0x01) << 4;
+  val |= (m_shortGuardInterval20 & 0x01) << 5;
+  val |= (m_shortGuardInterval40 & 0x01) << 6;
+  val |= (m_txStbc & 0x01) << 7;
+  val |= (m_rxStbc & 0x03) << 8;
+  val |= (m_htDelayedBlockAck & 0x01) << 10;
+  val |= (m_maxAmsduLength & 0x01) << 11;
+  val |= (m_dssMode40 & 0x01) << 12;
+  val |= (m_psmpSupport & 0x01) << 13;
+  val |= (m_fortyMhzIntolerant & 0x01) << 14;
+  val |= (m_lsigProtectionSupport & 0x01) << 15;
   return val;
 }
 
 void
-HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl)
+HtCapabilities::SetHtCapabilitiesInfo (uint16_t ctrl)
 {
   m_ldpc = ctrl & 0x01;
   m_supportedChannelWidth = (ctrl >> 1) & 0x01;
   m_smPowerSave = (ctrl >> 2) & 0x03;
   m_greenField = (ctrl >> 4) & 0x01;
-  m_shortGuardInterval20  = (ctrl >> 5) & 0x01;
-  m_shortGuardInterval40  = (ctrl >> 6) & 0x01;
+  m_shortGuardInterval20 = (ctrl >> 5) & 0x01;
+  m_shortGuardInterval40 = (ctrl >> 6) & 0x01;
   m_txStbc = (ctrl >> 7) & 0x01;
   m_rxStbc = (ctrl >> 8) & 0x03;
   m_htDelayedBlockAck = (ctrl >> 10) & 0x01;
   m_maxAmsduLength = (ctrl >> 11) & 0x01;
-  m_dssMode40= (ctrl >> 12) & 0x01;
-  m_reserved= (ctrl >> 13) & 0x01;
-  m_fortyMhzIntolerant= (ctrl >> 14) & 0x01;
-  m_lsigProtectionSupport= (ctrl >> 15) & 0x01;
-}
-uint8_t
-HtCapabilities::GetAmpduParameters (void) const
-{
-  uint8_t val = 0;
-  val |=  m_maxAmpduLength & 0x3;
-  val |= ( m_minMpduStartSpace << 2)& (0x7 << 2);
-  val |= (m_ampduReserved << 5)& (0x7 << 5) ;
-  return val;
+  m_dssMode40 = (ctrl >> 12) & 0x01;
+  m_psmpSupport = (ctrl >> 13) & 0x01;
+  m_fortyMhzIntolerant = (ctrl >> 14) & 0x01;
+  m_lsigProtectionSupport = (ctrl >> 15) & 0x01;
 }
 
 void
 HtCapabilities::SetAmpduParameters (uint8_t ctrl)
 {
   m_maxAmpduLength = ctrl & 0x03;
-  m_minMpduStartSpace = (ctrl >> 2) & 0x07;
-  m_ampduReserved =(ctrl >> 5) & 0x07;
+  m_minMpduStartSpace = (ctrl >> 2) & 0x1b;
+  m_ampduReserved = (ctrl >> 5) & 0xe0;
+}
+
+uint8_t
+HtCapabilities::GetAmpduParameters (void) const
+{
+  uint8_t val = 0;
+  val |=  m_maxAmpduLength & 0x03;
+  val |= (m_minMpduStartSpace & 0x1b) << 2;
+  val |= (m_ampduReserved & 0xe0) << 5;
+  return val;
 }
 
 void
-HtCapabilities::SetSupportedMcsSet (uint64_t ctrl2, uint64_t ctrl1)
+HtCapabilities::SetSupportedMcsSet (uint64_t ctrl1, uint64_t ctrl2)
 {
-  for(uint64_t i=0 ; i < 77;i++)
+  for (uint64_t i = 0; i < 77; i++)
     {
       if (i < 64)
         {
-          m_rxMcsBitmask[i]=(ctrl1 >> i) & 0x01; 
+          m_rxMcsBitmask[i] = (ctrl1 >> i) & 0x01;
         }
       else
         {
-           m_rxMcsBitmask[i]=( ctrl2 >> (i-64))& 0x01 ;
+          m_rxMcsBitmask[i] = (ctrl2 >> (i - 64)) & 0x01;
         }
     }
-  m_reservedMcsSet1 = (ctrl2 >> 12) & 0x07;
-  m_rxHighestSupportedDataRate = (ctrl2 >> 15) & 0x03ff;
-  m_reservedMcsSet2 = (ctrl2 >> 25) & 0x3f;
-  m_txMcsSetDefined  = (ctrl2 >> 31) & 0x01;
-  m_txRxMcsSetUnequal  = (ctrl2 >> 32) & 0x01;
-  m_txMaxNSpatialStreams = (ctrl2 >> 33) & 0x03;
-  m_txUnequalModulation = (ctrl2 >> 35) & 0x01;
-  m_reservedMcsSet3 = (ctrl2 >> 36) & 0x07ffffff;
+  m_reservedMcsSet1 = (ctrl2 >> 13) & 0x07;
+  m_rxHighestSupportedDataRate = (ctrl2 >> 16) & 0x03ff;
+  m_reservedMcsSet2 = (ctrl2 >> 26) & 0x3f;
+  m_txMcsSetDefined = (ctrl2 >> 32) & 0x01;
+  m_txRxMcsSetUnequal = (ctrl2 >> 33) & 0x01;
+  m_txMaxNSpatialStreams = (ctrl2 >> 34) & 0x03;
+  m_txUnequalModulation = (ctrl2 >> 36) & 0x01;
+  m_reservedMcsSet3 = (ctrl2 >> 37) & 0x07ffffff;
 }
+
 uint64_t
 HtCapabilities::GetSupportedMcsSet1 (void) const
 {
-  uint64_t val=0;
-  for(uint64_t i=63 ; i >0 ;i--)
+  uint64_t val = 0;
+  for (uint64_t i = 63; i > 0; i--)
     {
-          val = (val << 1) | (m_rxMcsBitmask[i] & 0x01);
+      val = (val << 1) | (m_rxMcsBitmask[i] & 0x01);
     }
   val = (val << 1) | (m_rxMcsBitmask[0] & 0x01);
   return val;
 }
+
 uint64_t
 HtCapabilities::GetSupportedMcsSet2 (void) const
 {
-  uint64_t val=0; 
+  uint64_t val = 0;
   val = val | (m_reservedMcsSet3 & 0x07ffffff);
   val = (val << 1) | (m_txUnequalModulation & 0x01);
   val = (val << 2) | (m_txMaxNSpatialStreams & 0x03);
   val = (val << 1) | (m_txRxMcsSetUnequal & 0x01);
   val = (val << 1) | (m_txMcsSetDefined & 0x01);
   val = (val << 6) | (m_reservedMcsSet2 & 0x3f);
-  val = (val << 10) |(m_rxHighestSupportedDataRate & 0x3ff);
-  val = (val << 3) |(m_reservedMcsSet1 & 0x07);
+  val = (val << 10) | (m_rxHighestSupportedDataRate & 0x3ff);
+  val = (val << 3) | (m_reservedMcsSet1 & 0x07);
 
-  for (uint64_t i=12; i>0;i--)
+  for (uint64_t i = 13; i > 0; i--)
     {
-       val = (val << 1)|( m_rxMcsBitmask[i+64] & 0x01);
+      val = (val << 1) | ( m_rxMcsBitmask[i + 63] & 0x01);
     }
   return val;
 }
 
+uint16_t
+HtCapabilities::GetExtendedHtCapabilities (void) const
+{
+  uint16_t val = 0;
+  val |= m_pco & 0x01;
+  val |= (m_pcoTransitionTime & 0x03) << 1;
+  val |= (m_reservedExtendedCapabilities & 0x1f) << 3;
+  val |= (m_mcsFeedback & 0x03) << 8;
+  val |= (m_htcSupport & 0x01) << 10;
+  val |= (m_reverzeDirectionResponder & 0x01) << 11;
+  val |= (m_reservedExtendedCapabilities2 & 0x0f) << 12;
+  return val;
+}
+
+void
+HtCapabilities::SetExtendedHtCapabilities (uint16_t ctrl)
+{
+  m_pco = ctrl & 0x01;
+  m_pcoTransitionTime = (ctrl >> 1) & 0x03;
+  m_reservedExtendedCapabilities = (ctrl >> 3) & 0x1f;
+  m_mcsFeedback = (ctrl >> 8) & 0x03;
+  m_htcSupport = (ctrl >> 10) & 0x01;
+  m_reverzeDirectionResponder = (ctrl >> 11) & 0x01;
+  m_reservedExtendedCapabilities2 = (ctrl >> 12) & 0x0f;
+}
+
+uint32_t
+HtCapabilities::GetTxBfCapabilities (void) const
+{
+  uint32_t val = 0;
+  val |= m_implicitRxBfCapable & 0x01;
+  val |= (m_rxStaggeredSoundingCapable & 0x01) << 1;
+  val |= (m_txStaggeredSoundingCapable & 0x01) << 2;
+  val |= (m_rxNdpCapable & 0x01) << 3;
+  val |= (m_txNdpCapable & 0x01) << 4;
+  val |= (m_implicitTxBfCapable & 0x01) << 5;
+  val |= (m_calibration & 0x03) << 6;
+  val |= (m_explicitCsiTxBfCapable & 0x01) << 8;
+  val |= (m_explicitNoncompressedSteeringCapable & 0x01) << 9;
+  val |= (m_explicitCompressedSteeringCapable & 0x01) << 10;
+  val |= (m_explicitTxBfCsiFeedback & 0x03) << 11;
+  val |= (m_explicitNoncompressedBfFeedbackCapable & 0x03) << 13;
+  val |= (m_explicitCompressedBfFeedbackCapable & 0x03) << 15;
+  val |= (m_minimalGrouping & 0x03) << 17;
+  val |= (m_csiNBfAntennasSupported & 0x03) << 19;
+  val |= (m_noncompressedSteeringNBfAntennasSupported & 0x03) << 21;
+  val |= (m_compressedSteeringNBfAntennasSupported & 0x03) << 23;
+  val |= (m_csiMaxNRowsBfSupported & 0x03) << 25;
+  val |= (m_channelEstimationCapability & 0x03) << 27;
+  val |= (m_reservedTxBf & 0x07) << 29;
+  return val;
+}
+
+void
+HtCapabilities::SetTxBfCapabilities (uint32_t ctrl)
+{
+  m_implicitRxBfCapable = ctrl & 0x01;
+  m_rxStaggeredSoundingCapable = (ctrl >> 1) & 0x01;
+  m_txStaggeredSoundingCapable = (ctrl >> 2) & 0x01;
+  m_rxNdpCapable = (ctrl >> 3) & 0x01;
+  m_txNdpCapable = (ctrl >> 4) & 0x01;
+  m_implicitTxBfCapable = (ctrl >> 5) & 0x01;
+  m_calibration = (ctrl >> 6) & 0x03;
+  m_explicitCsiTxBfCapable = (ctrl >> 8) & 0x01;
+  m_explicitNoncompressedSteeringCapable = (ctrl >> 9) & 0x01;
+  m_explicitCompressedSteeringCapable = (ctrl >> 10) & 0x01;
+  m_explicitTxBfCsiFeedback = (ctrl >> 11) & 0x03;
+  m_explicitNoncompressedBfFeedbackCapable = (ctrl >> 13) & 0x03;
+  m_explicitCompressedBfFeedbackCapable = (ctrl >> 15) & 0x03;
+  m_minimalGrouping = (ctrl >> 17) & 0x03;
+  m_csiNBfAntennasSupported = (ctrl >> 19) & 0x03;
+  m_noncompressedSteeringNBfAntennasSupported = (ctrl >> 21) & 0x03;
+  m_compressedSteeringNBfAntennasSupported = (ctrl >> 23) & 0x03;
+  m_csiMaxNRowsBfSupported = (ctrl >> 25) & 0x03;
+  m_channelEstimationCapability = (ctrl >> 27) & 0x03;
+  m_reservedTxBf = (ctrl >> 29) & 0x07;
+}
+
+uint8_t
+HtCapabilities::GetAntennaSelectionCapabilities (void) const
+{
+  uint8_t val = 0;
+  val |= m_antennaSelectionCapability & 0x01;
+  val |= (m_explicitCsiFeedbackBasedTxASelCapable & 0x01) << 1;
+  val |= (m_antennaIndicesFeedbackBasedTxASelCapable & 0x01) << 2;
+  val |= (m_explicitCsiFeedbackCapable & 0x01) << 3;
+  val |= (m_antennaIndicesFeedbackCapable & 0x01) << 4;
+  val |= (m_rxASelCapable & 0x01) << 5;
+  val |= (m_txSoundingPpdusCapable & 0x01) << 6;
+  val |= (m_reservedASel & 0x01) << 7;
+  return val;
+}
+
+void
+HtCapabilities::SetAntennaSelectionCapabilities (uint8_t ctrl)
+{
+  m_antennaSelectionCapability = ctrl & 0x01;
+  m_explicitCsiFeedbackBasedTxASelCapable = (ctrl >> 1) & 0x01;
+  m_antennaIndicesFeedbackBasedTxASelCapable = (ctrl >> 2) & 0x01;
+  m_explicitCsiFeedbackCapable = (ctrl >> 3) & 0x01;
+  m_antennaIndicesFeedbackCapable = (ctrl >> 4) & 0x01;
+  m_rxASelCapable = (ctrl >> 5) & 0x01;
+  m_txSoundingPpdusCapable = (ctrl >> 6) & 0x01;
+  m_reservedASel = (ctrl >> 7) & 0x01;
+}
+
 void
 HtCapabilities::SerializeInformationField (Buffer::Iterator start) const
 {
-   if (m_htSupported == 1)
+  if (m_htSupported == 1)
     {
-       // write the corresponding value for each bit
-       start. WriteHtolsbU16 (GetHtCapabilitiesInfo());
-       start. WriteU8 (GetAmpduParameters());
-       start. WriteHtolsbU64 (GetSupportedMcsSet2());
-       start. WriteHtolsbU64 (GetSupportedMcsSet1());
+      //write the corresponding value for each bit
+      start.WriteHtolsbU16 (GetHtCapabilitiesInfo ());
+      start.WriteU8 (GetAmpduParameters ());
+      start.WriteHtolsbU64 (GetSupportedMcsSet1 ());
+      start.WriteHtolsbU64 (GetSupportedMcsSet2 ());
+      start.WriteU16 (GetExtendedHtCapabilities ());
+      start.WriteU32 (GetTxBfCapabilities ());
+      start.WriteU8 (GetAntennaSelectionCapabilities ());
     }
 }
 
 uint8_t
 HtCapabilities::DeserializeInformationField (Buffer::Iterator start,
                                              uint8_t length)
-{ 
+{
   Buffer::Iterator i = start;
   uint16_t htinfo = i.ReadLsbtohU16 ();
   uint8_t ampduparam = i.ReadU8 ();
-  uint64_t mcsset1=i.ReadLsbtohU64 ();
+  uint64_t mcsset1 = i.ReadLsbtohU64 ();
   uint64_t mcsset2 = i.ReadLsbtohU64 ();
-  SetHtCapabilitiesInfo(htinfo);
-  SetAmpduParameters(ampduparam);
-  SetSupportedMcsSet(mcsset1,mcsset2);
+  uint16_t extendedcapabilities = i.ReadU16 ();
+  uint32_t txbfcapabilities = i.ReadU32 ();
+  uint8_t aselcapabilities = i.ReadU8 ();
+  SetHtCapabilitiesInfo (htinfo);
+  SetAmpduParameters (ampduparam);
+  SetSupportedMcsSet (mcsset1, mcsset2);
+  SetExtendedHtCapabilities (extendedcapabilities);
+  SetTxBfCapabilities (txbfcapabilities);
+  SetAntennaSelectionCapabilities (aselcapabilities);
   return length;
 }
 
@@ -321,10 +562,10 @@
   return os;
 }
 
-std::istream &operator >> (std::istream &is,HtCapabilities &htcapabilities)
+std::istream &operator >> (std::istream &is, HtCapabilities &htcapabilities)
 {
-  bool c1, c2, c3,c4;
-  is >>  c1 >> c2 >> c3 >>c4;
+  bool c1, c2, c3, c4;
+  is >> c1 >> c2 >> c3 >> c4;
   htcapabilities.SetLdpc (c1);
   htcapabilities.SetSupportedChannelWidth (c2);
   htcapabilities.SetGreenfield (c3);
@@ -333,4 +574,4 @@
   return is;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/ht-capabilities.h ns-3.24/src/wifi/model/ht-capabilities.h
--- ns-3.23/src/wifi/model/ht-capabilities.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ht-capabilities.h	2015-09-15 11:18:44.000000000 -0700
@@ -3,7 +3,7 @@
  * Copyright (c) 2013
  *
  * 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 
+ * 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,
@@ -15,8 +15,10 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: Ghada Badawy <gbadawy@gmail.com>
+ * Authors: Ghada Badawy <gbadawy@gmail.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
+
 #ifndef HT_CAPABILITIES_H
 #define HT_CAPABILITIES_H
 
@@ -41,34 +43,124 @@
  *
  * \see attribute_HtCapabilities
  */
-class HtCapabilities: public WifiInformationElement
+class HtCapabilities : public WifiInformationElement
 {
 public:
-   HtCapabilities ();
+  HtCapabilities ();
+  void SetHtSupported (uint8_t htsupported);
+
+  /**
+   * Set the HT Capabilties Info field in the HT Capabilities information element.
+   *
+   * \param ctrl the HT Capabilties Info field in the HT Capabilities information element
+   */
+  void SetHtCapabilitiesInfo (uint16_t ctrl);
+  /**
+   * Set the A-MPDU Parameters field in the HT Capabilities information element.
+   *
+   * \param ctrl the A-MPDU Parameters field in the HT Capabilities information element
+   */
+  void SetAmpduParameters (uint8_t ctrl);
+  /**
+   * Set the Supported MCS Set field in the HT Capabilities information element.
+   *
+   * \param ctrl1 the first 64 bytes of the Supported MCS Set field in the HT Capabilities information element
+   * \param ctrl2 the last 64 bytes of the Supported MCS Set field in the HT Capabilities information element
+   */
+  void SetSupportedMcsSet (uint64_t ctrl1, uint64_t ctrl2);
+  /**
+   * Set the Extended HT Capabilties field in the HT Capabilities information element.
+   *
+   * \param ctrl the Extended HT Capabilties field in the HT Capabilities information element
+   */
+  void SetExtendedHtCapabilities (uint16_t ctrl);
+  /**
+   * Set the Transmit Beamforming (TxBF) Capabilties field in the HT Capabilities information element.
+   *
+   * \param ctrl the Transmit Beamforming (TxBF) Capabilties field in the HT Capabilities information element
+   */
+  void SetTxBfCapabilities (uint32_t ctrl);
+  /**
+   * Set the the Antenna Selection (ASEL) Capabilties field in the HT Capabilities information element.
+   *
+   * \param ctrl the Antenna Selection (ASEL) Capabilties field in the HT Capabilities information element
+   */
+  void SetAntennaSelectionCapabilities (uint8_t ctrl);
+
   void SetLdpc (uint8_t ldpc);
   void SetSupportedChannelWidth (uint8_t supportedchannelwidth);
   void SetGreenfield (uint8_t greenfield);
-  void SetShortGuardInterval20(uint8_t shortguardinterval);
-  void SetHtCapabilitiesInfo(uint16_t ctrl);
-  void SetAmpduParameters (uint8_t ctrl);
-  void SetSupportedMcsSet (uint64_t ctrl1, uint64_t ctrl2);
-  void SetHtSupported(uint8_t htsupported);
-  void SetRxMcsBitmask(uint8_t index);
-  bool IsSupportedMcs (uint8_t mcs);
-  //returns the HT Capabilties info field in the HT Capabilities information element
+  void SetShortGuardInterval20 (uint8_t shortguardinterval);
+  void SetShortGuardInterval40 (uint8_t shortguardinterval);
+  void SetMaxAmsduLength (uint8_t maxamsdulength);
+  void SetLSigProtectionSupport (uint8_t lsigprotection);
+
+  void SetMaxAmpduLength (uint8_t maxampdulength);
+
+  void SetRxMcsBitmask (uint8_t index);
+  void SetRxHighestSupportedDataRate (uint16_t maxsupportedrate);
+  void SetTxMcsSetDefined (uint8_t txmcssetdefined);
+  void SetTxMaxNSpatialStreams (uint8_t maxtxspatialstreams);
+
+  /*
+   * Return the HT Capabilties Info field in the HT Capabilities information element.
+   *
+   * \return the HT Capabilties Info field in the HT Capabilities information element
+   */
   uint16_t GetHtCapabilitiesInfo (void) const;
-  //returns the Ampdu parameters field in the HT Capabilities information element
+  /*
+   * Return the A-MPDU Parameters field in the HT Capabilities information element.
+   *
+   * \return the A-MPDU Parameters field in the HT Capabilities information element
+   */
   uint8_t GetAmpduParameters (void) const;
-  //returns the first 64bytes of the Supported MCS field in the HT Capabilities information element
+  /*
+   * Return the first 64 bytes of the Supported MCS Set field in the HT Capabilities information element.
+   *
+   * \return the first 64 bytes of the Supported MCS Set field in the HT Capabilities information element
+   */
   uint64_t GetSupportedMcsSet1 (void) const;
-  //returns the first 64bytes of the Supported MCS field in the HT Capabilities information element
+  /*
+   * Return the last 64 bytes of the Supported MCS Set field in the HT Capabilities information element.
+   *
+   * \return the last 64 bytes of the Supported MCS Set field in the HT Capabilities information element
+   */
   uint64_t GetSupportedMcsSet2 (void) const;
+  /*
+   * Return the Extended HT Capabilties field in the HT Capabilities information element.
+   *
+   * \return the Extended HT Capabilties field in the HT Capabilities information element
+   */
+  uint16_t GetExtendedHtCapabilities (void) const;
+  /*
+   * Return the Transmit Beamforming (TxBF) Capabilties field in the HT Capabilities information element.
+   *
+   * \return the Transmit Beamforming (TxBF) Capabilties field in the HT Capabilities information element
+   */
+  uint32_t GetTxBfCapabilities (void) const;
+  /*
+   * Return the Antenna Selection (ASEL) Capabilties field in the HT Capabilities information element.
+   *
+   * \return the Antenna Selection (ASEL) Capabilties field in the HT Capabilities information element
+   */
+  uint8_t GetAntennaSelectionCapabilities (void) const;
+
   uint8_t GetLdpc (void) const;
+  uint8_t GetSupportedChannelWidth (void) const;
   uint8_t GetGreenfield (void) const;
   uint8_t GetShortGuardInterval20 (void) const;
-  uint8_t GetSupportedChannelWidth (void) const;
-  uint8_t* GetRxMcsBitmask();
-  
+  uint8_t GetShortGuardInterval40 (void) const;
+  uint8_t GetMaxAmsduLength (void) const;
+  uint8_t GetLSigProtectionSupport (void) const;
+
+  uint8_t GetMaxAmpduLength (void) const;
+
+  uint8_t* GetRxMcsBitmask ();
+  bool IsSupportedMcs (uint8_t mcs);
+  uint16_t GetRxHighestSupportedDataRate (void) const;
+  uint8_t GetTxMcsSetDefined (void) const;
+  uint8_t GetTxMaxNSpatialStreams (void) const;
+
   WifiInformationElementId ElementId () const;
   uint8_t GetInformationFieldSize () const;
   void SerializeInformationField (Buffer::Iterator start) const;
@@ -81,36 +173,42 @@
    * WifiInformationElement.
    *
    * \param start
+   *
    * \return an iterator
    */
   Buffer::Iterator Serialize (Buffer::Iterator start) const;
   /**
-   * Return the serialized size of this HT capability 
+   * Return the serialized size of this HT capability
    * information element.
-   * 
-   * \return the serialized size of this HT capability 
-   * information element
+   *
+   * \return the serialized size of this HT capability information element
    */
   uint16_t GetSerializedSize () const;
- 
+
+
 private:
+  //HT Capabilties Info field
   uint8_t m_ldpc;
   uint8_t m_supportedChannelWidth;
   uint8_t m_smPowerSave;
   uint8_t m_greenField;
-  uint8_t m_shortGuardInterval20; 
+  uint8_t m_shortGuardInterval20;
   uint8_t m_shortGuardInterval40;
   uint8_t m_txStbc;
   uint8_t m_rxStbc;
   uint8_t m_htDelayedBlockAck;
   uint8_t m_maxAmsduLength;
   uint8_t m_dssMode40;
-  uint8_t m_reserved;
+  uint8_t m_psmpSupport;
   uint8_t m_fortyMhzIntolerant;
   uint8_t m_lsigProtectionSupport;
+
+  //A-MPDU Parameters field
   uint8_t m_maxAmpduLength;
   uint8_t m_minMpduStartSpace;
   uint8_t m_ampduReserved;
+
+  //Supported MCS Set field
   uint8_t m_reservedMcsSet1;
   uint16_t m_rxHighestSupportedDataRate;
   uint8_t m_reservedMcsSet2;
@@ -118,9 +216,51 @@
   uint8_t m_txRxMcsSetUnequal;
   uint8_t m_txMaxNSpatialStreams;
   uint8_t m_txUnequalModulation;
-  uint32_t m_reservedMcsSet3; 
+  uint32_t m_reservedMcsSet3;
   uint8_t m_rxMcsBitmask[MAX_SUPPORTED_MCS];
-  //this is used to decide if this element should be added to the frame or not
+
+  //HT Extended Capabilties field
+  uint8_t m_pco;
+  uint8_t m_pcoTransitionTime;
+  uint8_t m_reservedExtendedCapabilities;
+  uint8_t m_mcsFeedback;
+  uint8_t m_htcSupport;
+  uint8_t m_reverzeDirectionResponder;
+  uint8_t m_reservedExtendedCapabilities2;
+
+  //Transmit Beamforming Capabilities field
+  uint8_t m_implicitRxBfCapable;
+  uint8_t m_rxStaggeredSoundingCapable;
+  uint8_t m_txStaggeredSoundingCapable;
+  uint8_t m_rxNdpCapable;
+  uint8_t m_txNdpCapable;
+  uint8_t m_implicitTxBfCapable;
+  uint8_t m_calibration;
+  uint8_t m_explicitCsiTxBfCapable;
+  uint8_t m_explicitNoncompressedSteeringCapable;
+  uint8_t m_explicitCompressedSteeringCapable;
+  uint8_t m_explicitTxBfCsiFeedback;
+  uint8_t m_explicitNoncompressedBfFeedbackCapable;
+  uint8_t m_explicitCompressedBfFeedbackCapable;
+  uint8_t m_minimalGrouping;
+  uint8_t m_csiNBfAntennasSupported;
+  uint8_t m_noncompressedSteeringNBfAntennasSupported;
+  uint8_t m_compressedSteeringNBfAntennasSupported;
+  uint8_t m_csiMaxNRowsBfSupported;
+  uint8_t m_channelEstimationCapability;
+  uint8_t m_reservedTxBf;
+
+  //ASEL Capabilities field
+  uint8_t m_antennaSelectionCapability;
+  uint8_t m_explicitCsiFeedbackBasedTxASelCapable;
+  uint8_t m_antennaIndicesFeedbackBasedTxASelCapable;
+  uint8_t m_explicitCsiFeedbackCapable;
+  uint8_t m_antennaIndicesFeedbackCapable;
+  uint8_t m_rxASelCapable;
+  uint8_t m_txSoundingPpdusCapable;
+  uint8_t m_reservedASel;
+
+  //This is used to decide whether this element should be added to the frame or not
   uint8_t m_htSupported;
 };
 
@@ -129,6 +269,6 @@
 
 ATTRIBUTE_HELPER_HEADER (HtCapabilities);
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* HT_CAPABILITY_H */
diff -Naur ns-3.23/src/wifi/model/ideal-wifi-manager.cc ns-3.24/src/wifi/model/ideal-wifi-manager.cc
--- ns-3.23/src/wifi/model/ideal-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ideal-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "ideal-wifi-manager.h"
 #include "wifi-phy.h"
 #include "ns3/assert.h"
@@ -59,6 +60,7 @@
 IdealWifiManager::IdealWifiManager ()
 {
 }
+
 IdealWifiManager::~IdealWifiManager ()
 {
 }
@@ -110,14 +112,17 @@
                                 double rxSnr, WifiMode txMode)
 {
 }
+
 void
 IdealWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
 {
 }
+
 void
 IdealWifiManager::DoReportDataFailed (WifiRemoteStation *station)
 {
 }
+
 void
 IdealWifiManager::DoReportRtsOk (WifiRemoteStation *st,
                                  double ctsSnr, WifiMode ctsMode, double rtsSnr)
@@ -125,6 +130,7 @@
   IdealWifiRemoteStation *station = (IdealWifiRemoteStation *)st;
   station->m_lastSnr = rtsSnr;
 }
+
 void
 IdealWifiManager::DoReportDataOk (WifiRemoteStation *st,
                                   double ackSnr, WifiMode ackMode, double dataSnr)
@@ -132,10 +138,12 @@
   IdealWifiRemoteStation *station = (IdealWifiRemoteStation *)st;
   station->m_lastSnr = dataSnr;
 }
+
 void
 IdealWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
 {
 }
+
 void
 IdealWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
 {
@@ -145,9 +153,9 @@
 IdealWifiManager::DoGetDataTxVector (WifiRemoteStation *st, uint32_t size)
 {
   IdealWifiRemoteStation *station = (IdealWifiRemoteStation *)st;
-  // We search within the Supported rate set the mode with the
-  // highest snr threshold possible which is smaller than m_lastSnr
-  // to ensure correct packet delivery.
+  //We search within the Supported rate set the mode with the
+  //highest snr threshold possible which is smaller than m_lastSnr
+  //to ensure correct packet delivery.
   double maxThreshold = 0.0;
   WifiMode maxMode = GetDefaultMode ();
   for (uint32_t i = 0; i < GetNSupported (station); i++)
@@ -161,15 +169,22 @@
           maxMode = mode;
         }
     }
-  return WifiTxVector (maxMode, GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (maxMode, GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
+
 WifiTxVector
 IdealWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
 {
   IdealWifiRemoteStation *station = (IdealWifiRemoteStation *)st;
-  // We search within the Basic rate set the mode with the highest
-  // snr threshold possible which is smaller than m_lastSnr to
-  // ensure correct packet delivery.
+  //We search within the Basic rate set the mode with the highest
+  //snr threshold possible which is smaller than m_lastSnr to
+  //ensure correct packet delivery.
   double maxThreshold = 0.0;
   WifiMode maxMode = GetDefaultMode ();
   for (uint32_t i = 0; i < GetNBasicModes (); i++)
@@ -183,7 +198,13 @@
           maxMode = mode;
         }
     }
-  return WifiTxVector (maxMode, GetDefaultTxPowerLevel (), GetShortRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (maxMode, GetDefaultTxPowerLevel (), GetShortRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
 bool
@@ -192,4 +213,4 @@
   return true;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/ideal-wifi-manager.h ns-3.24/src/wifi/model/ideal-wifi-manager.h
--- ns-3.23/src/wifi/model/ideal-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ideal-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef IDEAL_WIFI_MANAGER_H
 #define IDEAL_WIFI_MANAGER_H
 
@@ -51,8 +52,9 @@
 
   virtual void SetupPhy (Ptr<WifiPhy> phy);
 
+
 private:
-  // overriden from base class
+  //overriden from base class
   virtual WifiRemoteStation* DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
@@ -73,6 +75,7 @@
    * data with this mode at the specified BER.
    *
    * \param mode WifiMode
+   *
    * \return the minimum SNR for the given mode
    */
   double GetSnrThreshold (WifiMode mode) const;
@@ -90,10 +93,10 @@
    */
   typedef std::vector<std::pair<double,WifiMode> > Thresholds;
 
-  double m_ber;  //!< The maximum Bit Error Rate acceptable at any transmission mode
+  double m_ber;             //!< The maximum Bit Error Rate acceptable at any transmission mode
   Thresholds m_thresholds;  //!< List of WifiMode and the minimum SNR pair
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* IDEAL_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/interference-helper.cc ns-3.24/src/wifi/model/interference-helper.cc
--- ns-3.23/src/wifi/model/interference-helper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/interference-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,8 +15,10 @@
  * 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>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
+
 #include "interference-helper.h"
 #include "wifi-phy.h"
 #include "error-rate-model.h"
@@ -43,6 +45,7 @@
     m_rxPowerW (rxPower)
 {
 }
+
 InterferenceHelper::Event::~Event ()
 {
 }
@@ -52,36 +55,43 @@
 {
   return m_endTime - m_startTime;
 }
+
 Time
 InterferenceHelper::Event::GetStartTime (void) const
 {
   return m_startTime;
 }
+
 Time
 InterferenceHelper::Event::GetEndTime (void) const
 {
   return m_endTime;
 }
+
 double
 InterferenceHelper::Event::GetRxPowerW (void) const
 {
   return m_rxPowerW;
 }
+
 uint32_t
 InterferenceHelper::Event::GetSize (void) const
 {
   return m_size;
 }
+
 WifiTxVector
 InterferenceHelper::Event::GetTxVector (void) const
 {
   return m_txVector;
 }
+
 WifiMode
 InterferenceHelper::Event::GetPayloadMode (void) const
 {
-  return m_txVector.GetMode();
+  return m_txVector.GetMode ();
 }
+
 enum WifiPreamble
 InterferenceHelper::Event::GetPreambleType (void) const
 {
@@ -99,22 +109,26 @@
     m_delta (delta)
 {
 }
+
 Time
 InterferenceHelper::NiChange::GetTime (void) const
 {
   return m_time;
 }
+
 double
 InterferenceHelper::NiChange::GetDelta (void) const
 {
   return m_delta;
 }
+
 bool
 InterferenceHelper::NiChange::operator < (const InterferenceHelper::NiChange& o) const
 {
   return (m_time < o.m_time);
 }
 
+
 /****************************************************************
  *       The actual InterferenceHelper
  ****************************************************************/
@@ -125,6 +139,7 @@
     m_rxing (false)
 {
 }
+
 InterferenceHelper::~InterferenceHelper ()
 {
   EraseEvents ();
@@ -219,16 +234,17 @@
 
 
 double
-InterferenceHelper::CalculateSnr (double signal, double noiseInterference, WifiMode mode) const
+InterferenceHelper::CalculateSnr (double signal, double noiseInterference, uint32_t channelWidth) const
 {
-  // thermal noise at 290K in J/s = W
+  //thermal noise at 290K in J/s = W
   static const double BOLTZMANN = 1.3803e-23;
-  // Nt is the power of thermal noise in W
-  double Nt = BOLTZMANN * 290.0 * mode.GetBandwidth ();
-  // receiver noise Floor (W) which accounts for thermal noise and non-idealities of the receiver
+  //Nt is the power of thermal noise in W
+  double Nt = BOLTZMANN * 290.0 * channelWidth * 1000000;
+  //receiver noise Floor (W) which accounts for thermal noise and non-idealities of the receiver
   double noiseFloor = m_noiseFigure * Nt;
   double noise = noiseFloor + noiseInterference;
-  double snr = signal / noise;
+  double snr = signal / noise; //linear scale
+  NS_LOG_DEBUG ("bandwidth(MHz)=" << channelWidth << ", signal(W)= " << signal << ", noise(W)=" << noiseFloor << ", interference(W)=" << noiseInterference << ", snr(linear)=" << snr);
   return snr;
 }
 
@@ -251,103 +267,59 @@
 }
 
 double
-InterferenceHelper::CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode) const
+InterferenceHelper::CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode, WifiTxVector txVector) const
 {
   if (duration == NanoSeconds (0))
     {
       return 1.0;
     }
-  uint32_t rate = mode.GetPhyRate ();
+  uint32_t rate = mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1);
   uint64_t nbits = (uint64_t)(rate * duration.GetSeconds ());
-  double csr = m_errorRateModel->GetChunkSuccessRate (mode, snir, (uint32_t)nbits);
+  double csr = m_errorRateModel->GetChunkSuccessRate (mode, txVector, snir, (uint32_t)nbits);
   return csr;
 }
 
 double
 InterferenceHelper::CalculatePlcpPayloadPer (Ptr<const InterferenceHelper::Event> event, NiChanges *ni) const
 {
+  NS_LOG_FUNCTION (this);
   double psr = 1.0; /* Packet Success Rate */
   NiChanges::iterator j = ni->begin ();
   Time previous = (*j).GetTime ();
   WifiMode payloadMode = event->GetPayloadMode ();
   WifiPreamble preamble = event->GetPreambleType ();
-  Time plcpHeaderStart = (*j).GetTime () + WifiPhy::GetPlcpPreambleDuration (payloadMode, preamble); //packet start time+ preamble
-  Time plcpHsigHeaderStart = plcpHeaderStart + WifiPhy::GetPlcpHeaderDuration (payloadMode, preamble);//packet start time+ preamble+L SIG
-  Time plcpHtTrainingSymbolsStart = plcpHsigHeaderStart + WifiPhy::GetPlcpHtSigHeaderDuration (preamble);//packet start time+ preamble+L SIG+HT SIG
-  Time plcpPayloadStart =plcpHtTrainingSymbolsStart + WifiPhy::GetPlcpHtTrainingSymbolDuration (preamble,event->GetTxVector()); //packet start time+ preamble+L SIG+HT SIG+Training
+  Time plcpHeaderStart = (*j).GetTime () + WifiPhy::GetPlcpPreambleDuration (event->GetTxVector (), preamble); //packet start time + preamble
+  Time plcpHsigHeaderStart = plcpHeaderStart + WifiPhy::GetPlcpHeaderDuration (event->GetTxVector (), preamble); //packet start time + preamble + L-SIG
+  Time plcpHtTrainingSymbolsStart = plcpHsigHeaderStart + WifiPhy::GetPlcpHtSigHeaderDuration (preamble) + WifiPhy::GetPlcpVhtSigA1Duration (preamble) + WifiPhy::GetPlcpVhtSigA2Duration (preamble); //packet start time + preamble + L-SIG + HT-SIG or VHT-SIG-A (A1 + A2)
+  Time plcpPayloadStart = plcpHtTrainingSymbolsStart + WifiPhy::GetPlcpHtTrainingSymbolDuration (preamble, event->GetTxVector ()) + WifiPhy::GetPlcpVhtSigBDuration (preamble); //packet start time + preamble + L-SIG + HT-SIG or VHT-SIG-A (A1 + A2) + (V)HT Training + VHT-SIG-B
   double noiseInterferenceW = (*j).GetDelta ();
   double powerW = event->GetRxPowerW ();
-    j++;
+  j++;
   while (ni->end () != j)
     {
       Time current = (*j).GetTime ();
+      NS_LOG_DEBUG ("previous= " << previous << ", current=" << current);
       NS_ASSERT (current >= previous);
-      //Case 1: Both prev and curr point to the payload
+      //Case 1: Both previous and current point to the payload
       if (previous >= plcpPayloadStart)
         {
           psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                           noiseInterferenceW,
-                                                          payloadMode),
+                                                          event->GetTxVector ().GetChannelWidth ()),
                                             current - previous,
-                                            payloadMode);
-        }
-      //Case 2: previous is before payload
-      else if (previous >= plcpHtTrainingSymbolsStart)
-        {
-          //Case 2a: current is after payload
-          if (current >= plcpPayloadStart)
-            { 
-               //Case 2ai and 2aii: All formats
-               psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                               noiseInterferenceW,
-                                                               payloadMode),
-                                                 current - plcpPayloadStart,
-                                                 payloadMode);
-                
-            }
-        }
-      //Case 3: previous is in HT-SIG: Non HT will not enter here since it didn't enter in the last two and they are all the same for non HT
-      else if (previous >= plcpHsigHeaderStart)
-        {
-          //Case 3a: cuurent after payload start
-          if (current >= plcpPayloadStart)
-             {
-                   psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                   noiseInterferenceW,
-                                                                   payloadMode),
-                                                     current - plcpPayloadStart,
-                                                     payloadMode);
-                 
-              }
+                                            payloadMode, event->GetTxVector ());
 
+          NS_LOG_DEBUG ("Both previous and current point to the payload: mode=" << payloadMode << ", psr=" << psr);
         }
-      //Case 4: previous in L-SIG: GF will not reach here because it will execute the previous if and exit
-      else if (previous >= plcpHeaderStart)
+      //Case 2: previous is before payload and current is in the payload
+      else if (current >= plcpPayloadStart)
         {
-          //Case 4a: current after payload start  
-          if (current >= plcpPayloadStart)
-             {
-                   psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                   noiseInterferenceW,
-                                                                   payloadMode),
-                                                     current - plcpPayloadStart,
-                                                     payloadMode);
-
-              }
-        }
-      //Case 5: previous is in the preamble works for all cases
-      else
-        {
-          if (current >= plcpPayloadStart)
-            {
-              //for all
-              psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                              noiseInterferenceW,
-                                                              payloadMode),
-                                                current - plcpPayloadStart,
-                                                payloadMode); 
-             
-            }
+          psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                          noiseInterferenceW,
+                                                          event->GetTxVector ().GetChannelWidth ()),
+                                            current - plcpPayloadStart,
+                                            payloadMode, event->GetTxVector ());
+          NS_LOG_DEBUG ("previous is before payload and current is in the payload: mode=" << payloadMode << ", psr=" << psr);
         }
 
       noiseInterferenceW += (*j).GetDelta ();
@@ -362,224 +334,445 @@
 double
 InterferenceHelper::CalculatePlcpHeaderPer (Ptr<const InterferenceHelper::Event> event, NiChanges *ni) const
 {
+  NS_LOG_FUNCTION (this);
   double psr = 1.0; /* Packet Success Rate */
   NiChanges::iterator j = ni->begin ();
   Time previous = (*j).GetTime ();
   WifiMode payloadMode = event->GetPayloadMode ();
   WifiPreamble preamble = event->GetPreambleType ();
-  WifiMode MfHeaderMode ;
+  WifiMode htHeaderMode;
   if (preamble == WIFI_PREAMBLE_HT_MF)
     {
-      MfHeaderMode = WifiPhy::GetMFPlcpHeaderMode (payloadMode, preamble); //return L-SIG mode
+      //mode for PLCP header fields sent with HT modulation
+      htHeaderMode = WifiPhy::GetHtPlcpHeaderMode (payloadMode);
     }
-  WifiMode headerMode = WifiPhy::GetPlcpHeaderMode (payloadMode, preamble);
-  Time plcpHeaderStart = (*j).GetTime () + WifiPhy::GetPlcpPreambleDuration (payloadMode, preamble); // packet start time + preamble
-  Time plcpHsigHeaderStart = plcpHeaderStart + WifiPhy::GetPlcpHeaderDuration (payloadMode, preamble); // packet start time + preamble+L SIG
-  Time plcpHtTrainingSymbolsStart = plcpHsigHeaderStart + WifiPhy::GetPlcpHtSigHeaderDuration (preamble); // packet start time + preamble + L SIG + HT SIG
-  Time plcpPayloadStart = plcpHtTrainingSymbolsStart + WifiPhy::GetPlcpHtTrainingSymbolDuration (preamble, event->GetTxVector()); // packet start time + preamble + L SIG + HT SIG + Training
+  else if (preamble == WIFI_PREAMBLE_VHT)
+    {
+      //mode for PLCP header fields sent with VHT modulation
+      htHeaderMode = WifiPhy::GetVhtPlcpHeaderMode (payloadMode);
+    }
+  WifiMode headerMode = WifiPhy::GetPlcpHeaderMode (payloadMode, preamble, event->GetTxVector ());
+  Time plcpHeaderStart = (*j).GetTime () + WifiPhy::GetPlcpPreambleDuration (event->GetTxVector (), preamble); //packet start time + preamble
+  Time plcpHsigHeaderStart = plcpHeaderStart + WifiPhy::GetPlcpHeaderDuration (event->GetTxVector (), preamble); //packet start time + preamble + L-SIG
+  Time plcpHtTrainingSymbolsStart = plcpHsigHeaderStart + WifiPhy::GetPlcpHtSigHeaderDuration (preamble) + WifiPhy::GetPlcpVhtSigA1Duration (preamble) + WifiPhy::GetPlcpVhtSigA2Duration (preamble); //packet start time + preamble + L-SIG + HT-SIG or VHT-SIG-A (A1 + A2)
+  Time plcpPayloadStart = plcpHtTrainingSymbolsStart + WifiPhy::GetPlcpHtTrainingSymbolDuration (preamble, event->GetTxVector ()) + WifiPhy::GetPlcpVhtSigBDuration (preamble); //packet start time + preamble + L-SIG + HT-SIG or VHT-SIG-A (A1 + A2) + (V)HT Training + VHT-SIG-B
   double noiseInterferenceW = (*j).GetDelta ();
   double powerW = event->GetRxPowerW ();
-    j++;
+  j++;
   while (ni->end () != j)
     {
       Time current = (*j).GetTime ();
+      NS_LOG_DEBUG ("previous= " << previous << ", current=" << current);
       NS_ASSERT (current >= previous);
-      //Case 1: previous is in HT-SIG: Non HT will not enter here since it didn't enter in the last two and they are all the same for non HT
-      if (previous >= plcpHsigHeaderStart)
+      //Case 1: previous and current after playload start: nothing to do
+      if (previous >= plcpPayloadStart)
         {
-          //Case 1a: cuurent after payload start
+          psr *= 1;
+          NS_LOG_DEBUG ("Case 1 - previous and current after playload start: nothing to do");
+        }
+      //Case 2: previous is in (V)HT training or in VHT-SIG-B: Non (V)HT will not enter here since it didn't enter in the last two and they are all the same for non (V)HT
+      else if (previous >= plcpHtTrainingSymbolsStart)
+        {
+          NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
+          //Case 2a: current after payload start
           if (current >= plcpPayloadStart)
-             {
+            {
+              psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                              noiseInterferenceW,
+                                                              event->GetTxVector ().GetChannelWidth ()),
+                                                plcpPayloadStart - previous,
+                                                htHeaderMode, event->GetTxVector ());
 
-                 
-                    psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                    noiseInterferenceW,
-                                                                    headerMode),
-                                                      plcpHtTrainingSymbolsStart - previous,
-                                                      headerMode);
-              }
-          //case 1b: current after HT training symbols start
-          else if (current >=plcpHtTrainingSymbolsStart)
-             {
-                psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                noiseInterferenceW,
-                                                                headerMode),
-                                                  plcpHtTrainingSymbolsStart - previous,
-                                                  headerMode);
-                   
-             }
-         //Case 1c: current is with previous in HT sig
-         else
-            {
-                psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                noiseInterferenceW,
-                                                                headerMode),
-                                                  current - previous,
-                                                  headerMode);
-                   
+              NS_LOG_DEBUG ("Case 2a - previous is in (V)HT training or in VHT-SIG-B and current after payload start: mode=" << htHeaderMode << ", psr=" << psr);
             }
-      }
-      // Case 2: previous in L-SIG: GF will not reach here because it will execute the previous if and exit
-      else if (previous >= plcpHeaderStart)
+          //Case 2b: current is in (V)HT training or in VHT-SIG-B
+          else
+            {
+              psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                              noiseInterferenceW,
+                                                              event->GetTxVector ().GetChannelWidth ()),
+                                                current - previous,
+                                                htHeaderMode, event->GetTxVector ());
+
+              NS_LOG_DEBUG ("Case 2b - previous is in (V)HT training or in VHT-SIG-B and current is in (V)HT training or in VHT-SIG-B: mode=" << htHeaderMode << ", psr=" << psr);
+            }
+        }
+      //Case 3: previous is in HT-SIG or VHT-SIG-A: Non (V)HT will not enter here since it didn't enter in the last two and they are all the same for non (V)HT
+      else if (previous >= plcpHsigHeaderStart)
         {
-          // Case 2a: current after payload start
+          NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
+          //Case 3a: current after payload start
           if (current >= plcpPayloadStart)
-             {
-              // Case 2ai: Non HT format (No HT-SIG or Training Symbols)
-              if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT) //plcpHtTrainingSymbolsStart==plcpHeaderStart)
-                {
-                    psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                    noiseInterferenceW,
-                                                                    headerMode),
-                                                      plcpPayloadStart - previous,
-                                                      headerMode);
+            {
+              psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                              noiseInterferenceW,
+                                                              event->GetTxVector ().GetChannelWidth ()),
+                                                plcpPayloadStart - plcpHtTrainingSymbolsStart,
+                                                htHeaderMode, event->GetTxVector ());
+
+              //Case 3ai: VHT format
+              if (preamble == WIFI_PREAMBLE_VHT)
+                {
+                  //VHT-SIG-A is sent using legacy OFDM modulation
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHtTrainingSymbolsStart - previous,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 3ai - previous is in VHT-SIG-A and current after payload start: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
                 }
+              //Case 3aii: HT mixed format of HT greenfield
               else
                 {
-                    psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                              noiseInterferenceW,
-                                                              headerMode),
-                                                      plcpHtTrainingSymbolsStart - plcpHsigHeaderStart,
-                                                      headerMode);
-                    psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                    noiseInterferenceW,
-                                                                    MfHeaderMode),
-                                                      plcpHsigHeaderStart - previous,
-                                                      MfHeaderMode);
-                 }
-              }
-          // Case 2b: current in HT training symbol. non HT will not come here since it went in previous if or if the previous ifis not true this will be not true
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHtTrainingSymbolsStart - previous,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 3aii - previous is in HT-SIG and current after payload start: mode=" << htHeaderMode << ", psr=" << psr);
+                }
+            }
+          //Case 3b: current is in (V)HT training or in VHT-SIG-B
           else if (current >= plcpHtTrainingSymbolsStart)
-             {
-                psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+            {
+              psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                               noiseInterferenceW,
-                                                              headerMode),
-                                                  plcpHtTrainingSymbolsStart - plcpHsigHeaderStart,
-                                                  headerMode);
-                psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                noiseInterferenceW,
-                                                                MfHeaderMode),
-                                                   plcpHsigHeaderStart - previous,
-                                                   MfHeaderMode);
-              }
-          // Case 2c: current in H sig. non HT will not come here since it went in previous if or if the previous ifis not true this will be not true
-          else if (current >= plcpHsigHeaderStart)
-             {
-                psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                noiseInterferenceW,
-                                                                headerMode),
-                                                  current - plcpHsigHeaderStart,
-                                                  headerMode);
-                 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                 noiseInterferenceW,
-                                                                 MfHeaderMode),
-                                                   plcpHsigHeaderStart - previous,
-                                                   MfHeaderMode);
-
-             }
-         // Case 2d: Current with prev in L SIG
-         else 
-            {
-              // Case 4di: Non HT format (No HT-SIG or Training Symbols)
-              if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT) //plcpHtTrainingSymbolsStart==plcpHeaderStart)
-                {
-                    psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                    noiseInterferenceW,
-                                                                    headerMode),
-                                                      current - previous,
-                                                      headerMode);
+                                                              event->GetTxVector ().GetChannelWidth ()),
+                                                current - plcpHtTrainingSymbolsStart,
+                                                htHeaderMode, event->GetTxVector ());
+
+              //Case 3bi: VHT format
+              if (preamble == WIFI_PREAMBLE_VHT)
+                {
+                  //VHT-SIG-A is sent using legacy OFDM modulation
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHtTrainingSymbolsStart - previous,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 3bi - previous is in VHT-SIG-A and current is in VHT training or in VHT-SIG-B: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
+                }
+              //Case 3bii: HT mixed format of HT greenfield
+              else
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHtTrainingSymbolsStart - previous,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 3bii - previous is in HT-SIG and current is in HT training: mode=" << htHeaderMode << ", psr=" << psr);
+                }
+            }
+          //Case 3c: current with previous in HT-SIG or VHT-SIG-A
+          else
+            {
+              //Case 3bi: VHT format
+              if (preamble == WIFI_PREAMBLE_VHT)
+                {
+                  //VHT-SIG-A is sent using legacy OFDM modulation
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    current - previous,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 3ci - previous with current in VHT-SIG-A: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
                 }
+              //Case 3bii: HT mixed format of HT greenfield
               else
                 {
-                    psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                               noiseInterferenceW,
-                                                               MfHeaderMode),
-                                                      current - previous,
-                                                      MfHeaderMode);
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    current - previous,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 3cii - previous with current in HT-SIG: mode=" << htHeaderMode << ", psr=" << psr);
                 }
             }
         }
-      // Case 3: previous is in the preamble works for all cases
-      else
+      //Case 4: previous in L-SIG: HT GF will not reach here because it will execute the previous if and exit
+      else if (previous >= plcpHeaderStart)
         {
+          NS_ASSERT (preamble != WIFI_PREAMBLE_HT_GF);
+          //Case 4a: current after payload start
           if (current >= plcpPayloadStart)
             {
-              // Non HT format (No HT-SIG or Training Symbols)
+              //Case 4ai: Non (V)HT format
               if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT)
-                 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                 noiseInterferenceW,
-                                                                 headerMode),
-                                                   plcpPayloadStart - plcpHeaderStart,
-                                                   headerMode);
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpPayloadStart - previous,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 4ai - previous in L-SIG and current after payload start: mode=" << headerMode << ", psr=" << psr);
+                }
+              //Case 4aii: VHT format
+              else if (preamble == WIFI_PREAMBLE_VHT)
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpPayloadStart - plcpHtTrainingSymbolsStart,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHtTrainingSymbolsStart - previous,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 4aii - previous is in L-SIG and current after payload start: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
+                }
+              //Case 4aiii: HT mixed format
               else
-              // Greenfield or Mixed format
-                psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                noiseInterferenceW,
-                                                                headerMode),
-                                                  plcpHtTrainingSymbolsStart - plcpHsigHeaderStart,
-                                                  headerMode);
-              if (preamble == WIFI_PREAMBLE_HT_MF)
-                 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                 noiseInterferenceW,
-                                                                 MfHeaderMode),
-                                                   plcpHsigHeaderStart-plcpHeaderStart,
-                                                   MfHeaderMode);             
-            }
-          else if (current >= plcpHtTrainingSymbolsStart )
-          { 
-              // Non HT format will not come here since it will execute prev if
-              // Greenfield or Mixed format
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpPayloadStart - plcpHsigHeaderStart,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHsigHeaderStart - previous,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 4aiii - previous in L-SIG and current after payload start: HT mode=" << htHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
+                }
+            }
+          //Case 4b: current is in (V)HT training or in VHT-SIG-B. Non (V)HT will not come here since it went in previous if or if the previous if is not true this will be not true
+          else if (current >= plcpHtTrainingSymbolsStart)
+            {
+              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
+
+              //Case 4bi: VHT format
+              if (preamble == WIFI_PREAMBLE_VHT)
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    current - plcpHtTrainingSymbolsStart,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHtTrainingSymbolsStart - previous,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 4bi - previous is in L-SIG and current in VHT training or in VHT-SIG-B: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
+                }
+              //Case 4bii: HT mixed format
+              else
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    current - plcpHsigHeaderStart,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHsigHeaderStart - previous,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 4bii - previous in L-SIG and current in HT training: HT mode=" << htHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
+                }
+            }
+          //Case 4c: current in HT-SIG or in VHT-SIG-A. Non (V)HT will not come here since it went in previous if or if the previous if is not true this will be not true
+          else if (current >= plcpHsigHeaderStart)
+            {
+              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
+
+              //Case 4ci: VHT format
+              if (preamble == WIFI_PREAMBLE_VHT)
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    current - previous,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 4ci - previous is in L-SIG and current in VHT-SIG-A: mode=" << headerMode << ", psr=" << psr);
+                }
+              //Case 4cii: HT mixed format
+              else
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    current - plcpHsigHeaderStart,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHsigHeaderStart - previous,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 4cii - previous in L-SIG and current in HT-SIG: HT mode=" << htHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
+                }
+            }
+          //Case 4d: current with previous in L-SIG
+          else
+            {
               psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                               noiseInterferenceW,
-                                                              headerMode),
-                                                plcpHtTrainingSymbolsStart - plcpHsigHeaderStart,
-                                                headerMode);
-              // Greenfield
-              if (preamble == WIFI_PREAMBLE_HT_MF)
-                {
-                    psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                    noiseInterferenceW,
-                                                                    MfHeaderMode),
-                                                      plcpHsigHeaderStart-plcpHeaderStart,
-                                                      MfHeaderMode);
+                                                              event->GetTxVector ().GetChannelWidth ()),
+                                                current - previous,
+                                                headerMode, event->GetTxVector ());
+
+              NS_LOG_DEBUG ("Case 3c - current with previous in L-SIG: mode=" << headerMode << ", psr=" << psr);
+            }
+        }
+      //Case 5: previous is in the preamble works for all cases
+      else
+        {
+          //Case 5a: current after payload start
+          if (current >= plcpPayloadStart)
+            {
+              //Case 5ai: Non HT format (No HT-SIG or Training Symbols)
+              if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT)
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpPayloadStart - plcpHeaderStart,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 5a - previous is in the preamble and current is after payload start: mode=" << headerMode << ", psr=" << psr);
+                }
+              //Case 5aii: VHT format
+              else if (preamble == WIFI_PREAMBLE_VHT)
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpPayloadStart - plcpHtTrainingSymbolsStart,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHtTrainingSymbolsStart - plcpHeaderStart,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 5aii - previous is in the preamble and current is after payload start: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
+                }
+
+              //Case 5aiii: HT format
+              else
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpPayloadStart - plcpHsigHeaderStart,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHsigHeaderStart - plcpHeaderStart, //HT GF: plcpHsigHeaderStart - plcpHeaderStart = 0
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 4a - previous is in the preamble and current is after payload start: HT mode=" << htHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
+                }
+            }
+          //Case 5b: current is in (V)HT training or in VHT-SIG-B. Non (V)HT will not come here since it went in previous if or if the previous if is not true this will be not true
+          else if (current >= plcpHtTrainingSymbolsStart)
+            {
+              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
+
+              //Case 5bi: VHT format
+              if (preamble == WIFI_PREAMBLE_VHT)
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    current - plcpHtTrainingSymbolsStart,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHtTrainingSymbolsStart - plcpHeaderStart,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 5bi - previous is in the preamble and current in VHT training or in VHT-SIG-B: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
+                }
+              //Case 45ii: HT mixed format
+              else
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    current - plcpHsigHeaderStart,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHsigHeaderStart - plcpHeaderStart,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 5bii - previous is in the preamble and current in HT training: HT mode=" << htHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
                 }
-           }
-          // non HT will not come here
+            }
+          //Case 5c: current in HT-SIG or in VHT-SIG-A. Non (V)HT will not come here since it went in previous if or if the previous if is not true this will be not true
           else if (current >= plcpHsigHeaderStart)
-             { 
-                psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                noiseInterferenceW,
-                                                                headerMode),
-                                                  current- plcpHsigHeaderStart,
-                                                  headerMode); 
-                if  (preamble != WIFI_PREAMBLE_HT_GF)
-                 {
-                   psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                   noiseInterferenceW,
-                                                                   MfHeaderMode),
-                                                     plcpHsigHeaderStart-plcpHeaderStart,
-                                                     MfHeaderMode);    
-                  }          
-             }
-          // GF will not come here
-          else if (current >= plcpHeaderStart)
             {
-               if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT)
-                 {
-                 psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
-                                                                 noiseInterferenceW,
-                                                                 headerMode),
-                                                   current - plcpHeaderStart,
-                                                   headerMode);
-                 }
+              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
+
+              //Case 5ci: VHT format
+              if (preamble == WIFI_PREAMBLE_VHT)
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    current - plcpHeaderStart,
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 5ci - previous is in preamble and current in VHT-SIG-A: mode=" << headerMode << ", psr=" << psr);
+                }
+              //Case 5cii: HT mixed format
               else
-                 {
+                {
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    current - plcpHsigHeaderStart,
+                                                    htHeaderMode, event->GetTxVector ());
+
+                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
+                                                                  noiseInterferenceW,
+                                                                  event->GetTxVector ().GetChannelWidth ()),
+                                                    plcpHsigHeaderStart - plcpHeaderStart, //HT GF: plcpHsigHeaderStart - plcpHeaderStart = 0
+                                                    headerMode, event->GetTxVector ());
+
+                  NS_LOG_DEBUG ("Case 5cii - previous in preamble and current in HT-SIG: HT mode=" << htHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
+                }
+            }
+          //Case 5d: current is in L-SIG. HT GF will not come here
+          else if (current >= plcpHeaderStart)
+            {
+              NS_ASSERT (preamble != WIFI_PREAMBLE_HT_GF);
+
               psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
                                                               noiseInterferenceW,
-                                                              MfHeaderMode),
+                                                              event->GetTxVector ().GetChannelWidth ()),
                                                 current - plcpHeaderStart,
-                                                MfHeaderMode);
-                       }
+                                                headerMode, event->GetTxVector ());
+
+              NS_LOG_DEBUG ("Case 5d - previous is in the preamble and current is in L-SIG: mode=" << headerMode << ", psr=" << psr);
             }
         }
 
@@ -599,7 +792,7 @@
   double noiseInterferenceW = CalculateNoiseInterferenceW (event, &ni);
   double snr = CalculateSnr (event->GetRxPowerW (),
                              noiseInterferenceW,
-                             event->GetPayloadMode ());
+                             event->GetTxVector ().GetChannelWidth ());
 
   /* calculate the SNIR at the start of the packet and accumulate
    * all SNIR changes in the snir vector.
@@ -619,7 +812,7 @@
   double noiseInterferenceW = CalculateNoiseInterferenceW (event, &ni);
   double snr = CalculateSnr (event->GetRxPowerW (),
                              noiseInterferenceW,
-                             WifiPhy::GetPlcpHeaderMode (event->GetPayloadMode (), event->GetPreambleType ()));
+                             event->GetTxVector ().GetChannelWidth ());
 
   /* calculate the SNIR at the start of the plcp header and accumulate
    * all SNIR changes in the snir vector.
@@ -639,25 +832,31 @@
   m_rxing = false;
   m_firstPower = 0.0;
 }
+
 InterferenceHelper::NiChanges::iterator
 InterferenceHelper::GetPosition (Time moment)
 {
   return std::upper_bound (m_niChanges.begin (), m_niChanges.end (), NiChange (moment, 0));
-
 }
+
 void
 InterferenceHelper::AddNiChangeEvent (NiChange change)
 {
   m_niChanges.insert (GetPosition (change.GetTime ()), change);
 }
+
 void
 InterferenceHelper::NotifyRxStart ()
 {
+  NS_LOG_FUNCTION (this);
   m_rxing = true;
 }
+
 void
 InterferenceHelper::NotifyRxEnd ()
 {
+  NS_LOG_FUNCTION (this);
   m_rxing = false;
 }
-} // namespace ns3
+
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/interference-helper.h ns-3.24/src/wifi/model/interference-helper.h
--- ns-3.23/src/wifi/model/interference-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/interference-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef INTERFERENCE_HELPER_H
 #define INTERFERENCE_HELPER_H
 
@@ -51,13 +52,12 @@
      * Create an Event with the given parameters.
      *
      * \param size packet size
-     * \param txvector TXVECTOR of the packet
+     * \param txVector TXVECTOR of the packet
      * \param preamble preamble type
      * \param duration duration of the signal
      * \param rxPower the receive power (w)
-     * \param txvector TXVECTOR of the packet
      */
-    Event (uint32_t size, WifiTxVector txvector,
+    Event (uint32_t size, WifiTxVector txVector,
            enum WifiPreamble preamble,
            Time duration, double rxPower);
     ~Event ();
@@ -111,6 +111,7 @@
      */
     enum WifiPreamble GetPreambleType (void) const;
 
+
 private:
     uint32_t m_size;
     WifiTxVector m_txVector;
@@ -119,6 +120,7 @@
     Time m_endTime;
     double m_rxPowerW;
   };
+
   /**
    * A struct for both SNR and PER
    */
@@ -157,9 +159,9 @@
    */
   Ptr<ErrorRateModel> GetErrorRateModel (void) const;
 
-
   /**
    * \param energyW the minimum energy (W) requested
+   *
    * \returns the expected amount of time the observed
    *          energy on the medium will be higher than
    *          the requested threshold.
@@ -170,13 +172,14 @@
    * Add the packet-related signal to interference helper.
    *
    * \param size packet size
-   * \param txvector TXVECTOR of the packet
+   * \param txVector TXVECTOR of the packet
    * \param preamble Wi-Fi preamble for the packet
    * \param duration the duration of the signal
-   * \param rxPower receive power (w)
+   * \param rxPower receive power (W)
+   *
    * \return InterferenceHelper::Event
    */
-  Ptr<InterferenceHelper::Event> Add (uint32_t size, WifiTxVector txvector,
+  Ptr<InterferenceHelper::Event> Add (uint32_t size, WifiTxVector txVector,
                                       enum WifiPreamble preamble,
                                       Time duration, double rxPower);
 
@@ -185,6 +188,7 @@
    * all SNIR changes in the snir vector.
    *
    * \param event the event corresponding to the first time the corresponding packet arrives
+   *
    * \return struct of SNR and PER
    */
   struct InterferenceHelper::SnrPer CalculatePlcpPayloadSnrPer (Ptr<InterferenceHelper::Event> event);
@@ -193,9 +197,11 @@
    * all SNIR changes in the snir vector.
    *
    * \param event the event corresponding to the first time the corresponding packet arrives
+   *
    * \return struct of SNR and PER
    */
   struct InterferenceHelper::SnrPer CalculatePlcpHeaderSnrPer (Ptr<InterferenceHelper::Event> event);
+
   /**
    * Notify that RX has started.
    */
@@ -208,6 +214,8 @@
    * Erase all events.
    */
   void EraseEvents (void);
+
+
 private:
   /**
    * Noise and Interference (thus Ni) event.
@@ -241,6 +249,8 @@
      * \return true if a < o.time, false otherwise
      */
     bool operator < (const NiChange& o) const;
+
+
 private:
     Time m_time;
     double m_delta;
@@ -254,8 +264,6 @@
    */
   typedef std::list<Ptr<Event> > Events;
 
-  //InterferenceHelper (const InterferenceHelper &o);
-  //InterferenceHelper &operator = (const InterferenceHelper &o);
   /**
    * Append the given Event.
    *
@@ -267,6 +275,7 @@
    *
    * \param event
    * \param ni
+   *
    * \return noise and interference power
    */
   double CalculateNoiseInterferenceW (Ptr<Event> event, NiChanges *ni) const;
@@ -276,10 +285,11 @@
    *
    * \param signal
    * \param noiseInterference
-   * \param mode
+   * \param channelWidth
+   *
    * \return SNR in liear ratio
    */
-  double CalculateSnr (double signal, double noiseInterference, WifiMode mode) const;
+  double CalculateSnr (double signal, double noiseInterference, uint32_t channelWidth) const;
   /**
    * Calculate the success rate of the chunk given the SINR, duration, and Wi-Fi mode.
    * The duration and mode are used to calculate how many bits are present in the chunk.
@@ -287,15 +297,18 @@
    * \param snir SINR
    * \param duration
    * \param mode
+   * \param txVector
+   *
    * \return the success rate
    */
-  double CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode) const;
+  double CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode, WifiTxVector txVector) const;
   /**
    * Calculate the error rate of the given plcp payload. The plcp payload can be divided into
    * multiple chunks (e.g. due to interference from other transmissions).
    *
    * \param event
    * \param ni
+   *
    * \return the error rate of the packet
    */
   double CalculatePlcpPayloadPer (Ptr<const Event> event, NiChanges *ni) const;
@@ -305,6 +318,7 @@
    *
    * \param event
    * \param ni
+   *
    * \return the error rate of the packet
    */
   double CalculatePlcpHeaderPer (Ptr<const Event> event, NiChanges *ni) const;
@@ -325,6 +339,6 @@
   void AddNiChangeEvent (NiChange change);
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* INTERFERENCE_HELPER_H */
diff -Naur ns-3.23/src/wifi/model/mac-low.cc ns-3.24/src/wifi/model/mac-low.cc
--- ns-3.23/src/wifi/model/mac-low.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mac-low.cc	2015-09-15 11:18:44.000000000 -0700
@@ -16,8 +16,8 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
 
 #include "ns3/assert.h"
@@ -27,7 +27,6 @@
 #include "ns3/log.h"
 #include "ns3/node.h"
 #include "ns3/double.h"
-
 #include "mac-low.h"
 #include "wifi-phy.h"
 #include "wifi-mac-trailer.h"
@@ -37,12 +36,11 @@
 #include "yans-wifi-phy.h"
 #include "ampdu-tag.h"
 #include "wifi-mac-queue.h"
-#include "mpdu-aggregator.h"
+#include "mpdu-standard-aggregator.h"
 
 #undef NS_LOG_APPEND_CONTEXT
 #define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
 
-
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("MacLow");
@@ -75,42 +73,41 @@
 MacLowAggregationCapableTransmissionListener::~MacLowAggregationCapableTransmissionListener ()
 {
 }
-
 void MacLowAggregationCapableTransmissionListener::SetAmpdu (bool ampdu)
 {
 }
-void MacLowAggregationCapableTransmissionListener::CompleteTransfer(Mac48Address address, uint8_t tid)
+void MacLowAggregationCapableTransmissionListener::CompleteTransfer (Mac48Address address, uint8_t tid)
 {
 }
 void
 MacLowAggregationCapableTransmissionListener::CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp)
 {
 }
-uint16_t 
+uint16_t
 MacLowAggregationCapableTransmissionListener::GetNextSequenceNumberfor (WifiMacHeader *hdr)
 {
- return 0;
+  return 0;
 }
-uint16_t 
+uint16_t
 MacLowAggregationCapableTransmissionListener::PeekNextSequenceNumberfor (WifiMacHeader *hdr)
 {
- return 0;
+  return 0;
 }
-Ptr<const Packet> 
+Ptr<const Packet>
 MacLowAggregationCapableTransmissionListener::PeekNextPacketInBaQueue (WifiMacHeader &header, Mac48Address recipient, uint8_t tid, Time *timestamp)
 {
- return 0;
+  return 0;
 }
-void 
+void
 MacLowAggregationCapableTransmissionListener::RemoveFromBaQueue (uint8_t tid, Mac48Address recipient, uint16_t seqnumber)
 {
 }
-uint32_t 
+uint32_t
 MacLowAggregationCapableTransmissionListener::GetNOutstandingPackets (Mac48Address recipient, uint8_t tid)
 {
   return 0;
 }
-uint32_t 
+uint32_t
 MacLowAggregationCapableTransmissionListener::GetNRetryNeededPackets (Mac48Address recipient, uint8_t tid) const
 {
   return 0;
@@ -269,10 +266,10 @@
 std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters &params)
 {
   os << "["
-  << "send rts=" << params.m_sendRts << ", "
-  << "next size=" << params.m_nextSize << ", "
-  << "dur=" << params.m_overrideDurationId << ", "
-  << "ack=";
+     << "send rts=" << params.m_sendRts << ", "
+     << "next size=" << params.m_nextSize << ", "
+     << "dur=" << params.m_overrideDurationId << ", "
+     << "ack=";
   switch (params.m_waitAck)
     {
     case MacLowTransmissionParameters::ACK_NONE:
@@ -368,7 +365,8 @@
     m_listener (0),
     m_phyMacLowListener (0),
     m_ctsToSelfSupported (false),
-    m_receivedAtLeastOneMpdu (false)
+    m_receivedAtLeastOneMpdu (false),
+    m_mpduReferenceNumber (0)
 {
   NS_LOG_FUNCTION (this);
   m_lastNavDuration = Seconds (0);
@@ -384,6 +382,18 @@
   NS_LOG_FUNCTION (this);
 }
 
+/* static */
+TypeId
+MacLow::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::MacLow")
+    .SetParent<Object> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<MacLow> ()
+  ;
+  return tid;
+}
+
 void
 MacLow::SetupPhyMacLowListener (Ptr<WifiPhy> phy)
 {
@@ -417,13 +427,13 @@
   m_sendDataEvent.Cancel ();
   m_waitSifsEvent.Cancel ();
   m_endTxNoAckEvent.Cancel ();
-   m_waitRifsEvent.Cancel();
+  m_waitRifsEvent.Cancel ();
   m_phy = 0;
   m_stationManager = 0;
   if (m_phyMacLowListener != 0)
     {
-	  delete m_phyMacLowListener;
-	  m_phyMacLowListener = 0;
+      delete m_phyMacLowListener;
+      m_phyMacLowListener = 0;
     }
   m_mpduAggregator = 0;
   m_sentMpdus = 0;
@@ -491,7 +501,7 @@
       m_waitRifsEvent.Cancel ();
       oneRunning = true;
     }
-  if (m_endTxNoAckEvent.IsRunning ()) 
+  if (m_endTxNoAckEvent.IsRunning ())
     {
       m_endTxNoAckEvent.Cancel ();
       oneRunning = true;
@@ -511,19 +521,22 @@
   m_phy->SetReceiveErrorCallback (MakeCallback (&MacLow::ReceiveError, this));
   SetupPhyMacLowListener (phy);
 }
+
 Ptr<WifiPhy>
 MacLow::GetPhy (void) const
 {
   return m_phy;
 }
+
 void
 MacLow::ResetPhy (void)
 {
-  m_phy->SetReceiveOkCallback (MakeNullCallback<void,Ptr<Packet>, double, WifiTxVector, enum WifiPreamble>  ());
-  m_phy->SetReceiveErrorCallback (MakeNullCallback<void,Ptr<const Packet>, double> ());
+  m_phy->SetReceiveOkCallback (MakeNullCallback<void, Ptr<Packet>, double, WifiTxVector, enum WifiPreamble> ());
+  m_phy->SetReceiveErrorCallback (MakeNullCallback<void, Ptr<const Packet>, double> ());
   RemovePhyMacLowListener (m_phy);
   m_phy = 0;
 }
+
 void
 MacLow::SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> manager)
 {
@@ -535,116 +548,139 @@
 {
   m_self = ad;
 }
+
 void
 MacLow::SetAckTimeout (Time ackTimeout)
 {
   m_ackTimeout = ackTimeout;
 }
+
 void
 MacLow::SetBasicBlockAckTimeout (Time blockAckTimeout)
 {
   m_basicBlockAckTimeout = blockAckTimeout;
 }
+
 void
 MacLow::SetCompressedBlockAckTimeout (Time blockAckTimeout)
 {
   m_compressedBlockAckTimeout = blockAckTimeout;
 }
+
 void
 MacLow::SetCtsToSelfSupported (bool enable)
 {
   m_ctsToSelfSupported = enable;
 }
+
 bool
 MacLow::GetCtsToSelfSupported () const
 {
   return m_ctsToSelfSupported;
 }
+
 void
 MacLow::SetCtsTimeout (Time ctsTimeout)
 {
   m_ctsTimeout = ctsTimeout;
 }
+
 void
 MacLow::SetSifs (Time sifs)
 {
   m_sifs = sifs;
 }
+
 void
 MacLow::SetSlotTime (Time slotTime)
 {
   m_slotTime = slotTime;
 }
+
 void
 MacLow::SetPifs (Time pifs)
 {
   m_pifs = pifs;
 }
+
 void
 MacLow::SetRifs (Time rifs)
 {
   m_rifs = rifs;
 }
+
 void
 MacLow::SetBssid (Mac48Address bssid)
 {
   m_bssid = bssid;
 }
+
 void
 MacLow::SetPromisc (void)
 {
   m_promisc = true;
 }
+
 Mac48Address
 MacLow::GetAddress (void) const
 {
   return m_self;
 }
+
 Time
 MacLow::GetAckTimeout (void) const
 {
   return m_ackTimeout;
 }
+
 Time
 MacLow::GetBasicBlockAckTimeout () const
 {
   return m_basicBlockAckTimeout;
 }
+
 Time
 MacLow::GetCompressedBlockAckTimeout () const
 {
   return m_compressedBlockAckTimeout;
 }
+
 Time
 MacLow::GetCtsTimeout (void) const
 {
   return m_ctsTimeout;
 }
+
 Time
 MacLow::GetSifs (void) const
 {
   return m_sifs;
 }
+
 Time
 MacLow::GetRifs (void) const
 {
   return m_rifs;
 }
+
 Time
 MacLow::GetSlotTime (void) const
 {
   return m_slotTime;
 }
+
 Time
 MacLow::GetPifs (void) const
 {
   return m_pifs;
 }
+
 Mac48Address
 MacLow::GetBssid (void) const
 {
   return m_bssid;
 }
+
 bool
 MacLow::IsPromisc (void) const
 {
@@ -652,10 +688,11 @@
 }
 
 void
-MacLow::SetRxCallback (Callback<void,Ptr<Packet>,const WifiMacHeader *> callback)
+MacLow::SetRxCallback (Callback<void, Ptr<Packet>, const WifiMacHeader *> callback)
 {
   m_rxCallback = callback;
 }
+
 void
 MacLow::RegisterDcfListener (MacLowDcfListener *listener)
 {
@@ -669,14 +706,16 @@
   WifiMacTrailer fcs;
   size = packet->GetSize () + hdr.GetSize () + fcs.GetSerializedSize ();
   Ptr<Packet> p = AggregateToAmpdu (packet, hdr);
-  actualSize = p->GetSize();
+  actualSize = p->GetSize ();
   if (actualSize > size)
     {
       m_currentPacket = p;
       return true;
     }
   else
+    {
       return false;
+    }
 }
 
 void
@@ -693,95 +732,128 @@
    * expired. This means that one of these timers is still
    * running. They are all cancelled below anyway by the
    * call to CancelAllEvents (because of at least one
-   * of these two timer) which will trigger a call to the
+   * of these two timers) which will trigger a call to the
    * previous listener's cancel method.
    *
    * This typically happens because the high-priority
    * QapScheduler has taken access to the channel from
    * one of the Edca of the QAP.
    */
+  m_currentPacket = packet->Copy ();
   m_currentHdr = *hdr;
   CancelAllEvents ();
   m_listener = listener;
   m_txParams = params;
 
-  //NS_ASSERT (m_phy->IsStateIdle ());
-
-  if(m_aggregateQueue->GetSize () == 0)
-  {
-    m_currentPacket = packet->Copy ();
-    m_ampdu = IsAmpdu (m_currentPacket, m_currentHdr);
-  }
+  if (!m_currentHdr.IsQosData () && !m_currentHdr.IsBlockAck () && !m_currentHdr.IsBlockAckReq ())
+    {
+      //This is mainly encountered when a higher priority control frame (such as beacons)
+      //is sent between A-MPDU transmissions. It avoids to unexpectedly flush the aggregate
+      //queue when previous RTS request has failed.
+      m_ampdu = false;
+    }
+  else if (m_aggregateQueue->GetSize () > 0)
+    {
+      //m_aggregateQueue > 0 occurs when a RTS/CTS exchange failed before an A-MPDU transmission.
+      //In that case, we transmit the same A-MPDU as previously.
+      m_sentMpdus = m_aggregateQueue->GetSize ();
+      m_ampdu = true;
+      if (m_sentMpdus > 1)
+        {
+          m_txParams.EnableCompressedBlockAck ();
+        }
+      else
+        {
+          //VHT single MPDUs are followed by normal ACKs
+          m_txParams.EnableAck ();
+        }
+    }
   else
-  {
-   /*m_aggregateQueue > 0 occurs when a RTS/CTS exchange failed before an A-MPDU transmission.
-    *In that case, we transmit the same A-MPDU as previously.
-    */
-    m_sentMpdus = m_aggregateQueue->GetSize ();
-    m_ampdu = true;
-  }
+    {
+      //Perform MPDU aggregation if possible
+      m_ampdu = IsAmpdu (m_currentPacket, m_currentHdr);
+      if (m_ampdu)
+        {
+          AmpduTag ampdu;
+          m_currentPacket->PeekPacketTag (ampdu);
+          if (ampdu.GetNoOfMpdus () > 1)
+            {
+              m_txParams.EnableCompressedBlockAck ();
+            }
+          else
+            {
+              //VHT single MPDUs are followed by normal ACKs
+              m_txParams.EnableAck ();
+            }
+        }
+    }
 
   NS_LOG_DEBUG ("startTx size=" << GetSize (m_currentPacket, &m_currentHdr) <<
                 ", to=" << m_currentHdr.GetAddr1 () << ", listener=" << m_listener);
 
-  if (m_ampdu)
-      m_txParams.EnableCompressedBlockAck ();
-
   if (m_txParams.MustSendRts ())
     {
       SendRtsForPacket ();
     }
   else
     {
-     if (NeedCtsToSelf() && m_ctsToSelfSupported)
+      if (NeedCtsToSelf () && m_ctsToSelfSupported)
         {
-          SendCtsToSelf();
+          SendCtsToSelf ();
         }
       else
         {
           SendDataPacket ();
-       }
+        }
     }
 
   /* When this method completes, we have taken ownership of the medium. */
   NS_ASSERT (m_phy->IsStateTx ());
 }
+
 bool
 MacLow::NeedCtsToSelf (void)
 {
   WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
   return m_stationManager->NeedCtsToSelf (dataTxVector);
 }
+
 void
 MacLow::ReceiveError (Ptr<const Packet> packet, double rxSnr)
 {
   NS_LOG_FUNCTION (this << packet << rxSnr);
   NS_LOG_DEBUG ("rx failed ");
   AmpduTag ampdu;
-  Ptr<Packet> pkt = packet->Copy();
-  bool isInAmpdu = pkt->RemovePacketTag(ampdu);
+  Ptr<Packet> pkt = packet->Copy ();
+  bool isInAmpdu = pkt->RemovePacketTag (ampdu);
 
-  if(isInAmpdu && m_receivedAtLeastOneMpdu && (ampdu.GetNoOfMpdus() == 1))
+  if (isInAmpdu && m_receivedAtLeastOneMpdu && (ampdu.GetNoOfMpdus () == 1))
     {
-      MpduAggregator::DeaggregatedMpdus packets =  MpduAggregator::Deaggregate (pkt);
+      MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (pkt);
       MpduAggregator::DeaggregatedMpdusCI n = packets.begin ();
       WifiMacHeader hdr;
-      (*n).first->PeekHeader(hdr);
-      if(hdr.IsQosData())
+      (*n).first->PeekHeader (hdr);
+      if (hdr.IsQosData ())
         {
-          NS_LOG_DEBUG ("last a-mpdu subframe detected/sendImmediateBlockAck from=" << hdr.GetAddr2 ());
-          m_sendAckEvent = Simulator::Schedule (GetSifs (),
-                                                &MacLow::SendBlockAckAfterAmpdu, this,
-                                                hdr.GetQosTid(),
-                                                hdr.GetAddr2 (),
-                                                hdr.GetDuration (),
-                                                m_currentTxVector);
+          uint8_t tid = hdr.GetQosTid ();
+          AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), tid));
+          if (it != m_bAckAgreements.end ())
+            {
+              NS_LOG_DEBUG ("last a-mpdu subframe detected/sendImmediateBlockAck from=" << hdr.GetAddr2 ());
+              m_sendAckEvent = Simulator::Schedule (GetSifs (),
+                                                    &MacLow::SendBlockAckAfterAmpdu, this,
+                                                    hdr.GetQosTid (),
+                                                    hdr.GetAddr2 (),
+                                                    hdr.GetDuration (),
+                                                    m_currentTxVector);
+              m_receivedAtLeastOneMpdu = false;
+            }
         }
-      else if (hdr.IsBlockAckReq())
+      else if (hdr.IsBlockAckReq ())
         {
- 	  NS_LOG_DEBUG("last a-mpdu subframe is BAR");
-  	}
-      m_receivedAtLeastOneMpdu = false;
+          NS_LOG_DEBUG ("last a-mpdu subframe is BAR");
+          m_receivedAtLeastOneMpdu = false;
+        }
     }
   else if (m_txParams.MustWaitFastAck ())
     {
@@ -848,7 +920,7 @@
        */
       if (ampduSubframe)
         {
-           NS_FATAL_ERROR ("Received RTS as part of an A-MPDU");
+          NS_FATAL_ERROR ("Received RTS as part of an A-MPDU");
         }
       else
         {
@@ -881,7 +953,9 @@
         {
           NS_FATAL_ERROR ("Received CTS as part of an A-MPDU");
         }
+
       NS_LOG_DEBUG ("receive cts from=" << m_currentHdr.GetAddr1 ());
+
       SnrTag tag;
       packet->RemovePacketTag (tag);
       m_stationManager->ReportRxOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
@@ -913,8 +987,10 @@
       m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
                                       rxSnr, txVector.GetMode (), tag.Get ());
 
-      FlushAggregateQueue();
+      FlushAggregateQueue ();
+      m_ampdu = false;
       bool gotAck = false;
+
       if (m_txParams.MustWaitNormalAck ()
           && m_normalAckTimeoutEvent.IsRunning ())
         {
@@ -951,7 +1027,7 @@
       m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 (), txVector.GetMode ());
       m_sentMpdus = 0;
       m_ampdu = false;
-      FlushAggregateQueue();
+      FlushAggregateQueue ();
     }
   else if (hdr.IsBlockAckReq () && hdr.GetAddr1 () == m_self)
     {
@@ -1012,13 +1088,13 @@
              Upon the receipt of a QoS data frame from the originator for which
              the Block Ack agreement exists, the recipient shall buffer the MSDU
              regardless of the value of the Ack Policy subfield within the
-             QoS Control field of the QoS data frame. */;
+             QoS Control field of the QoS data frame. */
           if (hdr.IsQosAck () && !ampduSubframe)
             {
               NS_LOG_DEBUG ("rx QoS unicast/sendAck from=" << hdr.GetAddr2 ());
               AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
 
-              RxCompleteBufferedPacketsWithSmallerSequence (it->second.first.GetStartingSequence (),
+              RxCompleteBufferedPacketsWithSmallerSequence (it->second.first.GetStartingSequenceControl (),
                                                             hdr.GetAddr2 (), hdr.GetQosTid ());
               RxCompleteBufferedPacketsUntilFirstLost (hdr.GetAddr2 (), hdr.GetQosTid ());
               NS_ASSERT (m_sendAckEvent.IsExpired ());
@@ -1054,18 +1130,18 @@
         }
       else if (hdr.IsQosData () && hdr.IsQosNoAck ())
         {
-           if (ampduSubframe)
-               {
-                 NS_LOG_DEBUG ("rx Ampdu with No Ack Policy from=" << hdr.GetAddr2 ());
-               }
-             else
-               {
-                 NS_LOG_DEBUG ("rx unicast/noAck from=" << hdr.GetAddr2 ());
-               }
+          if (ampduSubframe)
+            {
+              NS_LOG_DEBUG ("rx Ampdu with No Ack Policy from=" << hdr.GetAddr2 ());
+            }
+          else
+            {
+              NS_LOG_DEBUG ("rx unicast/noAck from=" << hdr.GetAddr2 ());
+            }
         }
       else if (hdr.IsData () || hdr.IsMgt ())
         {
-          if (hdr.IsMgt() && ampduSubframe)
+          if (hdr.IsMgt () && ampduSubframe)
             {
               NS_FATAL_ERROR ("Received management packet as part of an A-MPDU");
             }
@@ -1079,6 +1155,7 @@
                                                     hdr.GetDuration (),
                                                     txVector.GetMode (),
                                                     rxSnr);
+              m_receivedAtLeastOneMpdu = false;
             }
         }
       goto rxPacket;
@@ -1127,20 +1204,22 @@
 MacLow::GetTid (Ptr<const Packet> packet, const WifiMacHeader hdr) const
 {
   uint8_t tid = 0;
-  if (hdr.IsQosData ()) 
-    tid = hdr.GetQosTid ();
+  if (hdr.IsQosData ())
+    {
+      tid = hdr.GetQosTid ();
+    }
   else if (hdr.IsBlockAckReq ())
     {
       CtrlBAckRequestHeader baReqHdr;
       packet->PeekHeader (baReqHdr);
-      tid = baReqHdr.GetTidInfo();
-     }
+      tid = baReqHdr.GetTidInfo ();
+    }
   else if (hdr.IsBlockAck ())
     {
       CtrlBAckResponseHeader baRespHdr;
       packet->PeekHeader (baRespHdr);
       tid = baRespHdr.GetTidInfo ();
-    }   
+    }
   return tid;
 }
 
@@ -1151,6 +1230,7 @@
   ack.SetType (WIFI_MAC_CTL_ACK);
   return ack.GetSize () + 4;
 }
+
 uint32_t
 MacLow::GetBlockAckSize (enum BlockAckType type) const
 {
@@ -1172,6 +1252,7 @@
     }
   return hdr.GetSize () + blockAck.GetSerializedSize () + 4;
 }
+
 uint32_t
 MacLow::GetRtsSize (void) const
 {
@@ -1179,18 +1260,21 @@
   rts.SetType (WIFI_MAC_CTL_RTS);
   return rts.GetSize () + 4;
 }
+
 Time
 MacLow::GetAckDuration (Mac48Address to, WifiTxVector dataTxVector) const
 {
   WifiTxVector ackTxVector = GetAckTxVectorForData (to, dataTxVector.GetMode ());
   return GetAckDuration (ackTxVector);
 }
+
 Time
 MacLow::GetAckDuration (WifiTxVector ackTxVector) const
 {
-  NS_ASSERT (ackTxVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT); // ACK should always use non-HT PPDU (HT PPDU cases not supported yet)
-  return m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, WIFI_PREAMBLE_LONG, m_phy->GetFrequency(), 0, 0);
+  NS_ASSERT (ackTxVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT); //ACK should always use non-HT PPDU (HT PPDU cases not supported yet)
+  return m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, WIFI_PREAMBLE_LONG, m_phy->GetFrequency (), 0, 0);
 }
+
 Time
 MacLow::GetBlockAckDuration (Mac48Address to, WifiTxVector blockAckReqTxVector, enum BlockAckType type) const
 {
@@ -1200,11 +1284,16 @@
    */
   WifiPreamble preamble;
   if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && type == BASIC_BLOCK_ACK)
-    preamble= WIFI_PREAMBLE_HT_MF;
+    {
+      preamble = WIFI_PREAMBLE_HT_MF;
+    }
   else
-    preamble=WIFI_PREAMBLE_LONG;
-  return m_phy->CalculateTxDuration (GetBlockAckSize (type), blockAckReqTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+    {
+      preamble = WIFI_PREAMBLE_LONG;
+    }
+  return m_phy->CalculateTxDuration (GetBlockAckSize (type), blockAckReqTxVector, preamble, m_phy->GetFrequency (), 0, 0);
 }
+
 Time
 MacLow::GetCtsDuration (Mac48Address to, WifiTxVector rtsTxVector) const
 {
@@ -1215,9 +1304,10 @@
 Time
 MacLow::GetCtsDuration (WifiTxVector ctsTxVector) const
 {
-  NS_ASSERT (ctsTxVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT); // CTS should always use non-HT PPDU (HT PPDU cases not supported yet)
-  return m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, WIFI_PREAMBLE_LONG, m_phy->GetFrequency(), 0, 0);
+  NS_ASSERT (ctsTxVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT); //CTS should always use non-HT PPDU (HT PPDU cases not supported yet)
+  return m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, WIFI_PREAMBLE_LONG, m_phy->GetFrequency (), 0, 0);
 }
+
 uint32_t
 MacLow::GetCtsSize (void) const
 {
@@ -1225,15 +1315,20 @@
   cts.SetType (WIFI_MAC_CTL_CTS);
   return cts.GetSize () + 4;
 }
+
 uint32_t
 MacLow::GetSize (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
 {
   uint32_t size;
   WifiMacTrailer fcs;
   if (m_ampdu)
-     size = packet->GetSize ();
+    {
+      size = packet->GetSize ();
+    }
   else
-     size= packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
+    {
+      size = packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
+    }
   return size;
 }
 
@@ -1249,25 +1344,29 @@
   Mac48Address to = hdr->GetAddr1 ();
   return m_stationManager->GetRtsTxVector (to, hdr, packet);
 }
+
 WifiTxVector
 MacLow::GetDataTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
 {
   Mac48Address to = hdr->GetAddr1 ();
   WifiMacTrailer fcs;
-  uint32_t size =  packet->GetSize ()+ hdr->GetSize () + fcs.GetSerializedSize ();
+  uint32_t size =  packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
   //size is not used in anything!! will not worry about aggregation
   return m_stationManager->GetDataTxVector (to, hdr, packet, size);
 }
+
 WifiTxVector
 MacLow::GetCtsTxVector (Mac48Address to, WifiMode rtsTxMode) const
 {
   return m_stationManager->GetCtsTxVector (to, rtsTxMode);
 }
+
 WifiTxVector
 MacLow::GetAckTxVector (Mac48Address to, WifiMode dataTxMode) const
 {
   return m_stationManager->GetAckTxVector (to, dataTxMode);
 }
+
 WifiTxVector
 MacLow::GetBlockAckTxVector (Mac48Address to, WifiMode dataTxMode) const
 {
@@ -1279,13 +1378,13 @@
 {
   return GetCtsTxVector (to, rtsTxMode);
 }
+
 WifiTxVector
 MacLow::GetAckTxVectorForData (Mac48Address to, WifiMode dataTxMode) const
 {
   return GetAckTxVector (to, dataTxMode);
 }
 
-
 Time
 MacLow::CalculateOverallTxTime (Ptr<const Packet> packet,
                                 const WifiMacHeader* hdr,
@@ -1306,17 +1405,29 @@
           //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
           preamble = WIFI_PREAMBLE_LONG;
         }
-      txTime += m_phy->CalculateTxDuration (GetRtsSize (), rtsTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+      txTime += m_phy->CalculateTxDuration (GetRtsSize (), rtsTxVector, preamble, m_phy->GetFrequency (), 0, 0);
       txTime += GetCtsDuration (hdr->GetAddr1 (), rtsTxVector);
       txTime += Time (GetSifs () * 2);
     }
   WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
-  if ( m_phy->GetGreenfield()&& m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
-    preamble = WIFI_PREAMBLE_HT_GF;
-  else //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
-    preamble = WIFI_PREAMBLE_LONG;
+  if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT)
+    {
+      preamble = WIFI_PREAMBLE_VHT;
+    }
+  else if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
+    {
+      preamble = WIFI_PREAMBLE_HT_GF;
+    }
+  else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
+    {
+      preamble = WIFI_PREAMBLE_HT_MF;
+    }
+  else
+    {
+      preamble = WIFI_PREAMBLE_LONG;
+    }
   uint32_t dataSize = GetSize (packet, hdr);
-  txTime += m_phy->CalculateTxDuration (dataSize, dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+  txTime += m_phy->CalculateTxDuration (dataSize, dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
   if (params.MustWaitAck ())
     {
       txTime += GetSifs ();
@@ -1335,15 +1446,24 @@
     {
       WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
       WifiPreamble preamble;
-      //standard says RTS packets can have GF format sec 9.6.0e.1 page 110 bullet b 2
-      if ( m_phy->GetGreenfield()&& m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
-         preamble= WIFI_PREAMBLE_HT_GF;
-      else if (dataTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
-        preamble= WIFI_PREAMBLE_HT_MF;
+      if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
+        {
+          preamble = WIFI_PREAMBLE_VHT;
+        }
+      if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
+        {
+          preamble = WIFI_PREAMBLE_HT_GF;
+        }
+      else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
+        {
+          preamble = WIFI_PREAMBLE_HT_MF;
+        }
       else
-        preamble=WIFI_PREAMBLE_LONG;
+        {
+          preamble = WIFI_PREAMBLE_LONG;
+        }
       txTime += GetSifs ();
-      txTime += m_phy->CalculateTxDuration (params.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+      txTime += m_phy->CalculateTxDuration (params.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
     }
   return txTime;
 }
@@ -1357,7 +1477,7 @@
   if (hdr.IsCfpoll ()
       && hdr.GetAddr2 () == m_bssid)
     {
-      // see section 9.3.2.2 802.11-1999
+      //see section 9.3.2.2 802.11-1999
       DoNavResetNow (duration);
       return;
     }
@@ -1379,9 +1499,9 @@
            */
           WifiMacHeader cts;
           cts.SetType (WIFI_MAC_CTL_CTS);
-          WifiTxVector txVector=GetRtsTxVector (packet, &hdr);
+          WifiTxVector txVector = GetRtsTxVector (packet, &hdr);
           Time navCounterResetCtsMissedDelay =
-            m_phy->CalculateTxDuration (cts.GetSerializedSize (), txVector, preamble, m_phy->GetFrequency(), 0, 0) +
+            m_phy->CalculateTxDuration (cts.GetSerializedSize (), txVector, preamble, m_phy->GetFrequency (), 0, 0) +
             Time (2 * GetSifs ()) + Time (2 * GetSlotTime ());
           m_navCounterResetCtsMissed = Simulator::Schedule (navCounterResetCtsMissedDelay,
                                                             &MacLow::NavCounterResetCtsMissed, this,
@@ -1407,8 +1527,9 @@
       (*i)->NavReset (duration);
     }
   m_lastNavStart = Simulator::Now ();
-  m_lastNavStart = duration;
+  m_lastNavDuration = duration;
 }
+
 bool
 MacLow::DoNavStartNow (Time duration)
 {
@@ -1426,6 +1547,7 @@
     }
   return false;
 }
+
 void
 MacLow::NotifyAckTimeoutStartNow (Time duration)
 {
@@ -1434,6 +1556,7 @@
       (*i)->AckTimeoutStart (duration);
     }
 }
+
 void
 MacLow::NotifyAckTimeoutResetNow ()
 {
@@ -1442,6 +1565,7 @@
       (*i)->AckTimeoutReset ();
     }
 }
+
 void
 MacLow::NotifyCtsTimeoutStartNow (Time duration)
 {
@@ -1450,6 +1574,7 @@
       (*i)->CtsTimeoutStart (duration);
     }
 }
+
 void
 MacLow::NotifyCtsTimeoutResetNow ()
 {
@@ -1472,7 +1597,7 @@
                 ", seq=0x" << std::hex << m_currentHdr.GetSequenceControl () << std::dec);
   if (!m_ampdu || hdr->IsRts ())
     {
-      m_phy->SendPacket (packet, txVector, preamble, 0);
+      m_phy->SendPacket (packet, txVector, preamble, 0, 0);
     }
   else
     {
@@ -1480,14 +1605,25 @@
       Ptr <const Packet> dequeuedPacket;
       WifiMacHeader newHdr;
       WifiMacTrailer fcs;
-        uint32_t queueSize = m_aggregateQueue->GetSize ();
+      uint32_t queueSize = m_aggregateQueue->GetSize ();
+      bool vhtSingleMpdu = false;
       bool last = false;
       uint8_t packetType = 0;
+
+      if (queueSize == 1)
+        {
+          vhtSingleMpdu = true;
+        }
+
       //Add packet tag
       AmpduTag ampdutag;
       ampdutag.SetAmpdu (true);
       Time delay = Seconds (0);
-      for ( ; queueSize > 0; queueSize--)
+      if (queueSize > 1 || vhtSingleMpdu)
+        {
+          txVector.SetAggregation (true);
+        }
+      for (; queueSize > 0; queueSize--)
         {
           dequeuedPacket = m_aggregateQueue->Dequeue (&newHdr);
           newPacket = dequeuedPacket->Copy ();
@@ -1499,32 +1635,42 @@
               last = true;
               packetType = 2;
             }
-          m_mpduAggregator->AddHeaderAndPad (newPacket, last);
+          m_mpduAggregator->AddHeaderAndPad (newPacket, last, vhtSingleMpdu);
 
-          ampdutag.SetNoOfMpdus(queueSize);
-          newPacket->AddPacketTag(ampdutag);
+          ampdutag.SetNoOfMpdus (queueSize);
+          newPacket->AddPacketTag (ampdutag);
           if (delay == Seconds (0))
             {
-              NS_LOG_DEBUG("Sending MPDU as part of A-MPDU");
-              packetType = 1;
-              m_phy->SendPacket (newPacket, txVector, preamble, packetType);
+              if (!vhtSingleMpdu)
+                {
+                  NS_LOG_DEBUG ("Sending MPDU as part of A-MPDU");
+                  packetType = 1;
+                }
+              else
+                {
+                  packetType = 0;
+                }
+              m_phy->SendPacket (newPacket, txVector, preamble, packetType, m_mpduReferenceNumber);
             }
           else
             {
-              Simulator::Schedule (delay, &MacLow::SendPacket, this, newPacket, txVector, preamble, packetType);
+              Simulator::Schedule (delay, &MacLow::SendPacket, this, newPacket, txVector, preamble, packetType, m_mpduReferenceNumber);
+            }
+          if (queueSize > 1)
+            {
+              delay = delay + m_phy->CalculateTxDuration (GetSize (newPacket, &newHdr), txVector, preamble, m_phy->GetFrequency (), packetType, 0);
             }
-          if(queueSize > 1)
-            delay = delay + m_phy->CalculateTxDuration (GetSize (newPacket, &newHdr), txVector, preamble, m_phy->GetFrequency(), packetType, 0);
           preamble = WIFI_PREAMBLE_NONE;
         }
+      m_mpduReferenceNumber = ((m_mpduReferenceNumber + 1) % 4294967296);
     }
 }
 
 void
-MacLow::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType)
+MacLow::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber)
 {
-  NS_LOG_DEBUG("Sending MPDU as part of A-MPDU");
-  m_phy->SendPacket (packet, txVector, preamble, packetType); 
+  NS_LOG_DEBUG ("Sending MPDU as part of A-MPDU");
+  m_phy->SendPacket (packet, txVector, preamble, packetType, mpduReferenceNumber);
 }
 
 void
@@ -1536,7 +1682,7 @@
   /// we should restart a new cts timeout now until the expected
   /// end of rx if there was a rx start before now.
   m_stationManager->ReportRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
-  if(m_sentMpdus == 0)
+  if (m_sentMpdus == 0)
     {
       m_currentPacket = 0;
     }
@@ -1546,6 +1692,7 @@
   m_ampdu = false;
   listener->MissedCts ();
 }
+
 void
 MacLow::NormalAckTimeout (void)
 {
@@ -1559,9 +1706,10 @@
   m_listener = 0;
   m_sentMpdus = 0;
   m_ampdu = false;
-  FlushAggregateQueue();
+  FlushAggregateQueue ();
   listener->MissedAck ();
 }
+
 void
 MacLow::FastAckTimeout (void)
 {
@@ -1579,6 +1727,7 @@
       NS_LOG_DEBUG ("fast Ack ok");
     }
 }
+
 void
 MacLow::BlockAckTimeout (void)
 {
@@ -1590,9 +1739,10 @@
   m_listener = 0;
   m_sentMpdus = 0;
   m_ampdu = false;
-  FlushAggregateQueue();
+  FlushAggregateQueue ();
   listener->MissedBlockAck ();
 }
+
 void
 MacLow::SuperFastAckTimeout ()
 {
@@ -1631,9 +1781,13 @@
   WifiPreamble preamble;
   //standard says RTS packets can have GF format sec 9.6.0e.1 page 110 bullet b 2
   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
-    preamble= WIFI_PREAMBLE_HT_GF;
+    {
+      preamble = WIFI_PREAMBLE_HT_GF;
+    }
   else //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
-    preamble = WIFI_PREAMBLE_LONG;
+    {
+      preamble = WIFI_PREAMBLE_LONG;
+    }
 
   if (m_txParams.HasDurationId ())
     {
@@ -1646,16 +1800,16 @@
       duration += GetCtsDuration (m_currentHdr.GetAddr1 (), rtsTxVector);
       duration += GetSifs ();
       duration += m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr),
-                                              dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+                                              dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
       duration += GetSifs ();
       if (m_txParams.MustWaitBasicBlockAck ())
         {
-          WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2(), dataTxVector.GetMode  ());
+          WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
           duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, BASIC_BLOCK_ACK);
         }
       else if (m_txParams.MustWaitCompressedBlockAck ())
         {
-          WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2(), dataTxVector.GetMode  ());
+          WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
           duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
         }
       else if (m_txParams.MustWaitAck ())
@@ -1665,7 +1819,7 @@
       if (m_txParams.HasNextPacket ())
         {
           duration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (),
-                                                  dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+                                                  dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
           if (m_txParams.MustWaitAck ())
             {
               duration += GetSifs ();
@@ -1675,7 +1829,7 @@
     }
   rts.SetDuration (duration);
 
-  Time txDuration = m_phy->CalculateTxDuration (GetRtsSize (), rtsTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+  Time txDuration = m_phy->CalculateTxDuration (GetRtsSize (), rtsTxVector, preamble, m_phy->GetFrequency (), 0, 0);
   Time timerDelay = txDuration + GetCtsTimeout ();
 
   NS_ASSERT (m_ctsTimeoutEvent.IsExpired ());
@@ -1694,16 +1848,26 @@
 MacLow::StartDataTxTimers (WifiTxVector dataTxVector)
 {
   WifiPreamble preamble;
- 
+
+  if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT)
+    {
+      preamble = WIFI_PREAMBLE_VHT;
+    }
   //Since it is data then it can have format = GF
-  if (m_phy->GetGreenfield() && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
-    preamble = WIFI_PREAMBLE_HT_GF;
+  else if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
+    {
+      preamble = WIFI_PREAMBLE_HT_GF;
+    }
   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble = WIFI_PREAMBLE_HT_MF;
+    {
+      preamble = WIFI_PREAMBLE_HT_MF;
+    }
   else
-    preamble = WIFI_PREAMBLE_LONG;
- 
-  Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+    {
+      preamble = WIFI_PREAMBLE_LONG;
+    }
+
+  Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
   if (m_txParams.MustWaitNormalAck ())
     {
       Time timerDelay = txDuration + GetAckTimeout ();
@@ -1742,23 +1906,23 @@
     }
   else if (m_txParams.HasNextPacket ())
     {
-     if (m_stationManager->HasHtSupported())
-       {
+      if (m_stationManager->HasHtSupported ())
+        {
           Time delay = txDuration + GetRifs ();
           NS_ASSERT (m_waitRifsEvent.IsExpired ());
-          m_waitRifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this); 
-       }
-     else
-       {
+          m_waitRifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this);
+        }
+      else
+        {
           Time delay = txDuration + GetSifs ();
           NS_ASSERT (m_waitSifsEvent.IsExpired ());
           m_waitSifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this);
-       }
+        }
     }
   else
     {
       // since we do not expect any timer to be triggered.
-      Simulator::Schedule(txDuration, &MacLow::EndTxNoAck, this);
+      Simulator::Schedule (txDuration, &MacLow::EndTxNoAck, this);
     }
 }
 
@@ -1769,15 +1933,24 @@
   /* send this packet directly. No RTS is needed. */
   WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
   WifiPreamble preamble;
-          
-  if (m_phy->GetGreenfield() && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
-     //In the future has to make sure that receiver has greenfield enabled
-     preamble = WIFI_PREAMBLE_HT_GF;
+  if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT)
+    {
+      preamble = WIFI_PREAMBLE_VHT;
+    }
+  else if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
+    {
+      //In the future has to make sure that receiver has greenfield enabled
+      preamble = WIFI_PREAMBLE_HT_GF;
+    }
   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble = WIFI_PREAMBLE_HT_MF;
+    {
+      preamble = WIFI_PREAMBLE_HT_MF;
+    }
   else
-     preamble = WIFI_PREAMBLE_LONG;
-  
+    {
+      preamble = WIFI_PREAMBLE_LONG;
+    }
+
   StartDataTxTimers (dataTxVector);
 
   Time duration = Seconds (0.0);
@@ -1808,7 +1981,7 @@
         {
           duration += GetSifs ();
           duration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (),
-                                                  dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+                                                  dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
           if (m_txParams.MustWaitAck ())
             {
               duration += GetSifs ();
@@ -1841,6 +2014,7 @@
       return false;
     }
 }
+
 void
 MacLow::SendCtsToSelf (void)
 {
@@ -1851,15 +2025,19 @@
   cts.SetNoMoreFragments ();
   cts.SetNoRetry ();
   cts.SetAddr1 (m_self);
- 
+
   WifiTxVector ctsTxVector = GetCtsToSelfTxVector (m_currentPacket, &m_currentHdr);
 
   WifiPreamble preamble;
   if (ctsTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble = WIFI_PREAMBLE_HT_MF;
+    {
+      preamble = WIFI_PREAMBLE_HT_MF;
+    }
   else
-    preamble = WIFI_PREAMBLE_LONG;
-  
+    {
+      preamble = WIFI_PREAMBLE_LONG;
+    }
+
   Time duration = Seconds (0);
 
   if (m_txParams.HasDurationId ())
@@ -1871,10 +2049,10 @@
       WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
       duration += GetSifs ();
       duration += m_phy->CalculateTxDuration (GetSize (m_currentPacket,&m_currentHdr),
-                                              dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+                                              dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
       if (m_txParams.MustWaitBasicBlockAck ())
         {
-          
+
           duration += GetSifs ();
           WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
           duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, BASIC_BLOCK_ACK);
@@ -1894,7 +2072,7 @@
         {
           duration += GetSifs ();
           duration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (),
-                                                  dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+                                                  dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
           if (m_txParams.MustWaitCompressedBlockAck ())
             {
               duration += GetSifs ();
@@ -1918,15 +2096,17 @@
 
   ForwardDown (packet, &cts, ctsTxVector,preamble);
 
-  Time txDuration = m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+  Time txDuration = m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, preamble, m_phy->GetFrequency (), 0, 0);
   txDuration += GetSifs ();
   NS_ASSERT (m_sendDataEvent.IsExpired ());
-  
+
   m_sendDataEvent = Simulator::Schedule (txDuration,
                                          &MacLow::SendDataAfterCts, this,
                                          cts.GetAddr1 (),
                                          duration);
+
 }
+
 void
 MacLow::SendCtsAfterRts (Mac48Address source, Time duration, WifiTxVector rtsTxVector, double rtsSnr)
 {
@@ -1956,7 +2136,6 @@
   tag.Set (rtsSnr);
   packet->AddPacketTag (tag);
 
-  //CTS should always use non-HT PPDU (HT PPDU cases not supported yet)
   ForwardDown (packet, &cts, ctsTxVector, WIFI_PREAMBLE_LONG);
 }
 
@@ -1969,29 +2148,39 @@
    */
   NS_ASSERT (m_currentPacket != 0);
   WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
-  
+
   if (m_aggregateQueue->GetSize () != 0)
-  {
-    for (std::vector<Item>::size_type i = 0; i != m_txPackets.size(); i++)
     {
-      uint8_t tid = GetTid (m_txPackets.at(i).packet, m_txPackets.at(i).hdr);
-      AcIndex ac = QosUtilsMapTidToAc (tid);
-      std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt= m_edcaListeners.find(ac);
-      
-      listenerIt->second->CompleteMpduTx (m_txPackets.at(i).packet, m_txPackets.at(i).hdr, m_txPackets.at(i).timestamp);
+      for (std::vector<Item>::size_type i = 0; i != m_txPackets.size (); i++)
+        {
+          uint8_t tid = GetTid (m_txPackets.at (i).packet, m_txPackets.at (i).hdr);
+          AcIndex ac = QosUtilsMapTidToAc (tid);
+          std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac);
+
+          listenerIt->second->CompleteMpduTx (m_txPackets.at (i).packet, m_txPackets.at (i).hdr, m_txPackets.at (i).timestamp);
+        }
+      m_txPackets.clear ();
+    }
+
+  WifiPreamble preamble;
+  if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT)
+    {
+      preamble = WIFI_PREAMBLE_VHT;
+    }
+  else if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
+    {
+      //In the future has to make sure that receiver has greenfield enabled
+      preamble = WIFI_PREAMBLE_HT_GF;
     }
-    m_txPackets.clear ();
-  }
-  
-  WifiPreamble preamble;       
-  if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
-     //In the future has to make sure that receiver has greenfield enabled
-     preamble = WIFI_PREAMBLE_HT_GF;
   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble = WIFI_PREAMBLE_HT_MF;
+    {
+      preamble = WIFI_PREAMBLE_HT_MF;
+    }
   else
-     preamble = WIFI_PREAMBLE_LONG;
-  
+    {
+      preamble = WIFI_PREAMBLE_LONG;
+    }
+
   StartDataTxTimers (dataTxVector);
   Time newDuration = Seconds (0);
   if (m_txParams.MustWaitBasicBlockAck ())
@@ -2014,21 +2203,21 @@
   if (m_txParams.HasNextPacket ())
     {
       newDuration += GetSifs ();
-      newDuration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+      newDuration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
       if (m_txParams.MustWaitCompressedBlockAck ())
         {
-           newDuration += GetSifs ();
-           WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
-           newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
+          newDuration += GetSifs ();
+          WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
+          newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
         }
       else if (m_txParams.MustWaitAck ())
         {
-           newDuration += GetSifs ();
-           newDuration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
+          newDuration += GetSifs ();
+          newDuration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
         }
     }
 
-  Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr),dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
+  Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
   duration -= txDuration;
   duration -= GetSifs ();
 
@@ -2037,13 +2226,13 @@
   m_currentHdr.SetDuration (duration);
 
   if (!m_ampdu)
-  {
-    m_currentPacket->AddHeader (m_currentHdr);
-    WifiMacTrailer fcs;
-    m_currentPacket->AddTrailer (fcs);
-  }
+    {
+      m_currentPacket->AddHeader (m_currentHdr);
+      WifiMacTrailer fcs;
+      m_currentPacket->AddTrailer (fcs);
+    }
 
-  ForwardDown (m_currentPacket, &m_currentHdr, dataTxVector,preamble);
+  ForwardDown (m_currentPacket, &m_currentHdr, dataTxVector, preamble);
   m_currentPacket = 0;
 }
 
@@ -2053,7 +2242,7 @@
   m_listener->StartNext ();
 }
 
-void 
+void
 MacLow::EndTxNoAck (void)
 {
   MacLowTransmissionListener *listener = m_listener;
@@ -2107,48 +2296,52 @@
 bool
 MacLow::IsInWindow (uint16_t seq, uint16_t winstart, uint16_t winsize)
 {
-  return ((seq - winstart+ 4096) % 4096) < winsize;
+  return ((seq - winstart + 4096) % 4096) < winsize;
 }
 
-bool 
+bool
 MacLow::ReceiveMpdu (Ptr<Packet> packet, WifiMacHeader hdr)
- {
-  if (m_stationManager->HasHtSupported ())
+{
+  if (m_stationManager->HasHtSupported () || m_stationManager->HasVhtSupported ())
     {
       Mac48Address originator = hdr.GetAddr2 ();
       uint8_t tid = 0;
       if (hdr.IsQosData ())
-        tid = hdr.GetQosTid ();
+        {
+          tid = hdr.GetQosTid ();
+        }
       uint16_t seqNumber = hdr.GetSequenceNumber ();
       AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
       if (it != m_bAckAgreements.end ())
         {
           //Implement HT immediate Block Ack support for HT Delayed Block Ack is not added yet
           if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), seqNumber))
-            { 
+            {
               StoreMpduIfNeeded (packet, hdr);
-              if (!IsInWindow(hdr.GetSequenceNumber (), (*it).second.first.GetStartingSequence (), (*it).second.first.GetBufferSize ()))
+              if (!IsInWindow (hdr.GetSequenceNumber (), (*it).second.first.GetStartingSequence (), (*it).second.first.GetBufferSize ()))
                 {
-                  uint16_t delta = (seqNumber - (*it).second.first.GetWinEnd()+ 4096) % 4096;
+                  uint16_t delta = (seqNumber - (*it).second.first.GetWinEnd () + 4096) % 4096;
                   if (delta > 1)
                     {
-                     (*it).second.first.SetWinEnd (seqNumber);
-                     int16_t winEnd = (*it).second.first.GetWinEnd ();
-                     int16_t bufferSize = (*it).second.first.GetBufferSize ();
-                     uint16_t sum = ((uint16_t)(std::abs(winEnd - bufferSize + 1))) % 4096;
-                     (*it).second.first.SetStartingSequence (sum);
-                     RxCompleteBufferedPacketsWithSmallerSequence ((*it).second.first.GetStartingSequence (), originator, tid);
-                   } 
-               }
+                      (*it).second.first.SetWinEnd (seqNumber);
+                      int16_t winEnd = (*it).second.first.GetWinEnd ();
+                      int16_t bufferSize = (*it).second.first.GetBufferSize ();
+                      uint16_t sum = ((uint16_t)(std::abs (winEnd - bufferSize + 1))) % 4096;
+                      (*it).second.first.SetStartingSequence (sum);
+                      RxCompleteBufferedPacketsWithSmallerSequence ((*it).second.first.GetStartingSequenceControl (), originator, tid);
+                    }
+                }
               RxCompleteBufferedPacketsUntilFirstLost (originator, tid); //forwards up packets starting from winstart and set winstart to last +1
-             (*it).second.first.SetWinEnd(((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize()-1)%4096);  
-           }
+              (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096);
+            }
           return true;
-        }  
+        }
       return false;
     }
- else
-   return StoreMpduIfNeeded (packet,hdr);
+  else
+    {
+      return StoreMpduIfNeeded (packet, hdr);
+    }
 }
 
 bool
@@ -2168,7 +2361,6 @@
       for (; i != (*it).second.second.end ()
            && QosUtilsMapSeqControlToUniqueInteger ((*i).second.GetSequenceControl (), endSequence) < mappedSeqControl; i++)
         {
-          ;
         }
       (*it).second.second.insert (i, bufferedPacket);
 
@@ -2229,7 +2421,7 @@
   AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
   if (it != m_bAckAgreements.end ())
     {
-      RxCompleteBufferedPacketsWithSmallerSequence (it->second.first.GetStartingSequence (), originator, tid);
+      RxCompleteBufferedPacketsWithSmallerSequence (it->second.first.GetStartingSequenceControl (), originator, tid);
       RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
       m_bAckAgreements.erase (it);
 
@@ -2251,11 +2443,11 @@
       uint16_t guard = 0;
       if (last != (*it).second.second.end ())
         {
-          guard = (*it).second.second.begin ()->second.GetSequenceControl () & 0xfff0;
+          guard = (*it).second.second.begin ()->second.GetSequenceControl ();
         }
       BufferedPacketI i = (*it).second.second.begin ();
       for (; i != (*it).second.second.end ()
-           && QosUtilsMapSeqControlToUniqueInteger ((*i).second.GetSequenceNumber (), endSequence) < mappedStart;)
+           && QosUtilsMapSeqControlToUniqueInteger ((*i).second.GetSequenceControl (), endSequence) < mappedStart; )
         {
           if (guard == (*i).second.GetSequenceControl ())
             {
@@ -2269,13 +2461,13 @@
                   m_rxCallback ((*last).first, &(*last).second);
                   last++;
                   /* go to next packet */
-                  while (i != (*it).second.second.end () && ((guard >> 4) & 0x0fff) == (*i).second.GetSequenceNumber ())
+                  while (i != (*it).second.second.end () && guard == (*i).second.GetSequenceControl ())
                     {
                       i++;
                     }
                   if (i != (*it).second.second.end ())
                     {
-                      guard = (*i).second.GetSequenceControl () & 0xfff0;
+                      guard = (*i).second.GetSequenceControl ();
                       last = i;
                     }
                 }
@@ -2287,13 +2479,13 @@
           else
             {
               /* go to next packet */
-              while (i != (*it).second.second.end () && ((guard >> 4) & 0x0fff) == (*i).second.GetSequenceNumber ())
+              while (i != (*it).second.second.end () && guard == (*i).second.GetSequenceControl ())
                 {
                   i++;
                 }
               if (i != (*it).second.second.end ())
                 {
-                  guard = (*i).second.GetSequenceControl () & 0xfff0;
+                  guard = (*i).second.GetSequenceControl ();
                   last = i;
                 }
             }
@@ -2308,9 +2500,7 @@
   AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
   if (it != m_bAckAgreements.end ())
     {
-      uint16_t startingSeqCtrl = ((*it).second.first.GetStartingSequence () << 4) & 0xfff0;
-      uint16_t guard = startingSeqCtrl;
-
+      uint16_t guard = (*it).second.first.GetStartingSequenceControl ();
       BufferedPacketI lastComplete = (*it).second.second.begin ();
       BufferedPacketI i = (*it).second.second.begin ();
       for (; i != (*it).second.second.end () && guard == (*i).second.GetSequenceControl (); i++)
@@ -2327,7 +2517,7 @@
             }
           guard = (*i).second.IsMoreFragments () ? (guard + 1) : ((guard + 16) & 0xfff0);
         }
-      (*it).second.first.SetStartingSequence ((guard >> 4) & 0x0fff);
+      (*it).second.first.SetStartingSequenceControl (guard);
       /* All packets already forwarded to WifiMac must be removed from buffer:
       [begin (), lastComplete) */
       (*it).second.second.erase ((*it).second.second.begin (), lastComplete);
@@ -2392,13 +2582,18 @@
   packet->AddTrailer (fcs);
   WifiPreamble preamble;
   if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
-    preamble = WIFI_PREAMBLE_HT_MF;
+    {
+      preamble = WIFI_PREAMBLE_HT_MF;
+    }
   else
-    preamble = WIFI_PREAMBLE_LONG;
+    {
+      preamble = WIFI_PREAMBLE_LONG;
+    }
   ForwardDown (packet, &hdr, blockAckReqTxVector, preamble);
   m_currentPacket = 0;
 }
-void 
+
+void
 MacLow::SendBlockAckAfterAmpdu (uint8_t tid, Mac48Address originator, Time duration, WifiTxVector blockAckReqTxVector)
 {
   NS_LOG_FUNCTION (this);
@@ -2415,7 +2610,7 @@
   immediate = (*it).second.first.IsImmediateBlockAck ();
   blockAck.SetType (COMPRESSED_BLOCK_ACK);
   NS_LOG_DEBUG ("Got Implicit block Ack Req with seq " << seqNumber);
-  (*i).second.FillBlockAckBitmap (&blockAck);  
+  (*i).second.FillBlockAckBitmap (&blockAck);
 
   SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqTxVector.GetMode  ());
 }
@@ -2450,23 +2645,23 @@
           (*i).second.FillBlockAckBitmap (&blockAck);
           NS_LOG_DEBUG ("Got block Ack Req with seq " << reqHdr.GetStartingSequence ());
 
-          if (!m_stationManager->HasHtSupported())
+          if (!m_stationManager->HasHtSupported () && !m_stationManager->HasVhtSupported ())
             {
               /* All packets with smaller sequence than starting sequence control must be passed up to Wifimac
                * See 9.10.3 in IEEE 802.11e standard.
                */
-              RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid);
+              RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequenceControl (), originator, tid);
               RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
             }
           else
             {
-              if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence(), reqHdr.GetStartingSequence ()))
-                { 
-                  (*it).second.first.SetStartingSequence(reqHdr.GetStartingSequence ());
-                  (*it).second.first.SetWinEnd(((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize()-1) % 4096);
-                  RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid);
+              if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), reqHdr.GetStartingSequence ()))
+                {
+                  (*it).second.first.SetStartingSequence (reqHdr.GetStartingSequence ());
+                  (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096);
+                  RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequenceControl (), originator, tid);
                   RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
-                  (*it).second.first.SetWinEnd(((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize()-1) % 4096);
+                  (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096);
                 }
             }
         }
@@ -2492,9 +2687,6 @@
       agreement.m_inactivityEvent.Cancel ();
       Time timeout = MicroSeconds (1024 * agreement.GetTimeout ());
       AcIndex ac = QosUtilsMapTidToAc (agreement.GetTid ());
-      //std::map<AcIndex, MacLowTransmissionListener*>::iterator it = m_edcaListeners.find (ac);
-      //NS_ASSERT (it != m_edcaListeners.end ());
-
       agreement.m_inactivityEvent = Simulator::Schedule (timeout,
                                                          &MacLowAggregationCapableTransmissionListener::BlockAckInactivityTimeout,
                                                          m_edcaListeners[ac],
@@ -2515,44 +2707,63 @@
   m_mpduAggregator = aggregator;
 }
 
+Ptr<MpduAggregator>
+MacLow::GetMpduAggregator (void)
+{
+  return m_mpduAggregator;
+}
+
 void
 MacLow::DeaggregateAmpduAndReceive (Ptr<Packet> aggregatedPacket, double rxSnr, WifiTxVector txVector, WifiPreamble preamble)
 {
   m_currentTxVector = txVector;
   AmpduTag ampdu;
   bool normalAck = false;
-  bool ampduSubframe = false;
-  if (aggregatedPacket->RemovePacketTag(ampdu))
+  bool ampduSubframe = false; //flag indicating the packet belongs to an A-MPDU and is not a VHT single MPDU
+  if (aggregatedPacket->RemovePacketTag (ampdu))
     {
       ampduSubframe = true;
-      MpduAggregator::DeaggregatedMpdus packets =  MpduAggregator::Deaggregate (aggregatedPacket);
+      MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (aggregatedPacket);
       MpduAggregator::DeaggregatedMpdusCI n = packets.begin ();
 
       WifiMacHeader firsthdr;
-      (*n).first->PeekHeader(firsthdr);
+      (*n).first->PeekHeader (firsthdr);
       NS_LOG_DEBUG ("duration/id=" << firsthdr.GetDuration ());
       NotifyNav ((*n).first, firsthdr, preamble);
+
+      bool vhtSingleMpdu = (*n).second.GetEof ();
+      if (vhtSingleMpdu == true)
+        {
+          //If the MPDU is sent as a VHT single MPDU (EOF=1 in A-MPDU subframe header), then the responder sends an ACK.
+          NS_LOG_DEBUG ("Receive VHT single MPDU");
+          ampduSubframe = false;
+        }
+
       if (firsthdr.GetAddr1 () == m_self)
         {
           m_receivedAtLeastOneMpdu = true;
           if (firsthdr.IsAck () || firsthdr.IsBlockAck () || firsthdr.IsBlockAckReq ())
+            {
               ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe);
+            }
           else if (firsthdr.IsData () || firsthdr.IsQosData ())
             {
-              NS_LOG_DEBUG ("Deaagregate packet with sequence=" << firsthdr.GetSequenceNumber ());
+              NS_LOG_DEBUG ("Deaggregate packet from " << firsthdr.GetAddr2 () << " with sequence=" << firsthdr.GetSequenceNumber ());
               ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe);
               if (firsthdr.IsQosAck ())
                 {
                   NS_LOG_DEBUG ("Normal Ack");
                   normalAck = true;
                 }
-            } 
+            }
           else
+            {
               NS_FATAL_ERROR ("Received A-MPDU with invalid first MPDU type");
+            }
         }
 
-      if (normalAck && (ampdu.GetNoOfMpdus () == 1))
-        { 
+      if (normalAck && (ampdu.GetNoOfMpdus () == 1) && !vhtSingleMpdu)
+        {
           //send block Ack
           if (firsthdr.IsBlockAckReq ())
             {
@@ -2561,52 +2772,73 @@
           uint8_t tid = firsthdr.GetQosTid ();
           AgreementsI it = m_bAckAgreements.find (std::make_pair (firsthdr.GetAddr2 (), tid));
           if (it != m_bAckAgreements.end ())
-            { 
+            {
               NS_ASSERT (m_sendAckEvent.IsExpired ());
               /* See section 11.5.3 in IEEE 802.11 for mean of this timer */
               ResetBlockAckInactivityTimerIfNeeded (it->second.first);
               NS_LOG_DEBUG ("rx A-MPDU/sendImmediateBlockAck from=" << firsthdr.GetAddr2 ());
               m_sendAckEvent = Simulator::Schedule (GetSifs (),
                                                     &MacLow::SendBlockAckAfterAmpdu, this,
-                                                    firsthdr.GetQosTid(),
+                                                    firsthdr.GetQosTid (),
                                                     firsthdr.GetAddr2 (),
                                                     firsthdr.GetDuration (),
                                                     txVector);
-            } 
+            }
           else
-            { 
+            {
               NS_LOG_DEBUG ("There's not a valid agreement for this block ack request.");
             }
           m_receivedAtLeastOneMpdu = false;
         }
     }
   else
-    {     
-          ReceiveOk (aggregatedPacket,rxSnr, txVector, preamble, ampduSubframe);
+    {
+      ReceiveOk (aggregatedPacket, rxSnr, txVector, preamble, ampduSubframe);
     }
 }
 
-bool 
-MacLow::StopMpduAggregation(Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const
+bool
+MacLow::StopMpduAggregation (Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const
 {
-    WifiPreamble preamble;
-    WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
-    if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
-        preamble = WIFI_PREAMBLE_HT_GF;
-    else //Block ACK following implicit BAR always use non-HT PPDU
-        preamble = WIFI_PREAMBLE_LONG;
-    
-    if (peekedPacket == 0)
-        return true;
-    
-    //An HT STA shall not transmit a PPDU that has a duration that is greater than aPPDUMaxTime (10 milliseconds)
-    if(m_phy->CalculateTxDuration (aggregatedPacket->GetSize () + peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, dataTxVector, preamble, m_phy->GetFrequency(), 0, 0) > MilliSeconds(10))
-        return true;
-    
-    if (!m_mpduAggregator->CanBeAggregated (peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, aggregatedPacket, size))
-        return true;
-    
-    return false;
+  WifiPreamble preamble;
+  WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
+  if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT)
+    {
+      preamble = WIFI_PREAMBLE_VHT;
+    }
+  else if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
+    {
+      preamble = WIFI_PREAMBLE_HT_GF;
+    }
+  else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
+    {
+      preamble = WIFI_PREAMBLE_HT_MF;
+    }
+  else
+    {
+      preamble = WIFI_PREAMBLE_LONG;
+    }
+
+  if (peekedPacket == 0)
+    {
+      NS_LOG_DEBUG ("no more packets in queue");
+      return true;
+    }
+
+  //An HT STA shall not transmit a PPDU that has a duration that is greater than aPPDUMaxTime (10 milliseconds)
+  if (m_phy->CalculateTxDuration (aggregatedPacket->GetSize () + peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, dataTxVector, preamble, m_phy->GetFrequency (), 0, 0) > MilliSeconds (10))
+    {
+      NS_LOG_DEBUG ("no more packets can be aggregated to satisfy PPDU <= aPPDUMaxTime");
+      return true;
+    }
+
+  if (!m_mpduAggregator->CanBeAggregated (peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, aggregatedPacket, size))
+    {
+      NS_LOG_DEBUG ("no more packets can be aggregated because the maximum A-MPDU size has been reached");
+      return true;
+    }
+
+  return false;
 }
 
 Ptr<Packet>
@@ -2616,27 +2848,28 @@
   bool isAmpdu = false;
   Ptr<Packet> newPacket, tempPacket;
   WifiMacHeader peekedHdr;
-  newPacket = packet->Copy();
+  newPacket = packet->Copy ();
+  Ptr<Packet> currentAggregatedPacket;
   //missing hdr.IsAck() since we have no means of knowing the Tid of the Ack yet
-  if (hdr.IsQosData() || hdr.IsBlockAck()|| hdr.IsBlockAckReq())
+  if (hdr.IsQosData () || hdr.IsBlockAck ()|| hdr.IsBlockAckReq ())
     {
       Time tstamp;
       uint8_t tid = GetTid (packet, hdr);
       Ptr<WifiMacQueue> queue;
       AcIndex ac = QosUtilsMapTidToAc (tid);
       //since a blockack agreement always preceeds mpdu aggregation there should always exist blockAck listener
-      std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt= m_edcaListeners.find(ac);
+      std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac);
       NS_ASSERT (listenerIt != m_edcaListeners.end ());
-      queue = listenerIt->second->GetQueue();
-      
-      if (!hdr.GetAddr1 ().IsBroadcast () && m_mpduAggregator!= 0)
+      queue = listenerIt->second->GetQueue ();
+
+      if (!hdr.GetAddr1 ().IsBroadcast () && m_mpduAggregator != 0)
         {
           //Have to make sure that their exist a block Ack agreement before sending an AMPDU (BlockAck Manager)
-          if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1(), tid))
+          if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1 (), tid))
             {
               /* here is performed mpdu aggregation */
               /* MSDU aggregation happened in edca if the user asked for it so m_currentPacket may contains a normal packet or a A-MSDU*/
-              Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
+              currentAggregatedPacket = Create<Packet> ();
               peekedHdr = hdr;
               uint16_t startingSequenceNumber = 0;
               uint16_t currentSequenceNumber = 0;
@@ -2646,31 +2879,31 @@
               int i = 0;
               Ptr<Packet> aggPacket = newPacket->Copy ();
 
-              if (!hdr.IsBlockAckReq())
+              if (!hdr.IsBlockAckReq ())
                 {
-                  if (!hdr.IsBlockAck())
+                  if (!hdr.IsBlockAck ())
                     {
-                       startingSequenceNumber = peekedHdr.GetSequenceNumber();
-                       peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
+                      startingSequenceNumber = peekedHdr.GetSequenceNumber ();
+                      peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
                     }
-                  currentSequenceNumber = peekedHdr.GetSequenceNumber();
+                  currentSequenceNumber = peekedHdr.GetSequenceNumber ();
                   newPacket->AddHeader (peekedHdr);
                   WifiMacTrailer fcs;
                   newPacket->AddTrailer (fcs);
 
-                  aggregated=m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
+                  aggregated = m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
 
                   if (aggregated)
                     {
-                      NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU, packet size = " << newPacket->GetSize ()<< ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
+                      NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber () << " to A-MPDU, packet size = " << newPacket->GetSize () << ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
                       i++;
                       m_sentMpdus++;
                       m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
                     }
-                } 
-              else if (hdr.IsBlockAckReq())
+                }
+              else if (hdr.IsBlockAckReq ())
                 {
-                  blockAckSize = packet->GetSize() + hdr.GetSize() + WIFI_MAC_FCS_LENGTH;
+                  blockAckSize = packet->GetSize () + hdr.GetSize () + WIFI_MAC_FCS_LENGTH;
                   qosPolicy = 3; //if the last subrame is block ack req then set ack policy of all frames to blockack
                   CtrlBAckRequestHeader blockAckReq;
                   packet->PeekHeader (blockAckReq);
@@ -2686,22 +2919,24 @@
                                                              WifiMacHeader::ADDR1,
                                                              hdr.GetAddr1 (), &tstamp);
                   currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
-                    
+
                   /* here is performed MSDU aggregation (two-level aggregation) */
                   if (peekedPacket != 0 && listenerIt->second->GetMsduAggregator () != 0)
                     {
-                       tempPacket = PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
-                       if (tempPacket != 0) //MSDU aggregation
-                         peekedPacket = tempPacket->Copy();
+                      tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
+                      if (tempPacket != 0)  //MSDU aggregation
+                        {
+                          peekedPacket = tempPacket->Copy ();
+                        }
                     }
                 }
               else
                 {
                   retry = true;
-                  currentSequenceNumber = peekedHdr.GetSequenceNumber(); 
+                  currentSequenceNumber = peekedHdr.GetSequenceNumber ();
                 }
 
-               while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopMpduAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize))
+              while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopMpduAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize))
                 {
                   //for now always send AMPDU with normal ACK
                   if (retry == false)
@@ -2711,15 +2946,19 @@
                       peekedHdr.SetFragmentNumber (0);
                       peekedHdr.SetNoMoreFragments ();
                       peekedHdr.SetNoRetry ();
-                    }                      
+                    }
                   if (qosPolicy == 0)
+                    {
                       peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
+                    }
                   else
+                    {
                       peekedHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
+                    }
 
                   newPacket = peekedPacket->Copy ();
                   Ptr<Packet> aggPacket = newPacket->Copy ();
-                 
+
                   newPacket->AddHeader (peekedHdr);
                   WifiMacTrailer fcs;
                   newPacket->AddTrailer (fcs);
@@ -2728,39 +2967,45 @@
                     {
                       m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
                       if (i == 1 && hdr.IsQosData ())
-                      {
-                        if (!m_txParams.MustSendRts ())
-                        {
-                           listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
-                        }
-                        else
                         {
-                          InsertInTxQueue (packet, hdr, tstamp);
+                          if (!m_txParams.MustSendRts ())
+                            {
+                              listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
+                            }
+                          else
+                            {
+                              InsertInTxQueue (packet, hdr, tstamp);
+                            }
                         }
-                      }
-                      NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU, packet size = " << newPacket->GetSize ()<< ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
+                      NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber () << " to A-MPDU, packet size = " << newPacket->GetSize () << ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
                       i++;
                       isAmpdu = true;
                       m_sentMpdus++;
                       if (!m_txParams.MustSendRts ())
-                      {
-                        listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
-                      }
+                        {
+                          listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
+                        }
                       else
-                      {
-                        InsertInTxQueue (peekedPacket, peekedHdr, tstamp);
-                      }
+                        {
+                          InsertInTxQueue (peekedPacket, peekedHdr, tstamp);
+                        }
                       if (retry)
-                          listenerIt->second->RemoveFromBaQueue(tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ());
+                        {
+                          listenerIt->second->RemoveFromBaQueue (tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ());
+                        }
                       else
+                        {
                           queue->Remove (peekedPacket);
+                        }
                       newPacket = 0;
                     }
                   else
+                    {
                       break;
+                    }
                   if (retry == true)
                     {
-                      peekedPacket = listenerIt->second->PeekNextPacketInBaQueue(peekedHdr, hdr.GetAddr1(), tid, &tstamp);
+                      peekedPacket = listenerIt->second->PeekNextPacketInBaQueue (peekedHdr, hdr.GetAddr1 (), tid, &tstamp);
                       if (peekedPacket == 0)
                         {
                           //I reached the first packet that I added to this A-MPDU
@@ -2771,17 +3016,21 @@
                             {
                               //find what will the sequence number be so that we don't send more than 64 packets apart
                               currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
-                              
+
                               if (listenerIt->second->GetMsduAggregator () != 0)
-                              {
-                                tempPacket = PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
-                                if (tempPacket != 0) //MSDU aggregation
-                                  peekedPacket = tempPacket->Copy();
-                              }
-                            }   
+                                {
+                                  tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
+                                  if (tempPacket != 0) //MSDU aggregation
+                                    {
+                                      peekedPacket = tempPacket->Copy ();
+                                    }
+                                }
+                            }
                         }
                       else
-                          currentSequenceNumber = peekedHdr.GetSequenceNumber();
+                        {
+                          currentSequenceNumber = peekedHdr.GetSequenceNumber ();
+                        }
                     }
                   else
                     {
@@ -2791,42 +3040,44 @@
                         {
                           //find what will the sequence number be so that we don't send more than 64 packets apart
                           currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
-                          
+
                           if (listenerIt->second->GetMsduAggregator () != 0 && IsInWindow (currentSequenceNumber, startingSequenceNumber, 64))
-                          {
-                            tempPacket = PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
-                            if (tempPacket != 0) //MSDU aggregation
-                              peekedPacket = tempPacket->Copy();
-                          }
-                        }   
+                            {
+                              tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
+                              if (tempPacket != 0) //MSDU aggregation
+                                {
+                                  peekedPacket = tempPacket->Copy ();
+                                }
+                            }
+                        }
                     }
                 }
+
               if (isAmpdu)
                 {
-                  if (hdr.IsBlockAckReq())
+                  if (hdr.IsBlockAckReq ())
                     {
-                      newPacket = packet->Copy();
+                      newPacket = packet->Copy ();
                       peekedHdr = hdr;
-                      Ptr<Packet> aggPacket = newPacket->Copy();
+                      Ptr<Packet> aggPacket = newPacket->Copy ();
                       m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
                       newPacket->AddHeader (peekedHdr);
                       WifiMacTrailer fcs;
                       newPacket->AddTrailer (fcs);
                       m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
                     }
-                  if (qosPolicy==0)
+                  if (qosPolicy == 0)
                     {
-                         listenerIt->second->CompleteTransfer(hdr.GetAddr1 (),tid);
+                      listenerIt->second->CompleteTransfer (hdr.GetAddr1 (), tid);
                     }
                   //Add packet tag
                   AmpduTag ampdutag;
                   ampdutag.SetAmpdu (true);
-                  ampdutag.SetNoOfMpdus(i);
+                  ampdutag.SetNoOfMpdus (i);
                   newPacket = currentAggregatedPacket;
-                  newPacket->AddPacketTag(ampdutag);
-                  currentAggregatedPacket = 0;
+                  newPacket->AddPacketTag (ampdutag);
                   NS_LOG_DEBUG ("tx unicast A-MPDU");
-                  listenerIt->second->SetAmpdu(true);
+                  listenerIt->second->SetAmpdu (true);
                 }
               else
                 {
@@ -2839,6 +3090,37 @@
                     }
                 }
             }
+          //VHT single MPDU operation
+          WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
+          if (!isAmpdu && dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT && hdr.IsQosData ())
+            {
+              peekedHdr = hdr;
+              peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
+
+              currentAggregatedPacket = Create<Packet> ();
+              m_mpduAggregator->AggregateVhtSingleMpdu (packet, currentAggregatedPacket);
+              m_aggregateQueue->Enqueue (packet, peekedHdr);
+              m_sentMpdus = 1;
+
+              if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1 (), tid))
+                {
+                  listenerIt->second->CompleteTransfer (peekedHdr.GetAddr1 (), tid);
+                }
+
+              //Add packet tag
+              AmpduTag ampdutag;
+              ampdutag.SetAmpdu (true);
+              ampdutag.SetNoOfMpdus (1);
+
+              newPacket = currentAggregatedPacket;
+              newPacket->AddHeader (peekedHdr);
+              WifiMacTrailer fcs;
+              newPacket->AddTrailer (fcs);
+              newPacket->AddPacketTag (ampdutag);
+
+              NS_LOG_DEBUG ("tx unicast VHT single MPDU with sequence number " << hdr.GetSequenceNumber ());
+              listenerIt->second->SetAmpdu (true);
+            }
         }
     }
   return newPacket;
@@ -2847,8 +3129,11 @@
 void
 MacLow::FlushAggregateQueue (void)
 {
-  NS_LOG_DEBUG("Flush aggregate queue");
-  m_aggregateQueue->Flush ();
+  if (m_aggregateQueue->GetSize () > 0)
+    {
+      NS_LOG_DEBUG ("Flush aggregate queue");
+      m_aggregateQueue->Flush ();
+    }
   m_txPackets.clear ();
 }
 
@@ -2856,7 +3141,7 @@
 MacLow::InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp)
 {
   Item item;
-  
+
   item.packet = packet;
   item.hdr = hdr;
   item.timestamp = tStamp;
@@ -2865,7 +3150,7 @@
 }
 
 Ptr<Packet>
-MacLow::PerformMsduAggregation(Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize)
+MacLow::PerformMsduAggregation (Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize)
 {
   bool msduAggregation = false;
   bool isAmsdu = false;
@@ -2874,48 +3159,52 @@
 
   Ptr<WifiMacQueue> queue;
   AcIndex ac = QosUtilsMapTidToAc (GetTid (packet, *hdr));
-  std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt= m_edcaListeners.find(ac);
+  std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac);
   NS_ASSERT (listenerIt != m_edcaListeners.end ());
-  queue = listenerIt->second->GetQueue();
-    
+  queue = listenerIt->second->GetQueue ();
+
+  Ptr<const Packet> peekedPacket = queue->DequeueByTidAndAddress (hdr, hdr->GetQosTid (),
+                                                                  WifiMacHeader::ADDR1, hdr->GetAddr1 ());
+
   listenerIt->second->GetMsduAggregator ()->Aggregate (packet, currentAmsduPacket,
-                                               listenerIt->second->GetSrcAddressForAggregation (*hdr),
-                                               listenerIt->second->GetDestAddressForAggregation (*hdr));
+                                                       listenerIt->second->GetSrcAddressForAggregation (*hdr),
+                                                       listenerIt->second->GetDestAddressForAggregation (*hdr));
 
-  Ptr<const Packet> peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (),
-                                                               WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
+  peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (),
+                                             WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
   while (peekedPacket != 0)
-  {
-    tempPacket = currentAmsduPacket;
-   
-    msduAggregation = listenerIt->second->GetMsduAggregator ()->Aggregate (peekedPacket, tempPacket,
-                                                        listenerIt->second->GetSrcAddressForAggregation (*hdr),
-                                                        listenerIt->second->GetDestAddressForAggregation (*hdr));
-      
-    if (msduAggregation && !StopMpduAggregation (tempPacket, *hdr, currentAmpduPacket, blockAckSize))
-    {
-      isAmsdu = true;
-      currentAmsduPacket = tempPacket;
-      queue->Remove (peekedPacket);
-    }
-    else
     {
-      break;
+      tempPacket = currentAmsduPacket;
+
+      msduAggregation = listenerIt->second->GetMsduAggregator ()->Aggregate (peekedPacket, tempPacket,
+                                                                             listenerIt->second->GetSrcAddressForAggregation (*hdr),
+                                                                             listenerIt->second->GetDestAddressForAggregation (*hdr));
+
+      if (msduAggregation && !StopMpduAggregation (tempPacket, *hdr, currentAmpduPacket, blockAckSize))
+        {
+          isAmsdu = true;
+          currentAmsduPacket = tempPacket;
+          queue->Remove (peekedPacket);
+        }
+      else
+        {
+          break;
+        }
+      peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
     }
-    peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
-  }
-  
+
   if (isAmsdu)
-  {
-    NS_LOG_DEBUG ("A-MSDU with size = " << currentAmsduPacket->GetSize ());
-    hdr->SetQosAmsdu ();
-    hdr->SetAddr3 (GetBssid ());
-    return currentAmsduPacket;
-  }
+    {
+      NS_LOG_DEBUG ("A-MSDU with size = " << currentAmsduPacket->GetSize ());
+      hdr->SetQosAmsdu ();
+      hdr->SetAddr3 (GetBssid ());
+      return currentAmsduPacket;
+    }
   else
-  {
-    return 0;
-  }
+    {
+      queue->PushFront (packet, *hdr);
+      return 0;
+    }
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/mac-low.h ns-3.24/src/wifi/model/mac-low.h
--- ns-3.23/src/wifi/model/mac-low.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mac-low.h	2015-09-15 11:18:44.000000000 -0700
@@ -130,10 +130,10 @@
    * down the stack to the PHY.
    */
   virtual void Cancel (void) = 0;
-  /** 
+  /**
    * Invoked upon the end of the transmission of a frame that does not
    * require an ACK (e.g., broadcast and multicast frames).
-   * 
+   *
    */
   virtual void EndTxNoAck (void) = 0;
 };
@@ -216,14 +216,14 @@
    * \param address address of peer station involved in block ack mechanism.
    * \param tid traffic ID of transmitted packet.
    *
-   * Calls CompleteAmpduTransfer that resets the status of OriginatorBlockAckAgreement after the transfer 
+   * Calls CompleteAmpduTransfer that resets the status of OriginatorBlockAckAgreement after the transfer
    * of an A-MPDU with ImmediateBlockAck policy (i.e. no BAR is scheduled)
    */
   virtual void CompleteTransfer (Mac48Address address, uint8_t tid);
   virtual void SetAmpdu (bool ampdu);
   /**
-   * This function stores an MPDU (part of an A-MPDU) in blockackagreement (i.e. the sender is waiting 
-   * for a blockack containing the sequence number of this MPDU). 
+   * This function stores an MPDU (part of an A-MPDU) in blockackagreement (i.e. the sender is waiting
+   * for a blockack containing the sequence number of this MPDU).
    * It also calls NotifyMpdu transmission that updates the status of OriginatorBlockAckAgreement.
    */
   virtual void CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp);
@@ -241,7 +241,7 @@
    * \return the next sequence number
    */
   virtual uint16_t PeekNextSequenceNumberfor (WifiMacHeader *hdr);
-  /* 
+  /*
    * Peek in retransmit queue and get the next packet without removing it from the queue
    */
   virtual Ptr<const Packet> PeekNextPacketInBaQueue (WifiMacHeader &header, Mac48Address recipient, uint8_t tid, Time *timestamp);
@@ -452,7 +452,6 @@
   uint32_t GetNextPacketSize (void) const;
 
 private:
-
   friend std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters &params);
   uint32_t m_nextSize;
   enum
@@ -497,6 +496,12 @@
   virtual ~MacLow ();
 
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+
+  /**
    * Set up WifiPhy associated with this MacLow.
    *
    * \param phy WifiPhy associated with this MacLow
@@ -525,6 +530,11 @@
    */
   void SetMpduAggregator (Ptr<MpduAggregator> aggregator);
   /**
+   *
+   * \return the attached MpduAggregator
+   */
+  Ptr<MpduAggregator> GetMpduAggregator (void);
+  /**
    * Set MAC address of this MacLow.
    *
    * \param ad Mac48Address of this MacLow
@@ -704,9 +714,9 @@
    * of transmission events.
    */
   virtual void StartTransmission (Ptr<const Packet> packet,
-                          const WifiMacHeader* hdr,
-                          MacLowTransmissionParameters parameters,
-                          MacLowTransmissionListener *listener);
+                                  const WifiMacHeader* hdr,
+                                  MacLowTransmissionParameters parameters,
+                                  MacLowTransmissionListener *listener);
 
   /**
    * \param packet packet received
@@ -782,7 +792,7 @@
    * \return the A-MPDU packet if aggregation is successfull, the input packet otherwise
    *
    * This function adds the packets that will be added to an A-MPDU to an aggregate queue
-   * 
+   *
    */
   Ptr<Packet> AggregateToAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr);
   /**
@@ -792,7 +802,7 @@
    * \param preamble type of preamble used for the packet received
    *
    * This function de-aggregates an A-MPDU and decide if each MPDU is received correctly or not
-   * 
+   *
    */
   void DeaggregateAmpduAndReceive (Ptr<Packet> aggregatedPacket, double rxSnr, WifiTxVector txVector, WifiPreamble preamble);
   /**
@@ -803,7 +813,7 @@
    * \return false if the given packet can be added to an A-MPDU, true otherwise
    *
    * This function decides if a given packet can be added to an A-MPDU or not
-   * 
+   *
    */
   bool StopMpduAggregation (Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const;
   /**
@@ -881,8 +891,10 @@
    * \param hdr
    * \param txVector
    * \param preamble
+   * \param packetType
+   * \param mpduReferenceNumber
    */
-  void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType);
+  void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber);
   /**
    * Return a TXVECTOR for the RTS frame given the destination.
    * The function consults WifiRemoteStationManager, which controls the rate
@@ -1007,7 +1019,7 @@
    *         false otherwise
    */
   bool NeedCtsToSelf (void);
-  
+
   Time CalculateOverallTxTime (Ptr<const Packet> packet,
                                const WifiMacHeader* hdr,
                                const MacLowTransmissionParameters &params) const;
@@ -1144,20 +1156,20 @@
    * \param dataTxVector
    */
   void StartDataTxTimers (WifiTxVector dataTxVector);
-    
+
   virtual void DoDispose (void);
-    
+
   /**
    * \param packet packet to check
    * \param hdr 802.11 header for packet to check
    *
    * Returns Tid of different packet types
    */
-  uint8_t GetTid(Ptr<const Packet> packet, const WifiMacHeader hdr) const;
+  uint8_t GetTid (Ptr<const Packet> packet, const WifiMacHeader hdr) const;
   /**
    * \param originator Address of peer participating in Block Ack mechanism.
    * \param tid TID for which Block Ack was created.
-   * \param seq Starting sequence
+   * \param seq Starting sequence control
    *
    * This function forward up all completed "old" packets with sequence number
    * smaller than <i>seq</i>. All comparison are performed circularly mod 4096.
@@ -1212,7 +1224,7 @@
    * block ack agreement and creates block ack bitmap on a received packets basis.
    */
   void SendBlockAckAfterAmpdu (uint8_t tid, Mac48Address originator,
-                                          Time duration, WifiTxVector blockAckReqTxVector);
+                               Time duration, WifiTxVector blockAckReqTxVector);
   /**
    * This method creates block ack frame with header equals to <i>blockAck</i> and start its transmission.
    *
@@ -1270,13 +1282,12 @@
    *
    * \return the aggregate if MSDU aggregation succeeded, 0 otherwise
    */
-  Ptr<Packet> PerformMsduAggregation(Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize);
-
+  Ptr<Packet> PerformMsduAggregation (Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize);
 
   Ptr<WifiPhy> m_phy; //!< Pointer to WifiPhy (actually send/receives frames)
   Ptr<WifiRemoteStationManager> m_stationManager; //!< Pointer to WifiRemoteStationManager (rate control)
   MacLowRxCallback m_rxCallback; //!< Callback to pass packet up
-    
+
   /**
    * A struct for packet, Wifi header, and timestamp.
    */
@@ -1362,8 +1373,9 @@
   WifiTxVector m_currentTxVector;     //!< TXVECTOR used for the current packet transmission
   bool m_receivedAtLeastOneMpdu;      //!< Flag whether an MPDU has already been successfully received while receiving an A-MPDU
   std::vector<Item> m_txPackets;      //!< Contain temporary items to be sent with the next A-MPDU transmission, once RTS/CTS exchange has succeeded. It is not used in other cases.
+  uint32_t m_mpduReferenceNumber;       //!< A-MPDU reference number to identify all subframes belonging to the same A-MPDU
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* MAC_LOW_H */
diff -Naur ns-3.23/src/wifi/model/mac-rx-middle.cc ns-3.24/src/wifi/model/mac-rx-middle.cc
--- ns-3.23/src/wifi/model/mac-rx-middle.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mac-rx-middle.cc	2015-09-15 11:18:44.000000000 -0700
@@ -20,7 +20,6 @@
 
 #include "mac-rx-middle.h"
 #include "wifi-mac-header.h"
-
 #include "ns3/assert.h"
 #include "ns3/log.h"
 #include "ns3/packet.h"
@@ -51,6 +50,8 @@
   bool m_defragmenting;
   uint16_t m_lastSequenceControl;
   Fragments m_fragments;
+
+
 public:
   OriginatorRxStatus ()
   {
@@ -91,6 +92,7 @@
    * and return the full packet.
    *
    * \param packet the last fragment
+   *
    * \return the fully reconstructed packet
    */
   Ptr<Packet> AccumulateLastFragment (Ptr<const Packet> packet)
@@ -122,6 +124,7 @@
    * in order.
    *
    * \param sequenceControl the raw sequence control
+   *
    * \return true if the sequence control is in order,
    *         false otherwise
    */
@@ -150,12 +153,11 @@
    * Set the last sequence control we received.
    *
    * \param sequenceControl the last sequence control we received
-   */ 
+   */
   void SetSequenceControl (uint16_t sequenceControl)
   {
     m_lastSequenceControl = sequenceControl;
   }
-
 };
 
 
@@ -316,7 +318,7 @@
       NS_LOG_DEBUG ("Sequence numbers have looped back. last recorded=" << originator->GetLastSequenceControl () <<
                     " currently seen=" << hdr->GetSequenceControl ());
     }
-  // filter duplicates.
+  //filter duplicates.
   if (IsDuplicate (hdr, originator))
     {
       NS_LOG_DEBUG ("duplicate from=" << hdr->GetAddr2 () <<
@@ -339,4 +341,4 @@
   m_callback (agregate, hdr);
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/mac-rx-middle.h ns-3.24/src/wifi/model/mac-rx-middle.h
--- ns-3.23/src/wifi/model/mac-rx-middle.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mac-rx-middle.h	2015-09-15 11:18:44.000000000 -0700
@@ -56,6 +56,8 @@
   void SetForwardCallback (ForwardUpCallback callback);
 
   void Receive (Ptr<Packet> packet, const WifiMacHeader *hdr);
+
+
 private:
   friend class MacRxMiddleTest;
   /**
@@ -64,6 +66,7 @@
    * The method creates a new OriginatorRxStatus if one is not already presented.
    *
    * \param hdr
+   *
    * \return OriginatorRxStatus
    */
   OriginatorRxStatus* Lookup (const WifiMacHeader* hdr);
@@ -73,6 +76,7 @@
    *
    * \param hdr
    * \param originator
+   *
    * \return true if we already received the packet previously,
    *         false otherwise
    */
@@ -88,6 +92,7 @@
    * \param packet
    * \param hdr
    * \param originator
+   *
    * \return a packet if the packet is successfully reassembled (or not a fragment),
    *         0 if we failed to reassemble the packet (e.g. missing fragments/out-of-order).
    */
@@ -110,12 +115,12 @@
    * typedef for an interator for QosOriginators
    */
   typedef std::map <std::pair<Mac48Address, uint8_t>, OriginatorRxStatus *, std::less<std::pair<Mac48Address,uint8_t> > >::iterator QosOriginatorsI;
+
   Originators m_originatorStatus;
   QosOriginators m_qosOriginatorStatus;
   ForwardUpCallback m_callback;
 };
 
-} // namespace ns3
-
+} //namespace ns3
 
 #endif /* MAC_RX_MIDDLE_H */
diff -Naur ns-3.23/src/wifi/model/mac-tx-middle.cc ns-3.24/src/wifi/model/mac-tx-middle.cc
--- ns-3.23/src/wifi/model/mac-tx-middle.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mac-tx-middle.cc	2015-09-15 11:18:44.000000000 -0700
@@ -16,13 +16,12 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
- * Author: Ghada Badawy <gbadawy@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
+ *          Ghada Badawy <gbadawy@gmail.com>
  */
 
 #include "ns3/assert.h"
-
 #include "mac-tx-middle.h"
 #include "wifi-mac-header.h"
 
@@ -78,6 +77,7 @@
     }
   return retval;
 }
+
 uint16_t
 MacTxMiddle::PeekNextSequenceNumberfor (const WifiMacHeader *hdr)
 {
@@ -117,4 +117,4 @@
   return seq;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/mac-tx-middle.h ns-3.24/src/wifi/model/mac-tx-middle.h
--- ns-3.23/src/wifi/model/mac-tx-middle.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mac-tx-middle.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,7 +17,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ *         Mirko Banchi <mk.banchi@gmail.com>
  */
 
 #ifndef MAC_TX_MIDDLE_H
@@ -50,7 +50,7 @@
    */
   uint16_t GetNextSequenceNumberfor (const WifiMacHeader *hdr);
   /**
-   * Return the next sequence number for the Traffic ID and destination, but do not pick it (i.e. the current sequence number remains unchanged). 
+   * Return the next sequence number for the Traffic ID and destination, but do not pick it (i.e. the current sequence number remains unchanged).
    * This functions is used for A-MPDU aggregation.
    *
    * \param hdr Wi-Fi header
@@ -66,11 +66,12 @@
    */
   uint16_t GetNextSeqNumberByTidAndAddress (uint8_t tid, Mac48Address addr) const;
 
+
 private:
   std::map <Mac48Address,uint16_t*> m_qosSequences;
   uint16_t m_sequence;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* MAC_TX_MIDDLE_H */
diff -Naur ns-3.23/src/wifi/model/mgt-headers.cc ns-3.24/src/wifi/model/mgt-headers.cc
--- ns-3.23/src/wifi/model/mgt-headers.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mgt-headers.cc	2015-09-15 11:18:44.000000000 -0700
@@ -16,9 +16,11 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
+
+#include <sstream>
 #include "mgt-headers.h"
 #include "ns3/simulator.h"
 #include "ns3/assert.h"
@@ -40,32 +42,49 @@
 {
   m_ssid = ssid;
 }
+
 Ssid
 MgtProbeRequestHeader::GetSsid (void) const
 {
   return m_ssid;
 }
+
 void
 MgtProbeRequestHeader::SetSupportedRates (SupportedRates rates)
 {
   m_rates = rates;
 }
-void 
-MgtProbeRequestHeader::SetHtCapabilities(HtCapabilities htcapabilities)
+
+void
+MgtProbeRequestHeader::SetHtCapabilities (HtCapabilities htcapabilities)
 {
-  m_htCapability=htcapabilities;
+  m_htCapability = htcapabilities;
 }
 
-HtCapabilities 
+HtCapabilities
 MgtProbeRequestHeader::GetHtCapabilities (void) const
 {
-   return  m_htCapability;
+  return m_htCapability;
+}
+
+void
+MgtProbeRequestHeader::SetVhtCapabilities (VhtCapabilities vhtcapabilities)
+{
+  m_vhtCapability = vhtcapabilities;
+}
+
+VhtCapabilities
+MgtProbeRequestHeader::GetVhtCapabilities (void) const
+{
+  return m_vhtCapability;
 }
+
 SupportedRates
 MgtProbeRequestHeader::GetSupportedRates (void) const
 {
   return m_rates;
 }
+
 uint32_t
 MgtProbeRequestHeader::GetSerializedSize (void) const
 {
@@ -73,9 +92,11 @@
   size += m_ssid.GetSerializedSize ();
   size += m_rates.GetSerializedSize ();
   size += m_rates.extended.GetSerializedSize ();
-  size += m_htCapability.GetSerializedSize();
+  size += m_htCapability.GetSerializedSize ();
+  size += m_vhtCapability.GetSerializedSize ();
   return size;
 }
+
 TypeId
 MgtProbeRequestHeader::GetTypeId (void)
 {
@@ -86,18 +107,22 @@
   ;
   return tid;
 }
+
 TypeId
 MgtProbeRequestHeader::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
+
 void
 MgtProbeRequestHeader::Print (std::ostream &os) const
 {
   os << "ssid=" << m_ssid << ", "
      << "rates=" << m_rates << ", "
-     << "HT Capabilities=" << m_htCapability;
+     << "HT Capabilities=" << m_htCapability << " , "
+     << "VHT Capabilities= " << m_vhtCapability;
 }
+
 void
 MgtProbeRequestHeader::Serialize (Buffer::Iterator start) const
 {
@@ -105,8 +130,10 @@
   i = m_ssid.Serialize (i);
   i = m_rates.Serialize (i);
   i = m_rates.extended.Serialize (i);
-   i = m_htCapability.Serialize(i);
+  i = m_htCapability.Serialize (i);
+  i = m_vhtCapability.Serialize (i);
 }
+
 uint32_t
 MgtProbeRequestHeader::Deserialize (Buffer::Iterator start)
 {
@@ -115,6 +142,7 @@
   i = m_rates.Deserialize (i);
   i = m_rates.extended.DeserializeIfPresent (i);
   i = m_htCapability.DeserializeIfPresent (i);
+  i = m_vhtCapability.DeserializeIfPresent (i);
   return i.GetDistanceFrom (start);
 }
 
@@ -128,55 +156,77 @@
 MgtProbeResponseHeader::MgtProbeResponseHeader ()
 {
 }
+
 MgtProbeResponseHeader::~MgtProbeResponseHeader ()
 {
 }
+
 uint64_t
 MgtProbeResponseHeader::GetTimestamp ()
 {
   return m_timestamp;
 }
+
 Ssid
 MgtProbeResponseHeader::GetSsid (void) const
 {
   return m_ssid;
 }
+
 uint64_t
 MgtProbeResponseHeader::GetBeaconIntervalUs (void) const
 {
   return m_beaconInterval;
 }
+
 SupportedRates
 MgtProbeResponseHeader::GetSupportedRates (void) const
 {
   return m_rates;
 }
-void 
-MgtProbeResponseHeader::SetHtCapabilities(HtCapabilities htcapabilities)
+
+void
+MgtProbeResponseHeader::SetHtCapabilities (HtCapabilities htcapabilities)
 {
-  m_htCapability=htcapabilities;
+  m_htCapability = htcapabilities;
 }
 
-HtCapabilities 
+HtCapabilities
 MgtProbeResponseHeader::GetHtCapabilities (void) const
 {
-   return  m_htCapability;
+  return m_htCapability;
+}
+
+void
+MgtProbeResponseHeader::SetVhtCapabilities (VhtCapabilities vhtcapabilities)
+{
+  m_vhtCapability = vhtcapabilities;
+}
+
+VhtCapabilities
+MgtProbeResponseHeader::GetVhtCapabilities (void) const
+{
+  return m_vhtCapability;
 }
+
 void
 MgtProbeResponseHeader::SetSsid (Ssid ssid)
 {
   m_ssid = ssid;
 }
+
 void
 MgtProbeResponseHeader::SetBeaconIntervalUs (uint64_t us)
 {
   m_beaconInterval = us;
 }
+
 void
 MgtProbeResponseHeader::SetSupportedRates (SupportedRates rates)
 {
   m_rates = rates;
 }
+
 TypeId
 MgtProbeResponseHeader::GetTypeId (void)
 {
@@ -187,56 +237,62 @@
   ;
   return tid;
 }
+
 TypeId
 MgtProbeResponseHeader::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
+
 uint32_t
 MgtProbeResponseHeader::GetSerializedSize (void) const
 {
   uint32_t size = 0;
-  size += 8; // timestamp
-  size += 2; // beacon interval
+  size += 8; //timestamp
+  size += 2; //beacon interval
   size += m_capability.GetSerializedSize ();
   size += m_ssid.GetSerializedSize ();
   size += m_rates.GetSerializedSize ();
-  //size += 3; // ds parameter set
+  //size += 3; //ds parameter set
   size += m_rates.extended.GetSerializedSize ();
-  size += m_htCapability.GetSerializedSize();
-  // xxx
+  size += m_htCapability.GetSerializedSize ();
+  size += m_vhtCapability.GetSerializedSize ();
   return size;
 }
+
 void
 MgtProbeResponseHeader::Print (std::ostream &os) const
 {
   os << "ssid=" << m_ssid << ", "
      << "rates=" << m_rates << ", "
-     << "HT Capabilities=" << m_htCapability;
+     << "HT Capabilities=" << m_htCapability << " , "
+     << "VHT Capabilities= " << m_vhtCapability;
 }
+
 void
 MgtProbeResponseHeader::Serialize (Buffer::Iterator start) const
 {
-  // timestamp
-  // beacon interval
-  // capability information
-  // ssid
-  // supported rates
-  // fh parameter set
-  // ds parameter set
-  // cf parameter set
-  // ibss parameter set
-  //XXX
+  //timestamp
+  //beacon interval
+  //capability information
+  //ssid
+  //supported rates
+  //fh parameter set
+  //ds parameter set
+  //cf parameter set
+  //ibss parameter set
   Buffer::Iterator i = start;
   i.WriteHtolsbU64 (Simulator::Now ().GetMicroSeconds ());
   i.WriteHtolsbU16 (m_beaconInterval / 1024);
   i = m_capability.Serialize (i);
   i = m_ssid.Serialize (i);
   i = m_rates.Serialize (i);
-  //i.WriteU8 (0, 3); // ds parameter set.
+  //i.WriteU8 (0, 3); //ds parameter set.
   i = m_rates.extended.Serialize (i);
-  i = m_htCapability.Serialize(i);
+  i = m_htCapability.Serialize (i);
+  i = m_vhtCapability.Serialize (i);
 }
+
 uint32_t
 MgtProbeResponseHeader::Deserialize (Buffer::Iterator start)
 {
@@ -247,12 +303,33 @@
   i = m_capability.Deserialize (i);
   i = m_ssid.Deserialize (i);
   i = m_rates.Deserialize (i);
-  //i.Next (3); // ds parameter set
+  //i.Next (3); //ds parameter set
   i = m_rates.extended.DeserializeIfPresent (i);
   i = m_htCapability.DeserializeIfPresent (i);
+  i = m_vhtCapability.DeserializeIfPresent (i);
   return i.GetDistanceFrom (start);
 }
 
+
+/***********************************************************
+ *          Beacons
+ ***********************************************************/
+
+NS_OBJECT_ENSURE_REGISTERED (MgtBeaconHeader);
+
+/* static */
+TypeId
+MgtBeaconHeader::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::MgtBeaconHeader")
+    .SetParent<MgtProbeResponseHeader> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<MgtBeaconHeader> ()
+  ;
+  return tid;
+}
+
+
 /***********************************************************
  *          Assoc Request
  ***********************************************************/
@@ -263,6 +340,7 @@
   : m_listenInterval (0)
 {
 }
+
 MgtAssocRequestHeader::~MgtAssocRequestHeader ()
 {
 }
@@ -272,36 +350,55 @@
 {
   m_ssid = ssid;
 }
+
 void
 MgtAssocRequestHeader::SetSupportedRates (SupportedRates rates)
 {
   m_rates = rates;
 }
-void 
-MgtAssocRequestHeader::SetHtCapabilities(HtCapabilities htcapabilities)
+
+void
+MgtAssocRequestHeader::SetHtCapabilities (HtCapabilities htcapabilities)
 {
   m_htCapability = htcapabilities;
 }
+
 void
 MgtAssocRequestHeader::SetListenInterval (uint16_t interval)
 {
   m_listenInterval = interval;
 }
-HtCapabilities 
+
+void
+MgtAssocRequestHeader::SetVhtCapabilities (VhtCapabilities vhtcapabilities)
+{
+  m_vhtCapability = vhtcapabilities;
+}
+
+VhtCapabilities
+MgtAssocRequestHeader::GetVhtCapabilities (void) const
+{
+  return m_vhtCapability;
+}
+
+HtCapabilities
 MgtAssocRequestHeader::GetHtCapabilities (void) const
 {
-   return  m_htCapability;
+  return m_htCapability;
 }
+
 Ssid
 MgtAssocRequestHeader::GetSsid (void) const
 {
   return m_ssid;
 }
+
 SupportedRates
 MgtAssocRequestHeader::GetSupportedRates (void) const
 {
   return m_rates;
 }
+
 uint16_t
 MgtAssocRequestHeader::GetListenInterval (void) const
 {
@@ -318,11 +415,13 @@
   ;
   return tid;
 }
+
 TypeId
 MgtAssocRequestHeader::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
+
 uint32_t
 MgtAssocRequestHeader::GetSerializedSize (void) const
 {
@@ -331,17 +430,21 @@
   size += 2;
   size += m_ssid.GetSerializedSize ();
   size += m_rates.GetSerializedSize ();
-  size += m_htCapability.GetSerializedSize();
+  size += m_htCapability.GetSerializedSize ();
+  size += m_vhtCapability.GetSerializedSize ();
   size += m_rates.extended.GetSerializedSize ();
   return size;
 }
+
 void
 MgtAssocRequestHeader::Print (std::ostream &os) const
 {
   os << "ssid=" << m_ssid << ", "
-     << "rates=" << m_rates<< ", "
-     << "HT Capabilities=" << m_htCapability;
+     << "rates=" << m_rates << ", "
+     << "HT Capabilities=" << m_htCapability << " , "
+     << "VHT Capabilities= " << m_vhtCapability;
 }
+
 void
 MgtAssocRequestHeader::Serialize (Buffer::Iterator start) const
 {
@@ -351,8 +454,10 @@
   i = m_ssid.Serialize (i);
   i = m_rates.Serialize (i);
   i = m_rates.extended.Serialize (i);
-  i = m_htCapability.Serialize(i);
+  i = m_htCapability.Serialize (i);
+  i = m_vhtCapability.Serialize (i);
 }
+
 uint32_t
 MgtAssocRequestHeader::Deserialize (Buffer::Iterator start)
 {
@@ -363,9 +468,11 @@
   i = m_rates.Deserialize (i);
   i = m_rates.extended.DeserializeIfPresent (i);
   i = m_htCapability.DeserializeIfPresent (i);
+  i = m_vhtCapability.DeserializeIfPresent (i);
   return i.GetDistanceFrom (start);
 }
 
+
 /***********************************************************
  *          Assoc Response
  ***********************************************************/
@@ -376,6 +483,7 @@
   : m_aid (0)
 {
 }
+
 MgtAssocResponseHeader::~MgtAssocResponseHeader ()
 {
 }
@@ -385,32 +493,49 @@
 {
   return m_code;
 }
+
 SupportedRates
 MgtAssocResponseHeader::GetSupportedRates (void)
 {
   return m_rates;
 }
+
 void
 MgtAssocResponseHeader::SetStatusCode (StatusCode code)
 {
   m_code = code;
 }
+
 void
 MgtAssocResponseHeader::SetSupportedRates (SupportedRates rates)
 {
   m_rates = rates;
 }
-void 
-MgtAssocResponseHeader::SetHtCapabilities(HtCapabilities htcapabilities)
+
+void
+MgtAssocResponseHeader::SetHtCapabilities (HtCapabilities htcapabilities)
 {
-  m_htCapability=htcapabilities;
+  m_htCapability = htcapabilities;
 }
 
-HtCapabilities 
+void
+MgtAssocResponseHeader::SetVhtCapabilities (VhtCapabilities vhtcapabilities)
+{
+  m_vhtCapability = vhtcapabilities;
+}
+
+VhtCapabilities
+MgtAssocResponseHeader::GetVhtCapabilities (void) const
+{
+  return m_vhtCapability;
+}
+
+HtCapabilities
 MgtAssocResponseHeader::GetHtCapabilities (void) const
 {
-   return  m_htCapability;
+  return m_htCapability;
 }
+
 TypeId
 MgtAssocResponseHeader::GetTypeId (void)
 {
@@ -421,21 +546,24 @@
   ;
   return tid;
 }
+
 TypeId
 MgtAssocResponseHeader::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
+
 uint32_t
 MgtAssocResponseHeader::GetSerializedSize (void) const
 {
   uint32_t size = 0;
   size += m_capability.GetSerializedSize ();
   size += m_code.GetSerializedSize ();
-  size += 2; // aid
+  size += 2; //aid
   size += m_rates.GetSerializedSize ();
   size += m_rates.extended.GetSerializedSize ();
-  size += m_htCapability.GetSerializedSize();
+  size += m_htCapability.GetSerializedSize ();
+  size += m_vhtCapability.GetSerializedSize ();
   return size;
 }
 
@@ -444,8 +572,10 @@
 {
   os << "status code=" << m_code << ", "
      << "rates=" << m_rates << ", "
-  << "HT Capabilities=" << m_htCapability;
+     << "HT Capabilities=" << m_htCapability << " , "
+     << "VHT Capabilities= " << m_vhtCapability;
 }
+
 void
 MgtAssocResponseHeader::Serialize (Buffer::Iterator start) const
 {
@@ -455,8 +585,10 @@
   i.WriteHtolsbU16 (m_aid);
   i = m_rates.Serialize (i);
   i = m_rates.extended.Serialize (i);
- i = m_htCapability.Serialize(i);
+  i = m_htCapability.Serialize (i);
+  i = m_vhtCapability.Serialize (i);
 }
+
 uint32_t
 MgtAssocResponseHeader::Deserialize (Buffer::Iterator start)
 {
@@ -467,17 +599,22 @@
   i = m_rates.Deserialize (i);
   i = m_rates.extended.DeserializeIfPresent (i);
   i = m_htCapability.DeserializeIfPresent (i);
+  i = m_vhtCapability.DeserializeIfPresent (i);
   return i.GetDistanceFrom (start);
 }
+
+
 /**********************************************************
  *   ActionFrame
  **********************************************************/
 WifiActionHeader::WifiActionHeader ()
 {
 }
+
 WifiActionHeader::~WifiActionHeader ()
 {
 }
+
 void
 WifiActionHeader::SetAction (WifiActionHeader::CategoryValue type,
                              WifiActionHeader::ActionValue action)
@@ -490,12 +627,12 @@
         m_actionValue = action.blockAck;
         break;
       }
-    case MESH:  
+    case MESH:
       {
         m_actionValue = action.meshAction;
         break;
       }
-    case MULTIHOP: 
+    case MULTIHOP:
       {
         m_actionValue = action.multihopAction;
         break;
@@ -504,13 +641,14 @@
       {
         m_actionValue = action.selfProtectedAction;
         break;
-      } 
+      }
     case VENDOR_SPECIFIC_ACTION:
       {
         break;
-      } 
+      }
     }
 }
+
 WifiActionHeader::CategoryValue
 WifiActionHeader::GetCategory ()
 {
@@ -531,12 +669,12 @@
       return SELF_PROTECTED;
     }
 }
+
 WifiActionHeader::ActionValue
 WifiActionHeader::GetAction ()
 {
   ActionValue retval;
-  retval.selfProtectedAction = PEER_LINK_OPEN; // Needs to be initialized to something to quiet valgrind in default cases
- 
+  retval.selfProtectedAction = PEER_LINK_OPEN; //Needs to be initialized to something to quiet valgrind in default cases
   switch (m_category)
     {
     case BLOCK_ACK:
@@ -544,15 +682,16 @@
         {
         case BLOCK_ACK_ADDBA_REQUEST:
           retval.blockAck = BLOCK_ACK_ADDBA_REQUEST;
-          break ;
+          break;
         case BLOCK_ACK_ADDBA_RESPONSE:
           retval.blockAck = BLOCK_ACK_ADDBA_RESPONSE;
-          break ;
+          break;
         case BLOCK_ACK_DELBA:
           retval.blockAck = BLOCK_ACK_DELBA;
-          break ;
-       }
-      break ;
+          break;
+        }
+      break;
+
     case SELF_PROTECTED:
       switch (m_actionValue)
         {
@@ -575,8 +714,8 @@
           NS_FATAL_ERROR ("Unknown mesh peering management action code");
           retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
         }
-       break ;
-      
+      break;
+
     case MESH:
       switch (m_actionValue)
         {
@@ -591,10 +730,10 @@
           break;
         case CONGESTION_CONTROL_NOTIFICATION:
           retval.meshAction = CONGESTION_CONTROL_NOTIFICATION;
-         break;
+          break;
         case MDA_SETUP_REQUEST:
           retval.meshAction = MDA_SETUP_REQUEST;
-         break;
+          break;
         case MDA_SETUP_REPLY:
           retval.meshAction = MDA_SETUP_REPLY;
           break;
@@ -618,14 +757,14 @@
           retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
         }
       break;
-  
+
     case MULTIHOP: //not yet supported
       switch (m_actionValue)
         {
-        case PROXY_UPDATE:                    //(not used so far)
+        case PROXY_UPDATE: //not used so far
           retval.multihopAction = PROXY_UPDATE;
           break;
-        case PROXY_UPDATE_CONFIRMATION:       //(not used so far)
+        case PROXY_UPDATE_CONFIRMATION: //not used so far
           retval.multihopAction = PROXY_UPDATE;
           break;
         default:
@@ -633,41 +772,107 @@
           retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
         }
       break;
-      default:
+    default:
       NS_FATAL_ERROR ("Unsupported mesh action");
       retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
-      }
+    }
   return retval;
 }
+
 TypeId
 WifiActionHeader::GetTypeId ()
 {
   static TypeId tid = TypeId ("ns3::WifiActionHeader")
     .SetParent<Header> ()
     .SetGroupName ("Wifi")
-    .AddConstructor<WifiActionHeader> ();
+    .AddConstructor<WifiActionHeader> ()
+  ;
   return tid;
 }
+
 TypeId
 WifiActionHeader::GetInstanceTypeId () const
 {
   return GetTypeId ();
 }
+
+std::string
+WifiActionHeader::CategoryValueToString (CategoryValue value) const
+{
+  if (value == BLOCK_ACK)
+    {
+      return "BlockAck";
+    }
+  else if (value == MESH)
+    {
+      return "Mesh";
+    }
+  else if (value == SELF_PROTECTED)
+    {
+      return "SelfProtected";
+    }
+  else if (value == VENDOR_SPECIFIC_ACTION)
+    {
+      return "VendorSpecificAction";
+    }
+  else
+    {
+      std::ostringstream convert;
+      convert << value;
+      return convert.str ();
+    }
+}
+std::string
+WifiActionHeader::SelfProtectedActionValueToString (SelfProtectedActionValue value) const
+{
+  if (value == PEER_LINK_OPEN)
+    {
+      return "PeerLinkOpen";
+    }
+  else if (value == PEER_LINK_CONFIRM)
+    {
+      return "PeerLinkConfirm";
+    }
+  else if (value == PEER_LINK_CLOSE)
+    {
+      return "PeerLinkClose";
+    }
+  else if (value == GROUP_KEY_INFORM)
+    {
+      return "GroupKeyInform";
+    }
+  else if (value == GROUP_KEY_ACK)
+    {
+      return "GroupKeyAck";
+    }
+  else
+    {
+      std::ostringstream convert;
+      convert << value;
+      return convert.str ();
+    }
+}
+
 void
 WifiActionHeader::Print (std::ostream &os) const
 {
+  os << "category=" << CategoryValueToString ((CategoryValue) m_category)
+     << ", value=" << SelfProtectedActionValueToString ((SelfProtectedActionValue) m_actionValue);
 }
+
 uint32_t
 WifiActionHeader::GetSerializedSize () const
 {
   return 2;
 }
+
 void
 WifiActionHeader::Serialize (Buffer::Iterator start) const
 {
   start.WriteU8 (m_category);
   start.WriteU8 (m_actionValue);
 }
+
 uint32_t
 WifiActionHeader::Deserialize (Buffer::Iterator start)
 {
@@ -677,6 +882,7 @@
   return i.GetDistanceFrom (start);
 }
 
+
 /***************************************************
 *                 ADDBARequest
 ****************************************************/
@@ -696,7 +902,8 @@
   static TypeId tid = TypeId ("ns3::MgtAddBaRequestHeader")
     .SetParent<Header> ()
     .SetGroupName ("Wifi")
-    .AddConstructor<MgtAddBaRequestHeader> ();
+    .AddConstructor<MgtAddBaRequestHeader> ()
+  ;
   return tid;
 }
 
@@ -781,6 +988,12 @@
 }
 
 void
+MgtAddBaRequestHeader::SetStartingSequenceControl (uint16_t seqControl)
+{
+  m_startingSeq = (seqControl >> 4) & 0x0fff;
+}
+
+void
 MgtAddBaRequestHeader::SetAmsduSupport (bool supported)
 {
   m_amsduSupport = supported;
@@ -828,12 +1041,6 @@
   return (m_startingSeq << 4) & 0xfff0;
 }
 
-void
-MgtAddBaRequestHeader::SetStartingSequenceControl (uint16_t seqControl)
-{
-  m_startingSeq = (seqControl >> 4) & 0x0fff;
-}
-
 uint16_t
 MgtAddBaRequestHeader::GetParameterSet (void) const
 {
@@ -854,6 +1061,7 @@
   m_bufferSize = (params >> 6) & 0x03ff;
 }
 
+
 /***************************************************
 *                 ADDBAResponse
 ****************************************************/
@@ -1021,6 +1229,7 @@
   m_bufferSize = (params >> 6) & 0x03ff;
 }
 
+
 /***************************************************
 *                     DelBa
 ****************************************************/
@@ -1129,4 +1338,4 @@
   m_tid = (params >> 12) & 0x0f;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/mgt-headers.h ns-3.24/src/wifi/model/mgt-headers.h
--- ns-3.23/src/wifi/model/mgt-headers.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mgt-headers.h	2015-09-15 11:18:44.000000000 -0700
@@ -16,9 +16,10 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef MGT_HEADERS_H
 #define MGT_HEADERS_H
 
@@ -30,6 +31,8 @@
 #include "supported-rates.h"
 #include "ssid.h"
 #include "ht-capabilities.h"
+#include "ht-capabilities.h"
+#include "vht-capabilities.h"
 
 namespace ns3 {
 
@@ -66,14 +69,27 @@
    *
    * \param htcapabilities HT capabilities
    */
-  void SetHtCapabilities(HtCapabilities htcapabilities);
-  
+  void SetHtCapabilities (HtCapabilities htcapabilities);
+  /**
+    * Set the VHT capabilities.
+    *
+    * \param vhtcapabilities VHT capabilities
+    */
+  void SetVhtCapabilities (VhtCapabilities vhtcapabilities);
+  /**
+  * Return the VHT capabilities.
+  *
+  * \return VHT capabilities
+  */
+  VhtCapabilities GetVhtCapabilities (void) const;
+
   /**
    * Return the HT capabilities.
    *
    * \return HT capabilities
    */
   HtCapabilities GetHtCapabilities (void) const;
+
   /**
    * Return the Service Set Identifier (SSID).
    *
@@ -93,6 +109,10 @@
    */
   uint16_t GetListenInterval (void) const;
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
@@ -100,12 +120,14 @@
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
+
 private:
-  Ssid m_ssid; //!< Service Set ID (SSID)
-  SupportedRates m_rates; //!< List of supported rates
+  Ssid m_ssid;                        //!< Service Set ID (SSID)
+  SupportedRates m_rates;             //!< List of supported rates
   CapabilityInformation m_capability; //!< Capability information
-  HtCapabilities m_htCapability; //!< HT capabilities
+  HtCapabilities m_htCapability;      //!< HT capabilities
   uint16_t m_listenInterval;
+  VhtCapabilities m_vhtCapability;    //!< VHT capabilities
 };
 
 
@@ -137,13 +159,24 @@
    * \return HT capabilities
    */
   HtCapabilities GetHtCapabilities (void) const;
-
+  /**
+    * Set the VHT capabilities.
+    *
+    * \param vhtcapabilities VHT capabilities
+    */
+  void SetVhtCapabilities (VhtCapabilities vhtcapabilities);
+  /**
+  * Return the VHT capabilities.
+  *
+  * \return VHT capabilities
+  */
+  VhtCapabilities GetVhtCapabilities (void) const;
   /**
    * Set the HT capabilities.
    *
    * \param htcapabilities HT capabilities
    */
-  void SetHtCapabilities(HtCapabilities htcapabilities);
+  void SetHtCapabilities (HtCapabilities htcapabilities);
   /**
    * Set the supported rates.
    *
@@ -157,6 +190,10 @@
    */
   void SetStatusCode (StatusCode code);
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
@@ -170,6 +207,7 @@
   StatusCode m_code; //!< Status code
   uint16_t m_aid;
   HtCapabilities m_htCapability; //!< HT capabilities
+  VhtCapabilities m_vhtCapability; //!< VHT capabilities
 };
 
 
@@ -212,23 +250,43 @@
    * \return HT capabilities
    */
   HtCapabilities GetHtCapabilities (void) const;
+  /**
+   * Set the VHT capabilities.
+   *
+   * \param vhtcapabilities VHT capabilities
+   */
+  void SetVhtCapabilities (VhtCapabilities vhtcapabilities);
+  /**
+  * Return the VHT capabilities.
+  *
+  * \return VHT capabilities
+  */
+  VhtCapabilities GetVhtCapabilities (void) const;
 
   /**
    * Set the HT capabilities.
    *
    * \param htcapabilities HT capabilities
    */
-  void SetHtCapabilities(HtCapabilities htcapabilities);
+  void SetHtCapabilities (HtCapabilities htcapabilities);
+
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetSerializedSize (void) const;
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
+
+
 private:
-  Ssid m_ssid; //!< Service Set ID (SSID)
-  SupportedRates m_rates; //!< List of supported rates
+  Ssid m_ssid;                   //!< Service Set ID (SSID)
+  SupportedRates m_rates;        //!< List of supported rates
   HtCapabilities m_htCapability; //!< HT capabilities
+  VhtCapabilities m_vhtCapability; //!< VHT capabilities
 };
 
 
@@ -266,13 +324,24 @@
    * \return HT capabilities
    */
   HtCapabilities GetHtCapabilities (void) const;
-
+  /**
+   * Set the VHT capabilities.
+   *
+   * \param vhtcapabilities VHT capabilities
+   */
+  void SetVhtCapabilities (VhtCapabilities vhtcapabilities);
+  /**
+  * Return the VHT capabilities.
+  *
+  * \return VHT capabilities
+  */
+  VhtCapabilities GetVhtCapabilities (void) const;
   /**
    * Set the HT capabilities.
    *
    * \param htcapabilities HT capabilities
    */
-  void SetHtCapabilities(HtCapabilities htcapabilities);
+  void SetHtCapabilities (HtCapabilities htcapabilities);
   /**
    * Set the Service Set Identifier (SSID).
    *
@@ -297,6 +366,11 @@
    * \return time stamp
    */
   uint64_t GetTimestamp ();
+
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
@@ -305,12 +379,13 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
 private:
-  uint64_t m_timestamp; //!< Timestamp
-  Ssid m_ssid; //!< Service set ID (SSID)
-  uint64_t m_beaconInterval; //!< Beacon interval
-  SupportedRates m_rates; //!< List of supported rates
+  uint64_t m_timestamp;               //!< Timestamp
+  Ssid m_ssid;                        //!< Service set ID (SSID)
+  uint64_t m_beaconInterval;          //!< Beacon interval
+  SupportedRates m_rates;             //!< List of supported rates
   CapabilityInformation m_capability; //!< Capability information
-  HtCapabilities m_htCapability; //!< HT capabilities
+  HtCapabilities m_htCapability;      //!< HT capabilities
+  VhtCapabilities m_vhtCapability;    //!< VHT capabilities
 };
 
 
@@ -320,8 +395,16 @@
  */
 class MgtBeaconHeader : public MgtProbeResponseHeader
 {
+public:
+  /** Register this type. */
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
 };
 
+
 /****************************
 *     Action frames
 *****************************/
@@ -341,19 +424,20 @@
 
   /*
    * Compatible with table 8-38 IEEE 802.11, Part11, (Year 2012)
-   * Category values - see 802.11-2012 Table 8-38 */
-  
+   * Category values - see 802.11-2012 Table 8-38
+   */
+
   enum CategoryValue //table 8-38 staring from IEEE 802.11, Part11, (Year 2012)
   {
     BLOCK_ACK = 3,
     MESH = 13,                  //Category: Mesh
-    MULTIHOP = 14,              //(not used so far)
+    MULTIHOP = 14,              //not used so far
     SELF_PROTECTED = 15,        //Category: Self Protected
-    // since vendor specific action has no stationary Action value,the parse process is not here.
-    // refer to vendor-specific-action in wave module.
+    //Since vendor specific action has no stationary Action value,the parse process is not here.
+    //Refer to vendor-specific-action in wave module.
     VENDOR_SPECIFIC_ACTION = 127,
   };
- 
+
   enum SelfProtectedActionValue //Category: 15 (Self Protected)
   {
     PEER_LINK_OPEN = 1,         //Mesh Peering Open
@@ -365,23 +449,23 @@
 
   enum MultihopActionValue
   {
-    PROXY_UPDATE = 0,                   //(not used so far)
-    PROXY_UPDATE_CONFIRMATION = 1,      //(not used so far)
+    PROXY_UPDATE = 0,                   //not used so far
+    PROXY_UPDATE_CONFIRMATION = 1,      //not used so far
   };
 
   enum MeshActionValue
   {
-    LINK_METRIC_REPORT=0,               //Action Value:0 in Category 13: Mesh
-    PATH_SELECTION = 1,                 //Action Value:1 in Category 13: Mesh
-    PORTAL_ANNOUNCEMENT = 2,            //Action Value:2 in Category 13: Mesh
-    CONGESTION_CONTROL_NOTIFICATION = 3,//Action Value:3 in Category 13: Mesh
-    MDA_SETUP_REQUEST=4,                //Action Value:4 in Category 13: Mesh MCCA-Setup-Request               (not used so far)
-    MDA_SETUP_REPLY=5,                  //Action Value:5 in Category 13: Mesh MCCA-Setup-Reply                 (not used so far)
-    MDAOP_ADVERTISMENT_REQUEST=6,       //Action Value:6 in Category 13: Mesh MCCA-Advertisement-Request       (not used so far)
-    MDAOP_ADVERTISMENTS=7,              //Action Value:7 in Category 13: Mesh                                  (not used so far)
-    MDAOP_SET_TEARDOWN=8,               //Action Value:8 in Category 13: Mesh                                  (not used so far)
-    TBTT_ADJUSTMENT_REQUEST=9,          //Action Value:9 in Category 13: Mesh                                  (not used so far)
-    TBTT_ADJUSTMENT_RESPONSE=10,        //Action Value:10 in Category 13: Mesh                                  (not used so far)
+    LINK_METRIC_REPORT = 0,               //Action Value:0 in Category 13: Mesh
+    PATH_SELECTION = 1,                   //Action Value:1 in Category 13: Mesh
+    PORTAL_ANNOUNCEMENT = 2,              //Action Value:2 in Category 13: Mesh
+    CONGESTION_CONTROL_NOTIFICATION = 3,  //Action Value:3 in Category 13: Mesh
+    MDA_SETUP_REQUEST = 4,                //Action Value:4 in Category 13: Mesh MCCA-Setup-Request (not used so far)
+    MDA_SETUP_REPLY = 5,                  //Action Value:5 in Category 13: Mesh MCCA-Setup-Reply (not used so far)
+    MDAOP_ADVERTISMENT_REQUEST = 6,       //Action Value:6 in Category 13: Mesh MCCA-Advertisement-Request (not used so far)
+    MDAOP_ADVERTISMENTS = 7,              //Action Value:7 in Category 13: Mesh (not used so far)
+    MDAOP_SET_TEARDOWN = 8,               //Action Value:8 in Category 13: Mesh (not used so far)
+    TBTT_ADJUSTMENT_REQUEST = 9,          //Action Value:9 in Category 13: Mesh (not used so far)
+    TBTT_ADJUSTMENT_RESPONSE = 10,        //Action Value:10 in Category 13: Mesh (not used so far)
   };
 
   /**
@@ -403,7 +487,7 @@
   {
     enum MeshActionValue meshAction;
     enum MultihopActionValue multihopAction;
-    enum SelfProtectedActionValue selfProtectedAction;    
+    enum SelfProtectedActionValue selfProtectedAction;
     enum BlockAckActionValue blockAck;
   } ActionValue;
   /**
@@ -426,17 +510,27 @@
    * \return ActionValue
    */
   ActionValue GetAction ();
+
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId () const;
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetSerializedSize () const;
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
+
+
 private:
+  std::string CategoryValueToString (CategoryValue value) const;
+  std::string SelfProtectedActionValueToString (SelfProtectedActionValue value) const;
   uint8_t m_category; //!< Category of the action
   uint8_t m_actionValue; //!< Action value
 };
 
+
 /**
  * \ingroup wifi
  * Implement the header for management frames of type add block ack request.
@@ -446,6 +540,10 @@
 public:
   MgtAddBaRequestHeader ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
@@ -555,13 +653,13 @@
    */
   void SetStartingSequenceControl (uint16_t seqControl);
 
-  uint8_t m_dialogToken; /* Not used for now */
-  uint8_t m_amsduSupport; //!< Flag if A-MSDU is supported
-  uint8_t m_policy; //!< Block ACK policy
-  uint8_t m_tid; //!< Traffic ID
-  uint16_t m_bufferSize; //!< Buffer size
+  uint8_t m_dialogToken;   /* Not used for now */
+  uint8_t m_amsduSupport;  //!< Flag if A-MSDU is supported
+  uint8_t m_policy;        //!< Block ACK policy
+  uint8_t m_tid;           //!< Traffic ID
+  uint16_t m_bufferSize;   //!< Buffer size
   uint16_t m_timeoutValue; //!< Timeout
-  uint16_t m_startingSeq; //!< Starting sequence number
+  uint16_t m_startingSeq;  //!< Starting sequence number
 };
 
 
@@ -574,6 +672,10 @@
 public:
   MgtAddBaResponseHeader ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
@@ -657,6 +759,7 @@
    */
   bool IsAmsduSupported (void) const;
 
+
 private:
   /**
    * Return the raw parameter set.
@@ -671,12 +774,12 @@
    */
   void SetParameterSet (uint16_t params);
 
-  uint8_t m_dialogToken; /* Not used for now */
-  StatusCode m_code; //!< Status code
-  uint8_t m_amsduSupport; //!< Flag if A-MSDU is supported
-  uint8_t m_policy; //!< Block ACK policy
-  uint8_t m_tid; //!< Traffic ID
-  uint16_t m_bufferSize; //!< Buffer size
+  uint8_t m_dialogToken;   /* Not used for now */
+  StatusCode m_code;       //!< Status code
+  uint8_t m_amsduSupport;  //!< Flag if A-MSDU is supported
+  uint8_t m_policy;        //!< Block ACK policy
+  uint8_t m_tid;           //!< Traffic ID
+  uint16_t m_bufferSize;   //!< Buffer size
   uint16_t m_timeoutValue; //!< Timeout
 };
 
@@ -690,7 +793,12 @@
 public:
   MgtDelBaHeader ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
+  // Inherited
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetSerializedSize (void) const;
@@ -741,11 +849,9 @@
 
   uint16_t m_initiator;
   uint16_t m_tid; //!< Traffic ID
-  /* Not used for now.
-     Always set to 1: "Unspecified reason" */
-  uint16_t m_reasonCode;
+  uint16_t m_reasonCode; /* Not used for now. Always set to 1: "Unspecified reason" */
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* MGT_HEADERS_H */
diff -Naur ns-3.23/src/wifi/model/minstrel-wifi-manager.cc ns-3.24/src/wifi/model/minstrel-wifi-manager.cc
--- ns-3.23/src/wifi/model/minstrel-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/minstrel-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -61,27 +61,22 @@
    * note: there are many other ways to do this.
    */
   uint32_t m_col, m_index;
-  uint32_t m_maxTpRate;  ///< the current throughput rate
-  uint32_t m_maxTpRate2;  ///< second highest throughput rate
-  uint32_t m_maxProbRate;  ///< rate with highest prob of success
-
-  int m_packetCount;  ///< total number of packets as of now
-  int m_sampleCount;  ///< how many packets we have sample so far
-
-  bool m_isSampling;  ///< a flag to indicate we are currently sampling
-  uint32_t m_sampleRate;  ///< current sample rate
-  bool  m_sampleRateSlower;  ///< a flag to indicate sample rate is slower
-
-  uint32_t m_shortRetry;  ///< short retries such as control packts
-  uint32_t m_longRetry;  ///< long retries such as data packets
-  uint32_t m_retry;  ///< total retries short + long
-  uint32_t m_err;  ///< retry errors
-  uint32_t m_txrate;  ///< current transmit rate
-
-  bool m_initialized;  ///< for initializing tables
-
+  uint32_t m_maxTpRate;          ///< the current throughput rate
+  uint32_t m_maxTpRate2;         ///< second highest throughput rate
+  uint32_t m_maxProbRate;        ///< rate with highest prob of success
+  int m_packetCount;             ///< total number of packets as of now
+  int m_sampleCount;             ///< how many packets we have sample so far
+  bool m_isSampling;             ///< a flag to indicate we are currently sampling
+  uint32_t m_sampleRate;         ///< current sample rate
+  bool  m_sampleRateSlower;      ///< a flag to indicate sample rate is slower
+  uint32_t m_shortRetry;         ///< short retries such as control packts
+  uint32_t m_longRetry;          ///< long retries such as data packets
+  uint32_t m_retry;              ///< total retries short + long
+  uint32_t m_err;                ///< retry errors
+  uint32_t m_txrate;             ///< current transmit rate
+  bool m_initialized;            ///< for initializing tables
   MinstrelRate m_minstrelTable;  ///< minstrel table
-  SampleRate m_sampleTable;  ///< sample table
+  SampleRate m_sampleTable;      ///< sample table
 };
 
 NS_OBJECT_ENSURE_REGISTERED (MinstrelWifiManager);
@@ -136,14 +131,14 @@
 void
 MinstrelWifiManager::SetupPhy (Ptr<WifiPhy> phy)
 {
-  NS_LOG_FUNCTION(this << phy);
+  NS_LOG_FUNCTION (this << phy);
   uint32_t nModes = phy->GetNModes ();
   for (uint32_t i = 0; i < nModes; i++)
     {
       WifiMode mode = phy->GetMode (i);
       WifiTxVector txVector;
-      txVector.SetMode(mode);
-      AddCalcTxTime (mode, phy->CalculateTxDuration (m_pktLen, txVector, WIFI_PREAMBLE_LONG, phy->GetFrequency(), 0, 0));
+      txVector.SetMode (mode);
+      AddCalcTxTime (mode, phy->CalculateTxDuration (m_pktLen, txVector, WIFI_PREAMBLE_LONG, phy->GetFrequency (), 0, 0));
     }
   WifiRemoteStationManager::SetupPhy (phy);
 }
@@ -208,9 +203,9 @@
 {
   if (!station->m_initialized && GetNSupported (station) > 1)
     {
-      // Note: we appear to be doing late initialization of the table
-      // to make sure that the set of supported rates has been initialized
-      // before we perform our own initialization.
+      //Note: we appear to be doing late initialization of the table
+      //to make sure that the set of supported rates has been initialized
+      //before we perform our own initialization.
       m_nsupported = GetNSupported (station);
       station->m_minstrelTable = MinstrelRate (m_nsupported);
       station->m_sampleTable = SampleRate (m_nsupported, std::vector<uint32_t> (m_sampleCol));
@@ -286,18 +281,18 @@
 
   NS_LOG_DEBUG ("DoReportDataFailed " << station << " rate " << station->m_txrate << " longRetry " << station->m_longRetry);
 
-  /// for normal rate, we're not currently sampling random rates
+  //for normal rate, we're not currently sampling random rates
   if (!station->m_isSampling)
     {
       NS_LOG_DEBUG ("Failed with normal rate: current=" << station->m_txrate << ", sample=" << station->m_sampleRate << ", maxTp=" << station->m_maxTpRate << ", maxTp2=" << station->m_maxTpRate2 << ", maxProb=" << station->m_maxProbRate);
-      /// use best throughput rate
+      //use best throughput rate
       if (station->m_longRetry < station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount)
         {
           NS_LOG_DEBUG (" More retries left for the maximum throughput rate.");
           station->m_txrate = station->m_maxTpRate;
         }
 
-      /// use second best throughput rate
+      //use second best throughput rate
       else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
                                         station->m_minstrelTable[station->m_maxTpRate2].adjustedRetryCount))
         {
@@ -305,7 +300,7 @@
           station->m_txrate = station->m_maxTpRate2;
         }
 
-      /// use best probability rate
+      //use best probability rate
       else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
                                         station->m_minstrelTable[station->m_maxTpRate2].adjustedRetryCount +
                                         station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
@@ -314,7 +309,7 @@
           station->m_txrate = station->m_maxProbRate;
         }
 
-      /// use lowest base rate
+      //use lowest base rate
       else if (station->m_longRetry > (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
                                        station->m_minstrelTable[station->m_maxTpRate2].adjustedRetryCount +
                                        station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
@@ -324,22 +319,22 @@
         }
     }
 
-  /// for look-around rate, we're currently sampling random rates
+  //for look-around rate, we're currently sampling random rates
   else
     {
       NS_LOG_DEBUG ("Failed with look around rate: current=" << station->m_txrate << ", sample=" << station->m_sampleRate << ", maxTp=" << station->m_maxTpRate << ", maxTp2=" << station->m_maxTpRate2 << ", maxProb=" << station->m_maxProbRate);
-      /// current sampling rate is slower than the current best rate
+      //current sampling rate is slower than the current best rate
       if (station->m_sampleRateSlower)
         {
           NS_LOG_DEBUG ("Look around rate is slower than the maximum throughput rate.");
-          /// use best throughput rate
+          //use best throughput rate
           if (station->m_longRetry < station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount)
             {
               NS_LOG_DEBUG (" More retries left for the maximum throughput rate.");
               station->m_txrate = station->m_maxTpRate;
             }
 
-          ///	use random rate
+          //use random rate
           else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
                                             station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount))
             {
@@ -347,7 +342,7 @@
               station->m_txrate = station->m_sampleRate;
             }
 
-          /// use max probability rate
+          //use max probability rate
           else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
                                             station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
                                             station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount ))
@@ -356,7 +351,7 @@
               station->m_txrate = station->m_maxProbRate;
             }
 
-          /// use lowest base rate
+          //use lowest base rate
           else if (station->m_longRetry > (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
                                            station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
                                            station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
@@ -365,19 +360,18 @@
               station->m_txrate = 0;
             }
         }
-
-      /// current sampling rate is better than current best rate
+      //current sampling rate is better than current best rate
       else
         {
           NS_LOG_DEBUG ("Look around rate is faster than the maximum throughput rate.");
-          /// use random rate
+          //use random rate
           if (station->m_longRetry < station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount)
             {
               NS_LOG_DEBUG (" More retries left for the sampling rate.");
               station->m_txrate = station->m_sampleRate;
             }
 
-          /// use the best throughput rate
+          //use the best throughput rate
           else if (station->m_longRetry <= (station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
                                             station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount))
             {
@@ -385,7 +379,7 @@
               station->m_txrate = station->m_maxTpRate;
             }
 
-          /// use the best probability rate
+          //use the best probability rate
           else if (station->m_longRetry <= (station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
                                             station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
                                             station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
@@ -394,7 +388,7 @@
               station->m_txrate = station->m_maxProbRate;
             }
 
-          /// use the lowest base rate
+          //use the lowest base rate
           else if (station->m_longRetry > (station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
                                            station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
                                            station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
@@ -477,18 +471,24 @@
 
 WifiTxVector
 MinstrelWifiManager::DoGetDataTxVector (WifiRemoteStation *st,
-                                    uint32_t size)
+                                        uint32_t size)
 {
   MinstrelWifiRemoteStation *station = (MinstrelWifiRemoteStation *) st;
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
   if (!station->m_initialized)
     {
       CheckInit (station);
 
-      /// start the rate at half way
+      //start the rate at half way
       station->m_txrate = m_nsupported / 2;
     }
   UpdateStats (station);
-  return WifiTxVector (GetSupported (station, station->m_txrate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  return WifiTxVector (GetSupported (station, station->m_txrate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
 WifiTxVector
@@ -496,8 +496,13 @@
 {
   MinstrelWifiRemoteStation *station = (MinstrelWifiRemoteStation *) st;
   NS_LOG_DEBUG ("DoGetRtsMode m_txrate=" << station->m_txrate);
-
-  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
 bool
@@ -546,6 +551,7 @@
 {
   return true;
 }
+
 uint32_t
 MinstrelWifiManager::GetNextSample (MinstrelWifiRemoteStation *station)
 {
@@ -553,7 +559,7 @@
   bitrate = station->m_sampleTable[station->m_index][station->m_col];
   station->m_index++;
 
-  /// bookeeping for m_index and m_col variables
+  //bookeeping for m_index and m_col variables
   if (station->m_index > (m_nsupported - 2))
     {
       station->m_index = 0;
@@ -579,7 +585,7 @@
 
   uint32_t idx;
 
-  /// for determining when to try a sample rate
+  //for determining when to try a sample rate
   int coinFlip = m_uniformRandomVariable->GetInteger (0, 100) % 2;
 
   /**
@@ -591,10 +597,9 @@
        && (coinFlip == 1) )
     {
       NS_LOG_DEBUG ("Using look around rate");
-      /// now go through the table and find an index rate
+      //now go through the table and find an index rate
       idx = GetNextSample (station);
 
-
       /**
        * This if condition is used to make sure that we don't need to use
        * the sample rate it is the same as our current rate
@@ -602,26 +607,26 @@
       if (idx != station->m_maxTpRate && idx != station->m_txrate)
         {
 
-          /// start sample count
+          //start sample count
           station->m_sampleCount++;
 
-          /// set flag that we are currently sampling
+          //set flag that we are currently sampling
           station->m_isSampling = true;
 
-          /// bookeeping for resetting stuff
+          //bookeeping for resetting stuff
           if (station->m_packetCount >= 10000)
             {
               station->m_sampleCount = 0;
               station->m_packetCount = 0;
             }
 
-          /// error check
+          //error check
           if (idx >= m_nsupported)
             {
               NS_LOG_DEBUG ("ALERT!!! ERROR");
             }
 
-          /// set the rate that we're currently sampling
+          //set the rate that we're currently sampling
           station->m_sampleRate = idx;
 
           if (station->m_sampleRate == station->m_maxTpRate)
@@ -629,11 +634,11 @@
               station->m_sampleRate = station->m_maxTpRate2;
             }
 
-          /// is this rate slower than the current best rate
+          //is this rate slower than the current best rate
           station->m_sampleRateSlower =
             (station->m_minstrelTable[idx].perfectTxTime > station->m_minstrelTable[station->m_maxTpRate].perfectTxTime);
 
-          /// using the best rate instead
+          //using the best rate instead
           if (station->m_sampleRateSlower)
             {
               NS_LOG_DEBUG ("The next look around rate is slower than the maximum throughput rate, continue with the maximum throughput rate: " << station->m_maxTpRate << "(" << GetSupported (station, station->m_maxTpRate) << ")");
@@ -641,15 +646,13 @@
             }
         }
     }
-
-  ///	continue using the best rate
+  //continue using the best rate
   else
     {
       NS_LOG_DEBUG ("Continue using the maximum throughput rate: " << station->m_maxTpRate << "(" << GetSupported (station, station->m_maxTpRate) << ")");
       idx = station->m_maxTpRate;
     }
 
-
   NS_LOG_DEBUG ("Rate = " << idx << "(" << GetSupported (station, idx) << ")");
 
   return idx;
@@ -679,10 +682,10 @@
   for (uint32_t i = 0; i < m_nsupported; i++)
     {
 
-      /// calculate the perfect tx time for this rate
+      //calculate the perfect tx time for this rate
       txTime = station->m_minstrelTable[i].perfectTxTime;
 
-      /// just for initialization
+      //just for initialization
       if (txTime.GetMicroSeconds () == 0)
         {
           txTime = Seconds (1);
@@ -692,7 +695,7 @@
                     "\t" << station->m_minstrelTable[i].numRateAttempt <<
                     "\t" << station->m_minstrelTable[i].numRateSuccess);
 
-      /// if we've attempted something
+      //if we've attempted something
       if (station->m_minstrelTable[i].numRateAttempt)
         {
           /**
@@ -701,24 +704,24 @@
            */
           tempProb = (station->m_minstrelTable[i].numRateSuccess * 18000) / station->m_minstrelTable[i].numRateAttempt;
 
-          /// bookeeping
+          //bookeeping
           station->m_minstrelTable[i].prob = tempProb;
 
-          /// ewma probability (cast for gcc 3.4 compatibility)
+          //ewma probability (cast for gcc 3.4 compatibility)
           tempProb = static_cast<uint32_t> (((tempProb * (100 - m_ewmaLevel)) + (station->m_minstrelTable[i].ewmaProb * m_ewmaLevel) ) / 100);
 
           station->m_minstrelTable[i].ewmaProb = tempProb;
 
-          /// calculating throughput
+          //calculating throughput
           station->m_minstrelTable[i].throughput = tempProb * (1000000 / txTime.GetMicroSeconds ());
 
         }
 
-      /// bookeeping
+      //bookeeping
       station->m_minstrelTable[i].numRateSuccess = 0;
       station->m_minstrelTable[i].numRateAttempt = 0;
 
-      /// Sample less often below 10% and  above 95% of success
+      //Sample less often below 10% and  above 95% of success
       if ((station->m_minstrelTable[i].ewmaProb > 17100) || (station->m_minstrelTable[i].ewmaProb < 1800))
         {
           /**
@@ -726,7 +729,7 @@
            *
            * Analysis of information showed that the system was sampling too hard at some rates.
            * For those rates that never work (54mb, 500m range) there is no point in sending 10 sample packets (< 6 ms time).
-           * Consequently, for the very very low probability rates, we sample at most twice. 
+           * Consequently, for the very very low probability rates, we sample at most twice.
            */
           if (station->m_minstrelTable[i].retryCount > 2)
             {
@@ -742,18 +745,18 @@
           station->m_minstrelTable[i].adjustedRetryCount = station->m_minstrelTable[i].retryCount;
         }
 
-      /// if it's 0 allow one retry limit
+      //if it's 0 allow one retry limit
       if (station->m_minstrelTable[i].adjustedRetryCount == 0)
         {
           station->m_minstrelTable[i].adjustedRetryCount = 1;
         }
     }
-  NS_LOG_DEBUG ("Attempt/success resetted to 0");
 
+  NS_LOG_DEBUG ("Attempt/success resetted to 0");
 
   uint32_t max_prob = 0, index_max_prob = 0, max_tp = 0, index_max_tp = 0, index_max_tp2 = 0;
 
-  /// go find max throughput, second maximum throughput, high probability succ
+  //go find max throughput, second maximum throughput, high probability succ
   NS_LOG_DEBUG ("Finding the maximum throughput, second maximum throughput, and highest probability");
   NS_LOG_DEBUG ("Index-Rate\t\tT-put\tEWMA");
   for (uint32_t i = 0; i < m_nsupported; i++)
@@ -777,7 +780,7 @@
 
 
   max_tp = 0;
-  /// find the second highest max
+  //find the second highest max
   for (uint32_t i = 0; i < m_nsupported; i++)
     {
       if ((i != index_max_tp) && (max_tp < station->m_minstrelTable[i].throughput))
@@ -818,10 +821,10 @@
       NS_LOG_DEBUG (" perfectTxTime = " << station->m_minstrelTable[i].perfectTxTime);
       station->m_minstrelTable[i].retryCount = 1;
       station->m_minstrelTable[i].adjustedRetryCount = 1;
-      // Emulating minstrel.c::ath_rate_ctl_reset
-      // We only check from 2 to 10 retries. This guarantee that
-      // at least one retry is permitter.
-      Time totalTxTimeWithGivenRetries = Seconds (0.0); // tx_time in minstrel.c
+      //Emulating minstrel.c::ath_rate_ctl_reset
+      //We only check from 2 to 10 retries. This guarantee that
+      //at least one retry is permitter.
+      Time totalTxTimeWithGivenRetries = Seconds (0.0); //tx_time in minstrel.c
       NS_LOG_DEBUG (" Calculating the number of retries");
       for (uint32_t retries = 2; retries < 11; retries++)
         {
@@ -842,8 +845,8 @@
 MinstrelWifiManager::CalculateTimeUnicastPacket (Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries)
 {
   NS_LOG_FUNCTION (this << dataTransmissionTime << shortRetries << longRetries);
-  // See rc80211_minstrel.c
-  
+  //See rc80211_minstrel.c
+
   //First transmission (DATA + ACK timeout)
   Time tt = dataTransmissionTime + GetMac ()->GetAckTimeout ();
 
@@ -851,13 +854,13 @@
   uint32_t cw = 31;
   for (uint32_t retry = 0; retry < longRetries; retry++)
     {
-      // Add one re-transmission (DATA + ACK timeout)
+      //Add one re-transmission (DATA + ACK timeout)
       tt += dataTransmissionTime + GetMac ()->GetAckTimeout ();
 
-      // Add average back off (half the current contention window)
+      //Add average back off (half the current contention window)
       tt += NanoSeconds ((cw / 2) * GetMac ()->GetSlot ());
 
-      // Update contention window
+      //Update contention window
       cw = std::min (cwMax, (cw + 1) * 2);
     }
 
@@ -871,7 +874,7 @@
 
   station->m_col = station->m_index = 0;
 
-  /// for off-seting to make rates fall between 0 and numrates
+  //for off-seting to make rates fall between 0 and numrates
   uint32_t numSampleRates = m_nsupported;
 
   uint32_t newIndex;
@@ -879,7 +882,6 @@
     {
       for (uint32_t i = 0; i < numSampleRates; i++ )
         {
-
           /**
            * The next two lines basically tries to generate a random number
            * between 0 and the number of available rates
@@ -887,13 +889,12 @@
           int uv = m_uniformRandomVariable->GetInteger (0, numSampleRates);
           newIndex = (i + uv) % numSampleRates;
 
-          /// this loop is used for filling in other uninitilized places
+          //this loop is used for filling in other uninitilized places
           while (station->m_sampleTable[newIndex][col] != 0)
             {
               newIndex = (newIndex + 1) % m_nsupported;
             }
           station->m_sampleTable[newIndex][col] = i;
-
         }
     }
 }
@@ -913,7 +914,7 @@
         }
       table << std::endl;
     }
-  NS_LOG_DEBUG (table.str());
+  NS_LOG_DEBUG (table.str ());
 }
 
 void
@@ -927,9 +928,4 @@
     }
 }
 
-} // namespace ns3
-
-
-
-
-
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/minstrel-wifi-manager.h ns-3.24/src/wifi/model/minstrel-wifi-manager.h
--- ns-3.23/src/wifi/model/minstrel-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/minstrel-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -18,8 +18,6 @@
  * Author: Duy Nguyen <duy@soe.ucsc.edu>
  */
 
-
-
 #ifndef MINSTREL_WIFI_MANAGER_H
 #define MINSTREL_WIFI_MANAGER_H
 
@@ -43,12 +41,11 @@
    */
   Time perfectTxTime;
 
-
-  uint32_t retryCount;  ///< retry limit
+  uint32_t retryCount;          ///< retry limit
   uint32_t adjustedRetryCount;  ///< adjust the retry limit for this rate
-  uint32_t numRateAttempt;  ///< how many number of attempts so far
-  uint32_t numRateSuccess;    ///< number of successful pkts
-  uint32_t prob;  ///< (# pkts success )/(# total pkts)
+  uint32_t numRateAttempt;      ///< how many number of attempts so far
+  uint32_t numRateSuccess;      ///< number of successful pkts
+  uint32_t prob;                ///< (# pkts success )/(# total pkts)
 
   /**
    * EWMA calculation
@@ -64,7 +61,6 @@
  * A vector of a struct RateInfo
  */
 typedef std::vector<struct RateInfo> MinstrelRate;
-
 /**
  * Data structure for a Sample Rate table
  * A vector of a vector uint32_t
@@ -90,18 +86,20 @@
 
   virtual void SetupPhy (Ptr<WifiPhy> phy);
 
- /**
-  * 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
-  */
+  /**
+   * 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);
 
+
 private:
-  // overriden from base class
+  //overriden from base class
   virtual WifiRemoteStation * DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
@@ -120,7 +118,7 @@
 
   virtual bool IsLowLatency (void) const;
 
-  /// for estimating the TxTime of a packet with a given mode
+  //for estimating the TxTime of a packet with a given mode
   Time GetCalcTxTime (WifiMode mode) const;
   /**
    * Add transmission time for the given mode to an internal list.
@@ -130,19 +128,19 @@
    */
   void AddCalcTxTime (WifiMode mode, Time t);
 
-  /// update the number of retries and reset accordingly
+  //update the number of retries and reset accordingly
   void UpdateRetry (MinstrelWifiRemoteStation *station);
 
-  /// getting the next sample from Sample Table
+  //getting the next sample from Sample Table
   uint32_t GetNextSample (MinstrelWifiRemoteStation *station);
 
-  /// find a rate to use from Minstrel Table
+  //find a rate to use from Minstrel Table
   uint32_t FindRate (MinstrelWifiRemoteStation *station);
 
-  /// updating the Minstrel Table every 1/10 seconds
+  //updating the Minstrel Table every 1/10 seconds
   void UpdateStats (MinstrelWifiRemoteStation *station);
 
-  /// initialize Minstrel Table
+  //initialize Minstrel Table
   void RateInit (MinstrelWifiRemoteStation *station);
 
   /**
@@ -163,13 +161,13 @@
    */
   Time CalculateTimeUnicastPacket (Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries);
 
-  /// initialize Sample Table
+  //initialize Sample Table
   void InitSampleTable (MinstrelWifiRemoteStation *station);
 
-  /// printing Sample Table
+  //printing Sample Table
   void PrintSampleTable (MinstrelWifiRemoteStation *station);
 
-  /// printing Minstrel Table
+  //printing Minstrel Table
   void PrintTable (MinstrelWifiRemoteStation *station);
 
   void CheckInit (MinstrelWifiRemoteStation *station);  ///< check for initializations
@@ -181,18 +179,18 @@
    */
   typedef std::vector<std::pair<Time,WifiMode> > TxTime;
 
-  TxTime m_calcTxTime;  ///< to hold all the calculated TxTime for all modes
-  Time m_updateStats;  ///< how frequent do we calculate the stats (1/10 seconds)
+  TxTime m_calcTxTime;      ///< to hold all the calculated TxTime for all modes
+  Time m_updateStats;       ///< how frequent do we calculate the stats (1/10 seconds)
   double m_lookAroundRate;  ///< the % to try other rates than our current rate
-  double m_ewmaLevel;  ///< exponential weighted moving average
-  uint32_t m_sampleCol;  ///< number of sample columns
-  uint32_t m_pktLen;  ///< packet length used for calculate mode TxTime
-  uint32_t m_nsupported;  ///< modes supported
+  double m_ewmaLevel;       ///< exponential weighted moving average
+  uint32_t m_sampleCol;     ///< number of sample columns
+  uint32_t m_pktLen;        ///< packet length used for calculate mode TxTime
+  uint32_t m_nsupported;    ///< modes supported
 
-  /// Provides uniform random variables.
+  //Provides uniform random variables.
   Ptr<UniformRandomVariable> m_uniformRandomVariable;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* MINSTREL_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/mpdu-aggregator.cc ns-3.24/src/wifi/model/mpdu-aggregator.cc
--- ns-3.23/src/wifi/model/mpdu-aggregator.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mpdu-aggregator.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,8 +17,8 @@
  *
  * Author: Ghada Badawy <gbadawy@gmail.com>
  */
-#include "ns3/log.h"
 
+#include "ns3/log.h"
 #include "mpdu-aggregator.h"
 #include "wifi-mac-header.h"
 
@@ -32,8 +32,9 @@
 MpduAggregator::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::MpduAggregator")
-    .SetGroupName ("Wifi")
     .SetParent<Object> ()
+    .SetGroupName ("Wifi")
+    //No AddConstructor because this is an abstract class.
   ;
   return tid;
 }
@@ -74,5 +75,4 @@
   return set;
 }
 
-
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/mpdu-aggregator.h ns-3.24/src/wifi/model/mpdu-aggregator.h
--- ns-3.23/src/wifi/model/mpdu-aggregator.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mpdu-aggregator.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,91 +1,96 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013
- *
- * 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: Ghada Badawy <gbadawy@gmail.com>
- */
-#ifndef MPDU_AGGREGATOR_H
-#define MPDU_AGGREGATOR_H
-
-#include "ns3/ptr.h"
-#include "ns3/packet.h"
-#include "ns3/object.h"
-
-#include "ampdu-subframe-header.h"
-
-#include <list>
-
-namespace ns3 {
-
-class WifiMacHeader;
-
-/**
- * \brief Abstract class that concrete mpdu aggregators have to implement
- * \ingroup wifi
- */
-class MpduAggregator : public Object
-{
-public:
-  /**
-   * A list of deaggregated packets and their A-MPDU subframe headers.
-   */
-  typedef std::list<std::pair<Ptr<Packet>, AmpduSubframeHeader> > DeaggregatedMpdus;
-  /**
-   * A constant iterator for a list of deaggregated packets and their A-MPDU subframe headers.
-   */
-  typedef std::list<std::pair<Ptr<Packet>, AmpduSubframeHeader> >::const_iterator DeaggregatedMpdusCI;
-
-  static TypeId GetTypeId (void);
-  /**
-   * \param packet Packet we have to insert into <i>aggregatedPacket</i>.
-   * \param aggregatedPacket Packet that will contain <i>packet</i>, if aggregation is possible.
-   * \return true if <i>packet</i> can be aggregated to <i>aggregatedPacket</i>, false otherwise.
-   *
-   * Adds <i>packet</i> to <i>aggregatedPacket</i>. In concrete aggregator's implementation is
-   * specified how and if <i>packet</i> can be added to <i>aggregatedPacket</i>.
-   */
-  virtual bool Aggregate (Ptr<const Packet> packet, Ptr<Packet> aggregatedPacket) = 0;
-  /**
-   * Adds A-MPDU subframe header and padding to each MPDU that is part of an A-MPDU before it is sent.
-   */
-  virtual void AddHeaderAndPad (Ptr<Packet> packet,bool last) = 0;
-  /**
-   * \param packetSize size of the packet we want to insert into <i>aggregatedPacket</i>.
-   * \param aggregatedPacket packet that will contain the packet of size <i>packetSize</i>, if aggregation is possible.
-   * \param blockAckSize size of the piggybacked block ack request
-   * \return true if the packet of size <i>packetSize</i> can be aggregated to <i>aggregatedPacket</i>, false otherwise.
-   *
-   * This method is used to determine if a packet could be aggregated to an A-MPDU without exceeding the maximum packet size.
-   */
-  virtual bool CanBeAggregated (uint32_t packetSize, Ptr<Packet> aggregatedPacket, uint8_t blockAckSize) = 0;
-  /**
-   * \return padding that must be added to the end of an aggregated packet
-   *
-   * Calculates how much padding must be added to the end of an aggregated packet, after that a new packet is added.
-   * Each A-MPDU subframe is padded so that its length is multiple of 4 octets.
-   */
-  virtual uint32_t CalculatePadding (Ptr<const Packet> packet) = 0;
-  /**
-   * Deaggregates an A-MPDU by removing the A-MPDU subframe header and padding.
-   *
-   * \return list of deaggragted packets and their A-MPDU subframe headers
-   */
-  static DeaggregatedMpdus Deaggregate (Ptr<Packet> aggregatedPacket);
-};
-
-}  // namespace ns3
-
-#endif /* MPDU_AGGREGATOR_H */
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013
+ *
+ * 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: Ghada Badawy <gbadawy@gmail.com>
+ */
+
+#ifndef MPDU_AGGREGATOR_H
+#define MPDU_AGGREGATOR_H
+
+#include "ns3/ptr.h"
+#include "ns3/packet.h"
+#include "ns3/object.h"
+#include "ampdu-subframe-header.h"
+#include <list>
+
+namespace ns3 {
+
+class WifiMacHeader;
+
+/**
+ * \brief Abstract class that concrete mpdu aggregators have to implement
+ * \ingroup wifi
+ */
+class MpduAggregator : public Object
+{
+public:
+  /**
+   * A list of deaggregated packets and their A-MPDU subframe headers.
+   */
+  typedef std::list<std::pair<Ptr<Packet>, AmpduSubframeHeader> > DeaggregatedMpdus;
+  /**
+   * A constant iterator for a list of deaggregated packets and their A-MPDU subframe headers.
+   */
+  typedef std::list<std::pair<Ptr<Packet>, AmpduSubframeHeader> >::const_iterator DeaggregatedMpdusCI;
+
+  static TypeId GetTypeId (void);
+  /**
+   * \param packet Packet we have to insert into <i>aggregatedPacket</i>.
+   * \param aggregatedPacket Packet that will contain <i>packet</i>, if aggregation is possible.
+   *
+   * \return true if <i>packet</i> can be aggregated to <i>aggregatedPacket</i>, false otherwise.
+   *
+   * Adds <i>packet</i> to <i>aggregatedPacket</i>. In concrete aggregator's implementation is
+   * specified how and if <i>packet</i> can be added to <i>aggregatedPacket</i>.
+   */
+  virtual bool Aggregate (Ptr<const Packet> packet, Ptr<Packet> aggregatedPacket) = 0;
+  /**
+  * This method performs a VHT single MPDU aggregation.
+  */
+  virtual void AggregateVhtSingleMpdu (Ptr<const Packet> packet, Ptr<Packet> aggregatedPacket) = 0;
+  /**
+   * Adds A-MPDU subframe header and padding to each MPDU that is part of an A-MPDU before it is sent.
+   */
+  virtual void AddHeaderAndPad (Ptr<Packet> packet, bool last, bool vhtSingleMpdu) = 0;
+  /**
+   * \param packetSize size of the packet we want to insert into <i>aggregatedPacket</i>.
+   * \param aggregatedPacket packet that will contain the packet of size <i>packetSize</i>, if aggregation is possible.
+   * \param blockAckSize size of the piggybacked block ack request
+   *
+   * \return true if the packet of size <i>packetSize</i> can be aggregated to <i>aggregatedPacket</i>, false otherwise.
+   *
+   * This method is used to determine if a packet could be aggregated to an A-MPDU without exceeding the maximum packet size.
+   */
+  virtual bool CanBeAggregated (uint32_t packetSize, Ptr<Packet> aggregatedPacket, uint8_t blockAckSize) = 0;
+  /**
+   * \return padding that must be added to the end of an aggregated packet
+   *
+   * Calculates how much padding must be added to the end of an aggregated packet, after that a new packet is added.
+   * Each A-MPDU subframe is padded so that its length is multiple of 4 octets.
+   */
+  virtual uint32_t CalculatePadding (Ptr<const Packet> packet) = 0;
+  /**
+   * Deaggregates an A-MPDU by removing the A-MPDU subframe header and padding.
+   *
+   * \return list of deaggragted packets and their A-MPDU subframe headers
+   */
+  static DeaggregatedMpdus Deaggregate (Ptr<Packet> aggregatedPacket);
+};
+
+}  //namespace ns3
+
+#endif /* MPDU_AGGREGATOR_H */
diff -Naur ns-3.23/src/wifi/model/mpdu-standard-aggregator.cc ns-3.24/src/wifi/model/mpdu-standard-aggregator.cc
--- ns-3.23/src/wifi/model/mpdu-standard-aggregator.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mpdu-standard-aggregator.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,9 +17,9 @@
  *
  * Author: Ghada Badawy <gbadawy@gmail.com>
  */
+
 #include "ns3/log.h"
 #include "ns3/uinteger.h"
-
 #include "ampdu-subframe-header.h"
 #include "mpdu-standard-aggregator.h"
 
@@ -82,15 +82,45 @@
 }
 
 void
-MpduStandardAggregator::AddHeaderAndPad (Ptr<Packet> packet, bool last)
+MpduStandardAggregator::AggregateVhtSingleMpdu (Ptr<const Packet> packet, Ptr<Packet> aggregatedPacket)
 {
   NS_LOG_FUNCTION (this);
+  Ptr<Packet> currentPacket;
   AmpduSubframeHeader currentHdr;
-  //This is called to prepare packets from the aggregte queue to be sent so no need to check total size since it has already been
+
+  uint32_t padding = CalculatePadding (aggregatedPacket);
+  if (padding)
+    {
+      Ptr<Packet> pad = Create<Packet> (padding);
+      aggregatedPacket->AddAtEnd (pad);
+    }
+
+  currentHdr.SetEof (1);
+  currentHdr.SetCrc (1);
+  currentHdr.SetSig ();
+  currentHdr.SetLength (packet->GetSize ());
+  currentPacket = packet->Copy ();
+
+  currentPacket->AddHeader (currentHdr);
+  aggregatedPacket->AddAtEnd (currentPacket);
+}
+
+void
+MpduStandardAggregator::AddHeaderAndPad (Ptr<Packet> packet, bool last, bool vhtSingleMpdu)
+{
+  NS_LOG_FUNCTION (this);
+  AmpduSubframeHeader currentHdr;
+
+  //This is called to prepare packets from the aggregate queue to be sent so no need to check total size since it has already been
   //done before when deciding how many packets to add to the queue
   currentHdr.SetCrc (1);
   currentHdr.SetSig ();
   currentHdr.SetLength (packet->GetSize ());
+  if (vhtSingleMpdu)
+    {
+      currentHdr.SetEof (1);
+    }
+
   packet->AddHeader (currentHdr);
   uint32_t padding = CalculatePadding (packet);
 
@@ -126,4 +156,4 @@
   return (4 - (packet->GetSize () % 4 )) % 4;
 }
 
-}  // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/mpdu-standard-aggregator.h ns-3.24/src/wifi/model/mpdu-standard-aggregator.h
--- ns-3.23/src/wifi/model/mpdu-standard-aggregator.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/mpdu-standard-aggregator.h	2015-09-15 11:18:44.000000000 -0700
@@ -1,74 +1,84 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013
- *
- * 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: Ghada Badawy <gbadawy@gmail.com>
- */
-#ifndef MPDU_STANDARD_AGGREGATOR_H
-#define MPDU_STANDARD_AGGREGATOR_H
-
-#include "mpdu-aggregator.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- * Standard MPDU aggregator
- *
- */
-class MpduStandardAggregator : public MpduAggregator
-{
-public:
-  static TypeId GetTypeId (void);
-  MpduStandardAggregator ();
-  ~MpduStandardAggregator ();
-  /**
-   * \param packet packet we have to insert into <i>aggregatedPacket</i>.
-   * \param aggregatedPacket packet that will contain <i>packet</i>, if aggregation is possible.
-   * \return true if <i>packet</i> can be aggregated to <i>aggregatedPacket</i>, false otherwise.
-   *
-   * This method performs an MPDU aggregation.
-   * Returns true if <i>packet</i> can be aggregated to <i>aggregatedPacket</i>, false otherwise.
-   */
-  virtual bool Aggregate (Ptr<const Packet> packet, Ptr<Packet> aggregatedPacket);
-  /**
-   * Adds A-MPDU subframe header and padding to each MPDU that is part of an A-MPDU before it is sent.
-   */
-  virtual void AddHeaderAndPad (Ptr<Packet> packet, bool last);
-  /**
-   * \param packetSize size of the packet we want to insert into <i>aggregatedPacket</i>.
-   * \param aggregatedPacket packet that will contain the packet of size <i>packetSize</i>, if aggregation is possible.
-   * \param blockAckSize size of the piggybacked block ack request
-   * \return true if the packet of size <i>packetSize</i> can be aggregated to <i>aggregatedPacket</i>, false otherwise.
-   *
-   * This method is used to determine if a packet could be aggregated to an A-MPDU without exceeding the maximum packet size.
-   */
-  virtual bool CanBeAggregated (uint32_t packetSize, Ptr<Packet> aggregatedPacket, uint8_t blockAckSize);
-  /**
-   * \return padding that must be added to the end of an aggregated packet
-   *
-   * Calculates how much padding must be added to the end of an aggregated packet, after that a new packet is added.
-   * Each A-MPDU subframe is padded so that its length is multiple of 4 octets.
-   */
-  virtual uint32_t CalculatePadding (Ptr<const Packet> packet);
-
-private:
-  uint32_t m_maxAmpduLength; //!< Maximum length in bytes of A-MPDUs
-};
-
-}  // namespace ns3
-
-#endif /* MPDU_STANDARD_AGGREGATOR_H */
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013
+ *
+ * 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: Ghada Badawy <gbadawy@gmail.com>
+ */
+
+#ifndef MPDU_STANDARD_AGGREGATOR_H
+#define MPDU_STANDARD_AGGREGATOR_H
+
+#include "mpdu-aggregator.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ * Standard MPDU aggregator
+ *
+ */
+class MpduStandardAggregator : public MpduAggregator
+{
+public:
+  static TypeId GetTypeId (void);
+  MpduStandardAggregator ();
+  ~MpduStandardAggregator ();
+  /**
+   * \param packet packet we have to insert into <i>aggregatedPacket</i>.
+   * \param aggregatedPacket packet that will contain <i>packet</i>, if aggregation is possible.
+   *
+   * \return true if <i>packet</i> can be aggregated to <i>aggregatedPacket</i>,
+   *         false otherwise.
+   *
+   * This method performs an MPDU aggregation.
+   * Returns true if <i>packet</i> can be aggregated to <i>aggregatedPacket</i>, false otherwise.
+   */
+  virtual bool Aggregate (Ptr<const Packet> packet, Ptr<Packet> aggregatedPacket);
+  /**
+  * This method performs a VHT single MPDU aggregation.
+  */
+  virtual void AggregateVhtSingleMpdu (Ptr<const Packet> packet, Ptr<Packet> aggregatedPacket);
+  /**
+   * Adds A-MPDU subframe header and padding to each MPDU that is part of an A-MPDU before it is sent.
+   */
+  virtual void AddHeaderAndPad (Ptr<Packet> packet, bool last, bool vhtSingleMpdu);
+  /**
+   * \param packetSize size of the packet we want to insert into <i>aggregatedPacket</i>.
+   * \param aggregatedPacket packet that will contain the packet of size <i>packetSize</i>, if aggregation is possible.
+   * \param blockAckSize size of the piggybacked block ack request
+   *
+   * \return true if the packet of size <i>packetSize</i> can be aggregated to <i>aggregatedPacket</i>,
+   *         false otherwise.
+   *
+   * This method is used to determine if a packet could be aggregated to an A-MPDU without exceeding the maximum packet size.
+   */
+  virtual bool CanBeAggregated (uint32_t packetSize, Ptr<Packet> aggregatedPacket, uint8_t blockAckSize);
+  /**
+   * \return padding that must be added to the end of an aggregated packet
+   *
+   * Calculates how much padding must be added to the end of an aggregated packet, after that a new packet is added.
+   * Each A-MPDU subframe is padded so that its length is multiple of 4 octets.
+   */
+  virtual uint32_t CalculatePadding (Ptr<const Packet> packet);
+
+
+private:
+  uint32_t m_maxAmpduLength; //!< Maximum length in bytes of A-MPDUs
+};
+
+} //namespace ns3
+
+#endif /* MPDU_STANDARD_AGGREGATOR_H */
diff -Naur ns-3.23/src/wifi/model/msdu-aggregator.cc ns-3.24/src/wifi/model/msdu-aggregator.cc
--- ns-3.23/src/wifi/model/msdu-aggregator.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/msdu-aggregator.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "ns3/log.h"
 
 #include "msdu-aggregator.h"
@@ -74,4 +75,4 @@
   return set;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/msdu-aggregator.h ns-3.24/src/wifi/model/msdu-aggregator.h
--- ns-3.23/src/wifi/model/msdu-aggregator.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/msdu-aggregator.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,15 +17,14 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef MSDU_AGGREGATOR_H
 #define MSDU_AGGREGATOR_H
 
 #include "ns3/ptr.h"
 #include "ns3/packet.h"
 #include "ns3/object.h"
-
 #include "amsdu-subframe-header.h"
-
 #include <list>
 
 namespace ns3 {
@@ -53,6 +52,6 @@
   static DeaggregatedMsdus Deaggregate (Ptr<Packet> aggregatedPacket);
 };
 
-}  // namespace ns3
+} //namespace ns3
 
 #endif /* MSDU_AGGREGATOR_H */
diff -Naur ns-3.23/src/wifi/model/msdu-standard-aggregator.cc ns-3.24/src/wifi/model/msdu-standard-aggregator.cc
--- ns-3.23/src/wifi/model/msdu-standard-aggregator.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/msdu-standard-aggregator.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,9 +17,9 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "ns3/log.h"
 #include "ns3/uinteger.h"
-
 #include "amsdu-subframe-header.h"
 #include "msdu-standard-aggregator.h"
 
@@ -88,4 +88,4 @@
   return (4 - (packet->GetSize () % 4 )) % 4;
 }
 
-}  // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/msdu-standard-aggregator.h ns-3.24/src/wifi/model/msdu-standard-aggregator.h
--- ns-3.23/src/wifi/model/msdu-standard-aggregator.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/msdu-standard-aggregator.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef MSDU_STANDARD_AGGREGATOR_H
 #define MSDU_STANDARD_AGGREGATOR_H
 
@@ -40,7 +41,9 @@
    * \param aggregatedPacket Packet that will contain <i>packet</i>, if aggregation is possible,
    * \param src Source address of <i>packet</i>.
    * \param dest Destination address of <i>packet</i>.
-   * \return true if the packet can be aggregated, false otherwise
+   *
+   * \return true if the packet can be aggregated,
+   *         false otherwise
    *
    * This method performs an MSDU aggregation.
    * Returns true if <i>packet</i> can be aggregated to <i>aggregatedPacket</i>, false otherwise.
@@ -48,12 +51,13 @@
   virtual bool Aggregate (Ptr<const Packet> packet, Ptr<Packet> aggregatedPacket,
                           Mac48Address src, Mac48Address dest);
 private:
-  /** 
+  /**
    * Calculates how much padding must be added to the end of aggregated packet,
    * after that a new packet is added.
    * Each A-MSDU subframe is padded so that its length is multiple of 4 octets.
    *
    * \param packet
+   *
    * \return the number of octets required for padding
    */
   uint32_t CalculatePadding (Ptr<const Packet> packet);
@@ -61,6 +65,6 @@
   uint32_t m_maxAmsduLength;
 };
 
-}  // namespace ns3
+} //namespace ns3
 
 #endif /* MSDU_STANDARD_AGGREGATOR_H */
diff -Naur ns-3.23/src/wifi/model/nist-error-rate-model.cc ns-3.24/src/wifi/model/nist-error-rate-model.cc
--- ns-3.23/src/wifi/model/nist-error-rate-model.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/nist-error-rate-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -53,6 +53,7 @@
   NS_LOG_INFO ("bpsk snr=" << snr << " ber=" << ber);
   return ber;
 }
+
 double
 NistErrorRateModel::GetQpskBer (double snr) const
 {
@@ -61,6 +62,7 @@
   NS_LOG_INFO ("qpsk snr=" << snr << " ber=" << ber);
   return ber;
 }
+
 double
 NistErrorRateModel::Get16QamBer (double snr) const
 {
@@ -69,6 +71,7 @@
   NS_LOG_INFO ("16-Qam" << " snr=" << snr << " ber=" << ber);
   return ber;
 }
+
 double
 NistErrorRateModel::Get64QamBer (double snr) const
 {
@@ -78,6 +81,15 @@
   return ber;
 }
 double
+NistErrorRateModel::Get256QamBer (double snr) const
+{
+  double z = std::sqrt (snr / (85.0 * 2.0));
+  double ber = 15.0 / 32.0 * 0.5 * erfc (z);
+  NS_LOG_INFO ("256-Qam" << " snr=" << snr << " ber=" << ber);
+  return ber;
+}
+
+double
 NistErrorRateModel::GetFecBpskBer (double snr, uint32_t nbits,
                                    uint32_t bValue) const
 {
@@ -91,6 +103,7 @@
   double pms = std::pow (1 - pe, (double)nbits);
   return pms;
 }
+
 double
 NistErrorRateModel::GetFecQpskBer (double snr, uint32_t nbits,
                                    uint32_t bValue) const
@@ -105,6 +118,7 @@
   double pms = std::pow (1 - pe, (double)nbits);
   return pms;
 }
+
 double
 NistErrorRateModel::CalculatePe (double p, uint32_t bValue) const
 {
@@ -112,66 +126,62 @@
   double pe = 1.0;
   if (bValue == 1)
     {
-      // code rate 1/2, use table 3.1.1
-      pe = 0.5 * ( 36.0 * std::pow (D, 10)
-                   + 211.0 * std::pow (D, 12)
-                   + 1404.0 * std::pow (D, 14)
-                   + 11633.0 * std::pow (D, 16)
-                   + 77433.0 * std::pow (D, 18)
-                   + 502690.0 * std::pow (D, 20)
-                   + 3322763.0 * std::pow (D, 22)
-                   + 21292910.0 * std::pow (D, 24)
-                   + 134365911.0 * std::pow (D, 26)
-                   );
+      //code rate 1/2, use table 3.1.1
+      pe = 0.5 * (36.0 * std::pow (D, 10)
+                  + 211.0 * std::pow (D, 12)
+                  + 1404.0 * std::pow (D, 14)
+                  + 11633.0 * std::pow (D, 16)
+                  + 77433.0 * std::pow (D, 18)
+                  + 502690.0 * std::pow (D, 20)
+                  + 3322763.0 * std::pow (D, 22)
+                  + 21292910.0 * std::pow (D, 24)
+                  + 134365911.0 * std::pow (D, 26));
     }
   else if (bValue == 2)
     {
-      // code rate 2/3, use table 3.1.2
+      //code rate 2/3, use table 3.1.2
       pe = 1.0 / (2.0 * bValue) *
-        ( 3.0 * std::pow (D, 6)
-          + 70.0 * std::pow (D, 7)
-          + 285.0 * std::pow (D, 8)
-          + 1276.0 * std::pow (D, 9)
-          + 6160.0 * std::pow (D, 10)
-          + 27128.0 * std::pow (D, 11)
-          + 117019.0 * std::pow (D, 12)
-          + 498860.0 * std::pow (D, 13)
-          + 2103891.0 * std::pow (D, 14)
-          + 8784123.0 * std::pow (D, 15)
-        );
+        (3.0 * std::pow (D, 6)
+         + 70.0 * std::pow (D, 7)
+         + 285.0 * std::pow (D, 8)
+         + 1276.0 * std::pow (D, 9)
+         + 6160.0 * std::pow (D, 10)
+         + 27128.0 * std::pow (D, 11)
+         + 117019.0 * std::pow (D, 12)
+         + 498860.0 * std::pow (D, 13)
+         + 2103891.0 * std::pow (D, 14)
+         + 8784123.0 * std::pow (D, 15));
     }
   else if (bValue == 3)
     {
-      // code rate 3/4, use table 3.1.2
+      //code rate 3/4, use table 3.1.2
       pe = 1.0 / (2.0 * bValue) *
-        ( 42.0 * std::pow (D, 5)
-          + 201.0 * std::pow (D, 6)
-          + 1492.0 * std::pow (D, 7)
-          + 10469.0 * std::pow (D, 8)
-          + 62935.0 * std::pow (D, 9)
-          + 379644.0 * std::pow (D, 10)
-          + 2253373.0 * std::pow (D, 11)
-          + 13073811.0 * std::pow (D, 12)
-          + 75152755.0 * std::pow (D, 13)
-          + 428005675.0 * std::pow (D, 14)
-        );
+        (42.0 * std::pow (D, 5)
+         + 201.0 * std::pow (D, 6)
+         + 1492.0 * std::pow (D, 7)
+         + 10469.0 * std::pow (D, 8)
+         + 62935.0 * std::pow (D, 9)
+         + 379644.0 * std::pow (D, 10)
+         + 2253373.0 * std::pow (D, 11)
+         + 13073811.0 * std::pow (D, 12)
+         + 75152755.0 * std::pow (D, 13)
+         + 428005675.0 * std::pow (D, 14));
     }
   else if (bValue == 5)
     {
-      // code rate 5/6, use table V from D. Haccoun and G. Begin, "High-Rate Punctured Convolutional Codes 
-      // for Viterbi Sequential Decoding", IEEE Transactions on Communications, Vol. 32, Issue 3, pp.315-319.
+      //code rate 5/6, use table V from D. Haccoun and G. Begin, "High-Rate Punctured Convolutional Codes
+      //for Viterbi Sequential Decoding", IEEE Transactions on Communications, Vol. 32, Issue 3, pp.315-319.
       pe = 1.0 / (2.0 * bValue) *
-        ( 92.0 * std::pow (D, 4.0)
-          + 528.0 * std::pow (D, 5.0)
-          + 8694.0 * std::pow (D, 6.0)
-          + 79453.0 * std::pow (D, 7.0)
-          + 792114.0 * std::pow (D, 8.0)
-          + 7375573.0 * std::pow (D, 9.0)
-          + 67884974.0 * std::pow (D, 10.0)
-          + 610875423.0 * std::pow (D, 11.0)
-          + 5427275376.0 * std::pow (D, 12.0)
-          + 47664215639.0 * std::pow (D, 13.0)
-        );
+        (92.0 * std::pow (D, 4.0)
+         + 528.0 * std::pow (D, 5.0)
+         + 8694.0 * std::pow (D, 6.0)
+         + 79453.0 * std::pow (D, 7.0)
+         + 792114.0 * std::pow (D, 8.0)
+         + 7375573.0 * std::pow (D, 9.0)
+         + 67884974.0 * std::pow (D, 10.0)
+         + 610875423.0 * std::pow (D, 11.0)
+         + 5427275376.0 * std::pow (D, 12.0)
+         + 47664215639.0 * std::pow (D, 13.0));
     }
   else
     {
@@ -194,6 +204,7 @@
   double pms = std::pow (1 - pe, static_cast<double> (nbits));
   return pms;
 }
+
 double
 NistErrorRateModel::GetFec64QamBer (double snr, uint32_t nbits,
                                     uint32_t bValue) const
@@ -208,91 +219,117 @@
   double pms = std::pow (1 - pe, static_cast<double> (nbits));
   return pms;
 }
+
+double
+NistErrorRateModel::GetFec256QamBer (double snr, uint32_t nbits,
+                                     uint32_t bValue) const
+{
+  double ber = Get256QamBer (snr);
+  if (ber == 0.0)
+    {
+      return 1.0;
+    }
+  double pe = CalculatePe (ber, bValue);
+  pe = std::min (pe, 1.0);
+  double pms = std::pow (1 - pe, static_cast<double> (nbits));
+  return pms;
+}
+
 double
-NistErrorRateModel::GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const
+NistErrorRateModel::GetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint32_t nbits) const
 {
   if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM
-      || mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM|| mode.GetModulationClass()==WIFI_MOD_CLASS_HT)
+      || mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM
+      || mode.GetModulationClass () == WIFI_MOD_CLASS_HT
+      || mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
     {
-      if (mode.GetConstellationSize () == 2)
+      if (mode.GetConstellationSize (1) == 2)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_1_2)
             {
               return GetFecBpskBer (snr,
                                     nbits,
-                                    1 // b value
-                                    );
+                                    1); //b value
             }
           else
             {
               return GetFecBpskBer (snr,
                                     nbits,
-                                    3 // b value
-                                    );
+                                    3); //b value
             }
         }
-      else if (mode.GetConstellationSize () == 4)
+      else if (mode.GetConstellationSize (1) == 4)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_1_2)
             {
               return GetFecQpskBer (snr,
                                     nbits,
-                                    1 // b value
-                                    );
+                                    1); //b value
             }
           else
             {
               return GetFecQpskBer (snr,
                                     nbits,
-                                    3 // b value
-                                    );
+                                    3); //b value
             }
         }
-      else if (mode.GetConstellationSize () == 16)
+      else if (mode.GetConstellationSize (1) == 16)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_1_2)
             {
               return GetFec16QamBer (snr,
                                      nbits,
-                                     1 // b value
-                                     );
+                                     1); //b value
             }
           else
             {
               return GetFec16QamBer (snr,
                                      nbits,
-                                     3 // b value
-                                     );
+                                     3); //b value
             }
         }
-      else if (mode.GetConstellationSize () == 64)
+      else if (mode.GetConstellationSize (1) == 64)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_2_3)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_2_3)
+            {
+              return GetFec64QamBer (snr,
+                                     nbits,
+                                     2); //b value
+            }
+          else if (mode.GetCodeRate (1) == WIFI_CODE_RATE_5_6)
+            {
+              return GetFec64QamBer (snr,
+                                     nbits,
+                                     5); //b value
+            }
+          else
             {
               return GetFec64QamBer (snr,
                                      nbits,
-                                     2 // b value
-                                     );
+                                     3); //b value
+            }
+        }
+      else if (mode.GetConstellationSize (1) == 256)
+        {
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_5_6)
+            {
+              return GetFec256QamBer (snr,
+                                      nbits,
+                                      5     // b value
+                                      );
+            }
+          else
+            {
+              return GetFec256QamBer (snr,
+                                      nbits,
+                                      3     // b value
+                                      );
             }
-          else if (mode.GetCodeRate () == WIFI_CODE_RATE_5_6)
-                 {
-                   return GetFec64QamBer (snr,
-                                          nbits,
-                                          5 // b value
-                                          );
-                 }
-               else
-                 {
-                   return GetFec64QamBer (snr,
-                                          nbits,
-                                          3 // b value
-                                          );
-                 }
         }
     }
-  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS)
+  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS || mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS)
     {
-      switch (mode.GetDataRate ())
+      switch (mode.GetDataRate (20, 0, 1))
         {
         case 1000000:
           return DsssErrorRateModel::GetDsssDbpskSuccessRate (snr, nbits);
@@ -302,9 +339,11 @@
           return DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (snr, nbits);
         case 11000000:
           return DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (snr, nbits);
+        default:
+          NS_ASSERT ("undefined DSSS/HR-DSSS datarate");
         }
     }
   return 0;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/nist-error-rate-model.h ns-3.24/src/wifi/model/nist-error-rate-model.h
--- ns-3.23/src/wifi/model/nist-error-rate-model.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/nist-error-rate-model.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Gary Pei <guangyu.pei@boeing.com>
  */
+
 #ifndef NIST_ERROR_RATE_MODEL_H
 #define NIST_ERROR_RATE_MODEL_H
 
@@ -42,7 +43,8 @@
 
   NistErrorRateModel ();
 
-  virtual double GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const;
+  virtual double GetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint32_t nbits) const;
+
 
 private:
   /**
@@ -50,6 +52,7 @@
    *
    * \param p
    * \param bValue
+   *
    * \return BER
    */
   double CalculatePe (double p, uint32_t bValue) const;
@@ -57,6 +60,7 @@
    * Return BER of BPSK at the given SNR.
    *
    * \param snr snr value
+   *
    * \return BER of BPSK at the given SNR
    */
   double GetBpskBer (double snr) const;
@@ -64,6 +68,7 @@
    * Return BER of QPSK at the given SNR.
    *
    * \param snr snr value
+   *
    * \return BER of QPSK at the given SNR
    */
   double GetQpskBer (double snr) const;
@@ -71,6 +76,7 @@
    * Return BER of QAM16 at the given SNR.
    *
    * \param snr snr value
+   *
    * \return BER of QAM16 at the given SNR
    */
   double Get16QamBer (double snr) const;
@@ -78,15 +84,24 @@
    * Return BER of QAM64 at the given SNR.
    *
    * \param snr snr value
+   *
    * \return BER of QAM64 at the given SNR
    */
   double Get64QamBer (double snr) const;
   /**
+   * Return BER of QAM256 at the given SNR.
+   *
+   * \param snr snr value
+   * \return BER of QAM256 at the given SNR
+   */
+  double Get256QamBer (double snr) const;
+  /**
    * Return BER of BPSK at the given SNR after applying FEC.
    *
    * \param snr snr value
    * \param nbits the number of bits in the chunk
    * \param bValue
+   *
    * \return BER of BPSK at the given SNR after applying FEC
    */
   double GetFecBpskBer (double snr, uint32_t nbits,
@@ -97,6 +112,7 @@
    * \param snr snr value
    * \param nbits the number of bits in the chunk
    * \param bValue
+   *
    * \return BER of QPSK at the given SNR after applying FEC
    */
   double GetFecQpskBer (double snr, uint32_t nbits,
@@ -107,6 +123,7 @@
    * \param snr snr value
    * \param nbits the number of bits in the chunk
    * \param bValue
+   *
    * \return BER of QAM16 at the given SNR after applying FEC
    */
   double GetFec16QamBer (double snr, uint32_t nbits,
@@ -117,13 +134,23 @@
    * \param snr snr value
    * \param nbits the number of bits in the chunk
    * \param bValue
+   *
    * \return BER of QAM64 at the given SNR after applying FEC
    */
   double GetFec64QamBer (double snr, uint32_t nbits,
                          uint32_t bValue) const;
+  /**
+   * Return BER of QAM256 at the given SNR after applying FEC.
+   *
+   * \param snr snr value
+   * \param nbits the number of bits in the chunk
+   * \param bValue
+   * \return BER of QAM256 at the given SNR after applying FEC
+   */
+  double GetFec256QamBer (double snr, uint32_t nbits,
+                          uint32_t bValue) const;
 };
 
-
-} // namespace ns3
+} //namespace ns3
 
 #endif /* NIST_ERROR_RATE_MODEL_H */
diff -Naur ns-3.23/src/wifi/model/onoe-wifi-manager.cc ns-3.24/src/wifi/model/onoe-wifi-manager.cc
--- ns-3.23/src/wifi/model/onoe-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/onoe-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -47,7 +47,6 @@
   uint32_t m_txrate;
 };
 
-
 NS_OBJECT_ENSURE_REGISTERED (OnoeWifiManager);
 
 TypeId
@@ -77,6 +76,7 @@
 OnoeWifiManager::OnoeWifiManager ()
 {
 }
+
 WifiRemoteStation *
 OnoeWifiManager::DoCreateStation (void) const
 {
@@ -91,28 +91,33 @@
   station->m_txrate = 0;
   return station;
 }
+
 void
 OnoeWifiManager::DoReportRxOk (WifiRemoteStation *station,
                                double rxSnr, WifiMode txMode)
 {
 }
+
 void
 OnoeWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
 {
   OnoeWifiRemoteStation *station = (OnoeWifiRemoteStation *)st;
   station->m_shortRetry++;
 }
+
 void
 OnoeWifiManager::DoReportDataFailed (WifiRemoteStation *st)
 {
   OnoeWifiRemoteStation *station = (OnoeWifiRemoteStation *)st;
   station->m_longRetry++;
 }
+
 void
 OnoeWifiManager::DoReportRtsOk (WifiRemoteStation *station,
                                 double ctsSnr, WifiMode ctsMode, double rtsSnr)
 {
 }
+
 void
 OnoeWifiManager::DoReportDataOk (WifiRemoteStation *st,
                                  double ackSnr, WifiMode ackMode, double dataSnr)
@@ -121,6 +126,7 @@
   UpdateRetry (station);
   station->m_tx_ok++;
 }
+
 void
 OnoeWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
 {
@@ -128,6 +134,7 @@
   UpdateRetry (station);
   station->m_tx_err++;
 }
+
 void
 OnoeWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
 {
@@ -135,6 +142,7 @@
   UpdateRetry (station);
   station->m_tx_err++;
 }
+
 void
 OnoeWifiManager::UpdateRetry (OnoeWifiRemoteStation *station)
 {
@@ -142,6 +150,7 @@
   station->m_shortRetry = 0;
   station->m_longRetry = 0;
 }
+
 void
 OnoeWifiManager::UpdateMode (OnoeWifiRemoteStation *station)
 {
@@ -226,7 +235,7 @@
 
 WifiTxVector
 OnoeWifiManager::DoGetDataTxVector (WifiRemoteStation *st,
-                                uint32_t size)
+                                    uint32_t size)
 {
   OnoeWifiRemoteStation *station = (OnoeWifiRemoteStation *)st;
   UpdateMode (station);
@@ -269,15 +278,28 @@
           rateIndex = station->m_txrate;
         }
     }
-  return WifiTxVector (GetSupported (station, rateIndex), GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, rateIndex), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
+
 WifiTxVector
 OnoeWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
 {
   OnoeWifiRemoteStation *station = (OnoeWifiRemoteStation *)st;
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
   UpdateMode (station);
   /// \todo can we implement something smarter ?
-  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
 bool
@@ -286,4 +308,4 @@
   return false;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/onoe-wifi-manager.h ns-3.24/src/wifi/model/onoe-wifi-manager.h
--- ns-3.23/src/wifi/model/onoe-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/onoe-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef ONOE_WIFI_MANAGER_H
 #define ONOE_WIFI_MANAGER_H
 
@@ -45,8 +46,9 @@
 
   OnoeWifiManager ();
 
+
 private:
-  // overriden from base class
+  //overriden from base class
   virtual WifiRemoteStation * DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
@@ -75,6 +77,6 @@
   uint32_t m_raiseThreshold;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* ONOE_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/originator-block-ack-agreement.cc ns-3.24/src/wifi/model/originator-block-ack-agreement.cc
--- ns-3.23/src/wifi/model/originator-block-ack-agreement.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/originator-block-ack-agreement.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,9 +15,10 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: Mirko Banchi <mk.banchi@gmail.com>
- * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ * Authors: Mirko Banchi <mk.banchi@gmail.com>
+ *          Tommaso Pecorella <tommaso.pecorella@unifi.it>
  */
+
 #include "originator-block-ack-agreement.h"
 
 namespace ns3 {
@@ -29,6 +30,7 @@
     m_needBlockAckReq (false)
 {
 }
+
 OriginatorBlockAckAgreement::OriginatorBlockAckAgreement (Mac48Address recipient, uint8_t tid)
   : BlockAckAgreement (recipient, tid),
     m_state (PENDING),
@@ -36,9 +38,11 @@
     m_needBlockAckReq (false)
 {
 }
+
 OriginatorBlockAckAgreement::~OriginatorBlockAckAgreement ()
 {
 }
+
 void
 OriginatorBlockAckAgreement::SetState (enum State state)
 {
@@ -49,26 +53,31 @@
       m_sentMpdus = 0;
     }
 }
+
 bool
 OriginatorBlockAckAgreement::IsPending (void) const
 {
   return (m_state == PENDING) ? true : false;
 }
+
 bool
 OriginatorBlockAckAgreement::IsEstablished (void) const
 {
   return (m_state == ESTABLISHED) ? true : false;
 }
+
 bool
 OriginatorBlockAckAgreement::IsInactive (void) const
 {
   return (m_state == INACTIVE) ? true : false;
 }
+
 bool
 OriginatorBlockAckAgreement::IsUnsuccessful (void) const
 {
   return (m_state == UNSUCCESSFUL) ? true : false;
 }
+
 void
 OriginatorBlockAckAgreement::NotifyMpduTransmission (uint16_t nextSeqNumber)
 {
@@ -81,11 +90,13 @@
       m_needBlockAckReq = true;
     }
 }
+
 bool
 OriginatorBlockAckAgreement::IsBlockAckRequestNeeded (void) const
 {
   return m_needBlockAckReq;
 }
+
 void
 OriginatorBlockAckAgreement::CompleteExchange (void)
 {
@@ -93,4 +104,4 @@
   m_sentMpdus = 0;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/originator-block-ack-agreement.h ns-3.24/src/wifi/model/originator-block-ack-agreement.h
--- ns-3.23/src/wifi/model/originator-block-ack-agreement.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/originator-block-ack-agreement.h	2015-09-15 11:18:44.000000000 -0700
@@ -33,6 +33,8 @@
 class OriginatorBlockAckAgreement : public BlockAckAgreement
 {
   friend class BlockAckManager;
+
+
 public:
   OriginatorBlockAckAgreement ();
   OriginatorBlockAckAgreement (Mac48Address recipient, uint8_t tid);
@@ -138,12 +140,13 @@
   bool IsBlockAckRequestNeeded (void) const;
   void CompleteExchange (void);
 
+
 private:
   enum State m_state;
   uint16_t m_sentMpdus;
   bool m_needBlockAckReq;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* ORIGINATOR_BLOCK_ACK_AGREEMENT_H */
diff -Naur ns-3.23/src/wifi/model/parf-wifi-manager.cc ns-3.24/src/wifi/model/parf-wifi-manager.cc
--- ns-3.23/src/wifi/model/parf-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/parf-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -29,7 +29,6 @@
 
 NS_LOG_COMPONENT_DEFINE ("ns3::ParfWifiManager");
 
-
 namespace ns3 {
 
 /**
@@ -40,19 +39,16 @@
  */
 struct ParfWifiRemoteStation : public WifiRemoteStation
 {
-  uint32_t m_nAttempt; //!< Number of transmission attempts.
-  uint32_t m_nSuccess; //!< Number of successful transmission attempts.
-  uint32_t m_nFail; //!< Number of failed transmission attempts.
-  bool m_usingRecoveryRate; //!< If using recovery rate.
+  uint32_t m_nAttempt;       //!< Number of transmission attempts.
+  uint32_t m_nSuccess;       //!< Number of successful transmission attempts.
+  uint32_t m_nFail;          //!< Number of failed transmission attempts.
+  bool m_usingRecoveryRate;  //!< If using recovery rate.
   bool m_usingRecoveryPower; //!< If using recovery power.
-  uint32_t m_nRetry; //!< Number of transmission retries.
-
-  uint32_t m_currentRate; //!< Current rate used by the remote station.
-
-  uint8_t m_currentPower; //!< Current power used by the remote station.
-
-  uint32_t m_nSupported; //!< Number of supported rates by the remote station.
-  bool m_initialized; //!< For initializing variables.
+  uint32_t m_nRetry;         //!< Number of transmission retries.
+  uint32_t m_currentRate;    //!< Current rate used by the remote station.
+  uint8_t m_currentPower;    //!< Current power used by the remote station.
+  uint32_t m_nSupported;     //!< Number of supported rates by the remote station.
+  bool m_initialized;        //!< For initializing variables.
 };
 
 NS_OBJECT_ENSURE_REGISTERED (ParfWifiManager);
@@ -77,11 +73,11 @@
     .AddTraceSource ("PowerChange",
                      "The transmission power has change",
                      MakeTraceSourceAccessor (&ParfWifiManager::m_powerChange),
-                     "ns3::ParfWifiManager::PowerChangeTracedCallback")
+                     "ns3::WifiRemoteStationManager::PowerChangeTracedCallback")
     .AddTraceSource ("RateChange",
                      "The transmission rate has change",
                      MakeTraceSourceAccessor (&ParfWifiManager::m_rateChange),
-                     "ns3::ParfWifiManager::RateChangeTracedCallback")
+                     "ns3::WifiRemoteStationManager::RateChangeTracedCallback")
   ;
   return tid;
 }
@@ -90,6 +86,7 @@
 {
   NS_LOG_FUNCTION (this);
 }
+
 ParfWifiManager::~ParfWifiManager ()
 {
   NS_LOG_FUNCTION (this);
@@ -98,7 +95,8 @@
 void
 ParfWifiManager::SetupPhy (Ptr<WifiPhy> phy)
 {
-  m_nPower = phy->GetNTxPower ();
+  m_minPower = phy->GetTxPowerStart ();
+  m_maxPower = phy->GetTxPowerEnd ();
   WifiRemoteStationManager::SetupPhy (phy);
 }
 
@@ -129,7 +127,7 @@
     {
       station->m_nSupported = GetNSupported (station);
       station->m_currentRate = station->m_nSupported - 1;
-      station->m_currentPower = m_nPower - 1;
+      station->m_currentPower = m_maxPower;
       m_powerChange (station->m_currentPower, station->m_state->m_address);
       m_rateChange (station->m_currentRate, station->m_state->m_address);
       station->m_initialized = true;
@@ -141,6 +139,7 @@
 {
   NS_LOG_FUNCTION (this << station);
 }
+
 /**
  * \internal
  * It is important to realize that "recovery" mode starts after failure of
@@ -169,7 +168,7 @@
       NS_ASSERT (station->m_nRetry >= 1);
       if (station->m_nRetry == 1)
         {
-          // need recovery fallback
+          //need recovery fallback
           if (station->m_currentRate != 0)
             {
               NS_LOG_DEBUG ("station=" << station << " dec rate");
@@ -185,8 +184,8 @@
       NS_ASSERT (station->m_nRetry >= 1);
       if (station->m_nRetry == 1)
         {
-          // need recovery fallback
-          if (station->m_currentPower < m_nPower - 1)
+          //need recovery fallback
+          if (station->m_currentPower < m_maxPower)
             {
               NS_LOG_DEBUG ("station=" << station << " inc power");
               station->m_currentPower++;
@@ -201,8 +200,8 @@
       NS_ASSERT (station->m_nRetry >= 1);
       if (((station->m_nRetry - 1) % 2) == 1)
         {
-          // need normal fallback
-          if (station->m_currentPower == m_nPower - 1)
+          //need normal fallback
+          if (station->m_currentPower == m_maxPower)
             {
               if (station->m_currentRate != 0)
                 {
@@ -224,18 +223,21 @@
         }
     }
 }
+
 void
 ParfWifiManager::DoReportRxOk (WifiRemoteStation *station,
                                double rxSnr, WifiMode txMode)
 {
   NS_LOG_FUNCTION (this << station << rxSnr << txMode);
 }
+
 void ParfWifiManager::DoReportRtsOk (WifiRemoteStation *station,
                                      double ctsSnr, WifiMode ctsMode, double rtsSnr)
 {
   NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
   NS_LOG_DEBUG ("station=" << station << " rts ok");
 }
+
 void ParfWifiManager::DoReportDataOk (WifiRemoteStation *st,
                                       double ackSnr, WifiMode ackMode, double dataSnr)
 {
@@ -263,7 +265,7 @@
   else if (station->m_nSuccess == m_successThreshold || station->m_nAttempt == m_attemptThreshold)
     {
       //we are at the maximum rate, we decrease power
-      if (station->m_currentPower != 0)
+      if (station->m_currentPower != m_minPower)
         {
           NS_LOG_DEBUG ("station=" << station << " dec power");
           station->m_currentPower--;
@@ -274,11 +276,13 @@
       station->m_usingRecoveryPower = true;
     }
 }
+
 void
 ParfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
 {
   NS_LOG_FUNCTION (this << station);
 }
+
 void
 ParfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
 {
@@ -290,9 +294,16 @@
 {
   NS_LOG_FUNCTION (this << st << size);
   ParfWifiRemoteStation *station = (ParfWifiRemoteStation *) st;
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
   CheckInit (station);
-  return WifiTxVector (GetSupported (station, station->m_currentRate), station->m_currentPower, GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas ()), GetNumberOfTransmitAntennas (station), GetStbc (station));
+  return WifiTxVector (GetSupported (station, station->m_currentRate), station->m_currentPower, GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
+
 WifiTxVector
 ParfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
 {
@@ -300,7 +311,13 @@
   /// \todo we could/should implement the Arf algorithm for
   /// RTS only by picking a single rate within the BasicRateSet.
   ParfWifiRemoteStation *station = (ParfWifiRemoteStation *) st;
-  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas ()), GetNumberOfTransmitAntennas (station), GetStbc (station));
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (station, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
 bool
@@ -309,4 +326,5 @@
   NS_LOG_FUNCTION (this);
   return true;
 }
-} // namespace ns3
+
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/parf-wifi-manager.h ns-3.24/src/wifi/model/parf-wifi-manager.h
--- ns-3.23/src/wifi/model/parf-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/parf-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -50,24 +50,9 @@
 
   virtual void SetupPhy (Ptr<WifiPhy> phy);
 
-  /**
-   * TracedCallback signature for power change events.
-   *
-   * \param [in] power The new power.
-   * \param [in] address The remote station MAC address.
-   */
-  typedef void (*PowerChangeTracedCallback)(const uint8_t power, const Mac48Address remoteAddress);
-
-  /**
-   * TracedCallback signature for rate change events.
-   *
-   * \param [in] rate The new rate.
-   * \param [in] address The remote station MAC address.
-   */
-  typedef void (*RateChangeTracedCallback)(const uint32_t rate, const Mac48Address remoteAddress);
 
 private:
-  // overriden from base class
+  //overriden from base class
   virtual WifiRemoteStation * DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
@@ -89,15 +74,20 @@
    */
   void CheckInit (ParfWifiRemoteStation *station);
 
-
   uint32_t m_attemptThreshold; //!< The minimum number of transmission attempts to try a new power or rate. The 'timer' threshold in the ARF algorithm.
   uint32_t m_successThreshold; //!< The minimum number of successful transmissions to try a new power or rate.
+  
   /**
-   * Number of power levels.
+   * Minimal power level.
    * In contrast to rate, power levels do not depend on the remote station.
    * The levels depend only on the physical layer of the device.
    */
-  uint32_t m_nPower;
+  uint32_t m_minPower;
+
+  /**
+   * Maximal power level.
+   */
+  uint32_t m_maxPower;
 
   /**
    * The trace source fired when the transmission power changes....
@@ -110,6 +100,6 @@
 
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* PARF_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/qos-blocked-destinations.cc ns-3.24/src/wifi/model/qos-blocked-destinations.cc
--- ns-3.23/src/wifi/model/qos-blocked-destinations.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/qos-blocked-destinations.cc	2015-09-15 11:18:44.000000000 -0700
@@ -18,6 +18,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "qos-blocked-destinations.h"
 
 namespace ns3 {
@@ -65,4 +66,4 @@
     }
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/qos-blocked-destinations.h ns-3.24/src/wifi/model/qos-blocked-destinations.h
--- ns-3.23/src/wifi/model/qos-blocked-destinations.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/qos-blocked-destinations.h	2015-09-15 11:18:44.000000000 -0700
@@ -18,6 +18,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef QOS_BLOCKED_DESTINATIONS_H
 #define QOS_BLOCKED_DESTINATIONS_H
 
@@ -58,11 +59,13 @@
    *
    * \param dest
    * \param tid
-   * \return true if the given destination address and TID are blocked
-   *         from sending, false otherwise
+   *
+   * \return true if the given destination address and TID are blocked from sending,
+   *         false otherwise
    */
   bool IsBlocked (Mac48Address dest, uint8_t tid) const;
 
+
 private:
   /**
    * typedef for a list of <Mac48Address, TID> pair.
@@ -79,6 +82,6 @@
   BlockedPackets m_blockedQosPackets;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* QOS_BLOCKED_DESTINATIONS_H */
diff -Naur ns-3.23/src/wifi/model/qos-tag.cc ns-3.24/src/wifi/model/qos-tag.cc
--- ns-3.23/src/wifi/model/qos-tag.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/qos-tag.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "qos-tag.h"
 #include "ns3/tag.h"
 #include "ns3/uinteger.h"
diff -Naur ns-3.23/src/wifi/model/qos-tag.h ns-3.24/src/wifi/model/qos-tag.h
--- ns-3.23/src/wifi/model/qos-tag.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/qos-tag.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef QOS_TAG_H
 #define QOS_TAG_H
 
@@ -48,7 +49,6 @@
 };
 
 
-
 /**
  * \ingroup wifi
  *
@@ -81,7 +81,7 @@
    * application is aware of the QoS support provided by the MAC
    * layer, and is therefore able to set the correct TID.
    *
-   * @param tid the value of the TID to set
+   * \param tid the value of the TID to set
    */
   void SetTid (uint8_t tid);
 
@@ -92,7 +92,7 @@
    * EDCA is used. When using HDCA, QosTag(uint8_t tid) should be used
    * instead.
    *
-   * @param up the requested UserPriority
+   * \param up the requested UserPriority
    *
    */
   void SetUserPriority (UserPriority up);
@@ -113,6 +113,6 @@
   uint8_t m_tid;  //!< Traffic ID
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* QOS_TAG_H */
diff -Naur ns-3.23/src/wifi/model/qos-utils.cc ns-3.24/src/wifi/model/qos-utils.cc
--- ns-3.23/src/wifi/model/qos-utils.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/qos-utils.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,9 +15,10 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: Mirko Banchi <mk.banchi@gmail.com>
- * Author: Cecchi Niccolò <insa@igeek.it>
+ * Authors: Mirko Banchi <mk.banchi@gmail.com>
+ *          Cecchi Niccolò <insa@igeek.it>
  */
+
 #include "qos-utils.h"
 #include "qos-tag.h"
 
@@ -26,6 +27,7 @@
 AcIndex
 QosUtilsMapTidToAc (uint8_t tid)
 {
+  NS_ASSERT_MSG (tid < 8, "Tid " << (uint16_t) tid << " out of range");
   switch (tid)
     {
     case 0:
@@ -91,4 +93,4 @@
   return (distance >= 2048);
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/qos-utils.h ns-3.24/src/wifi/model/qos-utils.h
--- ns-3.23/src/wifi/model/qos-utils.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/qos-utils.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef QOS_UTILS_H
 #define QOS_UTILS_H
 
@@ -42,7 +43,6 @@
   AC_VI = 2,
   /** Voice */
   AC_VO = 3,
-
   /** Total number of ACs */
   AC_BE_NQOS = 4,
   AC_UNDEF
@@ -64,6 +64,7 @@
  * A value >= 8 is returned otherwise.
  *
  * \param packet the packet to checked for a QoS tag
+ *
  * \return a value less than 8 if QoS tag was present, a value >= 8
  *         is returned if no QoS tag was present
  */
@@ -77,6 +78,7 @@
  *
  * \param seqControl the sequence control field
  * \param endSequence
+ *
  * \return a unique integer for the given sequence control and end sequence
  */
 uint32_t QosUtilsMapSeqControlToUniqueInteger (uint16_t seqControl, uint16_t endSequence);
@@ -115,10 +117,11 @@
  *
  * \param startingSeq the starting sequence number
  * \param seqNumber the sequence number to be checked
+ *
  * \return true if the packet is old, false otherwise
  */
 bool QosUtilsIsOldPacket (uint16_t startingSeq, uint16_t seqNumber);
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* QOS_UTILS_H */
diff -Naur ns-3.23/src/wifi/model/random-stream.cc ns-3.24/src/wifi/model/random-stream.cc
--- ns-3.23/src/wifi/model/random-stream.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/random-stream.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,9 +17,9 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "random-stream.h"
 #include "ns3/assert.h"
-
 #include <cmath>
 
 namespace ns3 {
@@ -68,4 +68,4 @@
   return 0;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/random-stream.h ns-3.24/src/wifi/model/random-stream.h
--- ns-3.23/src/wifi/model/random-stream.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/random-stream.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef RANDOM_STREAM_H
 #define RANDOM_STREAM_H
 
@@ -39,42 +40,48 @@
    *
    * \param min lower bound (inclusive)
    * \param max upper bound (inclusive)
+   *
    * \return a random number between min and max (including min and max)
    */
   virtual uint32_t GetNext (uint32_t min, uint32_t max) = 0;
 
- /**
-  * 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
-  */
+  /**
+   * 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
+   */
   virtual int64_t AssignStreams (int64_t stream) = 0;
 };
 
+
 class RealRandomStream : public RandomStream
 {
 public:
   RealRandomStream ();
   virtual uint32_t GetNext (uint32_t min, uint32_t max);
 
- /**
-  * 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
-  */
+  /**
+   * 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
+   */
   virtual int64_t AssignStreams (int64_t stream);
 
+
 private:
   /// Provides uniform random variables.
   Ptr<UniformRandomVariable> m_stream;
 };
 
+
 class TestRandomStream : public RandomStream
 {
 public:
@@ -86,20 +93,22 @@
   void AddNext (uint32_t v);
   virtual uint32_t GetNext (uint32_t min, uint32_t max);
 
- /**
-  * 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
-  */
+  /**
+   * 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
+   */
   virtual int64_t AssignStreams (int64_t stream);
 
+
 private:
   std::list<uint32_t> m_nexts;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* RANDOM_STREAM_H */
diff -Naur ns-3.23/src/wifi/model/regular-wifi-mac.cc ns-3.24/src/wifi/model/regular-wifi-mac.cc
--- ns-3.23/src/wifi/model/regular-wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/regular-wifi-mac.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,21 +17,19 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
-#include "regular-wifi-mac.h"
 
+#include "regular-wifi-mac.h"
 #include "ns3/log.h"
 #include "ns3/boolean.h"
 #include "ns3/pointer.h"
 #include "ns3/uinteger.h"
 #include "ns3/trace-source-accessor.h"
-
 #include "mac-rx-middle.h"
 #include "mac-tx-middle.h"
 #include "mac-low.h"
 #include "dcf.h"
 #include "dcf-manager.h"
 #include "wifi-phy.h"
-
 #include "msdu-aggregator.h"
 
 namespace ns3 {
@@ -57,13 +55,13 @@
   m_dca = CreateObject<DcaTxop> ();
   m_dca->SetLow (m_low);
   m_dca->SetManager (m_dcfManager);
-  m_dca->SetTxMiddle(m_txMiddle);
+  m_dca->SetTxMiddle (m_txMiddle);
   m_dca->SetTxOkCallback (MakeCallback (&RegularWifiMac::TxOk, this));
   m_dca->SetTxFailedCallback (MakeCallback (&RegularWifiMac::TxFailed, this));
 
-  // Construct the EDCAFs. The ordering is important - highest
-  // priority (Table 9-1 UP-to-AC mapping; IEEE 802.11-2012) must be created
-  // first.
+  //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);
@@ -79,7 +77,6 @@
 RegularWifiMac::DoInitialize ()
 {
   NS_LOG_FUNCTION (this);
-
   m_dca->Initialize ();
 
   for (EdcaQueues::iterator i = m_edca.begin (); i != m_edca.end (); ++i)
@@ -121,7 +118,8 @@
 {
   NS_LOG_FUNCTION (this << stationManager);
   m_stationManager = stationManager;
-  m_stationManager->SetHtSupported (GetHtSupported());
+  m_stationManager->SetHtSupported (GetHtSupported ());
+  m_stationManager->SetVhtSupported (GetVhtSupported ());
   m_low->SetWifiRemoteStationManager (stationManager);
 
   m_dca->SetWifiRemoteStationManager (stationManager);
@@ -143,8 +141,8 @@
 {
   NS_LOG_FUNCTION (this << ac);
 
-  // Our caller shouldn't be attempting to setup a queue that is
-  // already configured.
+  //Our caller shouldn't be attempting to setup a queue that is
+  //already configured.
   NS_ASSERT (m_edca.find (ac) == m_edca.end ());
 
   Ptr<EdcaTxopN> edca = CreateObject<EdcaTxopN> ();
@@ -256,6 +254,7 @@
 {
   return m_qosSupported;
 }
+
 void
 RegularWifiMac::SetHtSupported (bool enable)
 {
@@ -264,12 +263,26 @@
 }
 
 bool
+RegularWifiMac::GetVhtSupported () const
+{
+  return m_vhtSupported;
+}
+
+void
+RegularWifiMac::SetVhtSupported (bool enable)
+{
+  NS_LOG_FUNCTION (this);
+  m_vhtSupported = enable;
+}
+
+bool
 RegularWifiMac::GetHtSupported () const
 {
   return m_htSupported;
 }
+
 void
-RegularWifiMac::SetCtsToSelfSupported(bool enable)
+RegularWifiMac::SetCtsToSelfSupported (bool enable)
 {
   NS_LOG_FUNCTION (this);
   m_low->SetCtsToSelfSupported (enable);
@@ -278,7 +291,7 @@
 bool
 RegularWifiMac::GetCtsToSelfSupported () const
 {
-   return  m_low->GetCtsToSelfSupported ();
+  return m_low->GetCtsToSelfSupported ();
 }
 
 void
@@ -321,6 +334,7 @@
 {
   return m_dcfManager->GetEifsNoDifs ();
 }
+
 void
 RegularWifiMac::SetRifs (Time rifs)
 {
@@ -331,7 +345,7 @@
 Time
 RegularWifiMac::GetRifs (void) const
 {
-  return m_low->GetRifs();
+  return m_low->GetRifs ();
 }
 
 void
@@ -448,10 +462,10 @@
 RegularWifiMac::Enqueue (Ptr<const 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.
+  //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");
 }
@@ -477,12 +491,12 @@
   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.
+  //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.
+  //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;
@@ -490,8 +504,8 @@
 
   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.
+      //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;
@@ -508,31 +522,29 @@
                 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.
+                //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.
                 SendAddBaResponse (&reqHdr, from);
-                // This frame is now completely dealt with, so we're done.
+                //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.
+                //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.
+                //This frame is now completely dealt with, so we're done.
                 return;
               }
-
             case WifiActionHeader::BLOCK_ACK_DELBA:
               {
                 MgtDelBaHeader delBaHdr;
@@ -540,30 +552,27 @@
 
                 if (delBaHdr.IsByOriginator ())
                   {
-                    // This DELBA frame was sent by the originator, so
-                    // this means that an ingoing established
-                    // agreement exists in MacLow and we need to
-                    // destroy it.
+                    //This DELBA frame was sent by the originator, so
+                    //this means that an ingoing established
+                    //agreement exists in MacLow and we need to
+                    //destroy it.
                     m_low->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
+                    //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.
+                //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;
@@ -616,13 +625,12 @@
       respHdr.SetDelayedBlockAck ();
     }
   respHdr.SetTid (reqHdr->GetTid ());
-  // For now there's not no control about limit of reception. We
-  // assume that receiver has no limit on reception. However we assume
-  // that a receiver sets a bufferSize in order to satisfy next
-  // equation: (bufferSize + 1) % 16 = 0 So if a recipient is able to
-  // buffer a packet, it should be also able to buffer all possible
-  // packet's fragments. See section 7.3.1.14 in IEEE802.11e for more
-  // details.
+  //For now there's not no control about limit of reception. We
+  //assume that receiver has no limit on reception. However we assume
+  //that a receiver sets a bufferSize in order to satisfy next
+  //equation: (bufferSize + 1) % 16 = 0 So if a recipient is able to
+  //buffer a packet, it should be also able to buffer all possible
+  //packet's fragments. See section 7.3.1.14 in IEEE802.11e for more details.
   respHdr.SetBufferSize (1023);
   respHdr.SetTimeout (reqHdr->GetTimeout ());
 
@@ -635,14 +643,14 @@
   packet->AddHeader (respHdr);
   packet->AddHeader (actionHdr);
 
-  // We need to notify our MacLow object as it will have to buffer all
-  // correctly received packets for this Block Ack session
+  //We need to notify our MacLow object as it will have to buffer all
+  //correctly received packets for this Block Ack session
   m_low->CreateBlockAckAgreement (&respHdr, originator,
                                   reqHdr->GetStartingSequence ());
 
-  // It is unclear which queue this frame should go into. For now we
-  // bung it into the queue corresponding to the TID for which we are
-  // establishing an agreement, and push it to the head.
+  //It is unclear which queue this frame should go into. For now we
+  //bung it into the queue corresponding to the TID for which we are
+  //establishing an agreement, and push it to the head.
   m_edca[QosUtilsMapTidToAc (reqHdr->GetTid ())]->PushFront (packet, hdr);
 }
 
@@ -664,12 +672,18 @@
                    MakeBooleanAccessor (&RegularWifiMac::SetHtSupported,
                                         &RegularWifiMac::GetHtSupported),
                    MakeBooleanChecker ())
-   .AddAttribute ("CtsToSelfSupported",
+    .AddAttribute ("VhtSupported",
+                   "This Boolean attribute is set to enable 802.11ac support at this STA",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&RegularWifiMac::SetVhtSupported,
+                                        &RegularWifiMac::GetVhtSupported),
+                   MakeBooleanChecker ())
+    .AddAttribute ("CtsToSelfSupported",
                    "Use CTS to Self when using a rate that is not in the basic set rate",
                    BooleanValue (false),
                    MakeBooleanAccessor (&RegularWifiMac::SetCtsToSelfSupported,
                                         &RegularWifiMac::GetCtsToSelfSupported),
-                    MakeBooleanChecker ())
+                   MakeBooleanChecker ())
     .AddAttribute ("DcaTxop", "The DcaTxop object",
                    PointerValue (),
                    MakePointerAccessor (&RegularWifiMac::GetDcaTxop),
@@ -694,8 +708,8 @@
                    PointerValue (),
                    MakePointerAccessor (&RegularWifiMac::GetBKQueue),
                    MakePointerChecker<EdcaTxopN> ())
-    .AddTraceSource ( "TxOkHeader",
-                      "The header of successfully transmitted packet",
+    .AddTraceSource ("TxOkHeader",
+                     "The header of successfully transmitted packet",
                      MakeTraceSourceAccessor (&RegularWifiMac::m_txOkCallback),
                      "ns3::WifiMacHeader::TracedCallback")
     .AddTraceSource ("TxErrHeader",
@@ -703,7 +717,6 @@
                      MakeTraceSourceAccessor (&RegularWifiMac::m_txErrCallback),
                      "ns3::WifiMacHeader::TracedCallback")
   ;
-
   return tid;
 }
 
@@ -722,24 +735,23 @@
     case WIFI_PHY_STANDARD_80211_5MHZ:
     case WIFI_PHY_STANDARD_80211n_5GHZ:
     case WIFI_PHY_STANDARD_80211n_2_4GHZ:
+    case WIFI_PHY_STANDARD_80211ac:
       cwmin = 15;
       cwmax = 1023;
       break;
-
     case WIFI_PHY_STANDARD_80211b:
       cwmin = 31;
       cwmax = 1023;
       break;
-
     default:
       NS_FATAL_ERROR ("Unsupported WifiPhyStandard in RegularWifiMac::FinishConfigureStandard ()");
     }
 
-  // The special value of AC_BE_NQOS which exists in the Access
-  // Category enumeration allows us to configure plain old DCF.
+  //The special value of AC_BE_NQOS which exists in the Access
+  //Category enumeration allows us to configure plain old DCF.
   ConfigureDcf (m_dca, cwmin, cwmax, AC_BE_NQOS);
 
-  // Now we configure the EDCA functions
+  //Now we configure the EDCA functions
   for (EdcaQueues::iterator i = m_edca.begin (); i != m_edca.end (); ++i)
     {
       ConfigureDcf (i->second, cwmin, cwmax, i->first);
@@ -760,4 +772,4 @@
   m_txErrCallback (hdr);
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/regular-wifi-mac.h ns-3.24/src/wifi/model/regular-wifi-mac.h
--- ns-3.23/src/wifi/model/regular-wifi-mac.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/regular-wifi-mac.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,17 +17,16 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef REGULAR_WIFI_MAC_H
 #define REGULAR_WIFI_MAC_H
 
 #include "ns3/wifi-mac.h"
-
 #include "dca-txop.h"
 #include "edca-txop-n.h"
 #include "wifi-remote-station-manager.h"
 #include "ssid.h"
 #include "qos-utils.h"
-
 #include <map>
 
 namespace ns3 {
@@ -74,7 +73,9 @@
    * \param pifs the pifs duration.
    */
   void SetPifs (Time pifs);
-
+  /**
+   * \param rifs the rifs duration.
+   */
   void SetRifs (Time rifs);
   /**
    * \param ctsTimeout the duration of a CTS timeout.
@@ -115,15 +116,16 @@
    * Enable or disable CTS-to-self feature.
    *
    * \param enable true if CTS-to-self is to be supported,
-   *        false otherwise
+   *               false otherwise
    */
   void SetCtsToSelfSupported (bool enable);
- 
+
   /**
    * Return whether the device supports CTS-to-self
    * capability.
    *
-   * \return true if CTS-to-self is supported, false otherwise.
+   * \return true if CTS-to-self is supported,
+   *         false otherwise.
    */
   bool GetCtsToSelfSupported () const;
   /**
@@ -171,6 +173,7 @@
    * frames without altering the source address.
    */
   virtual void Enqueue (Ptr<const Packet> packet, Mac48Address to, Mac48Address from);
+
   virtual bool SupportsSendFrom (void) const;
 
   /**
@@ -209,8 +212,7 @@
    *
    * \param packet the packet that has been received.
    * \param from the MAC address of the device that sent the packet.
-   * \param to the MAC address ot the device that the packet is
-   * destined for.
+   * \param to the MAC address ot the device that the packet is destined for.
    */
   typedef Callback<void, Ptr<Packet>, Mac48Address, Mac48Address> ForwardUpCallback;
   /**
@@ -226,6 +228,7 @@
    * \param linkDown the callback to invoke when the link becomes down.
    */
   virtual void SetLinkDownCallback (Callback<void> linkDown);
+
   /* Next functions are not pure virtual so non Qos WifiMacs are not
    * forced to implement them.
    */
@@ -234,21 +237,22 @@
   virtual void SetCompressedBlockAckTimeout (Time blockAckTimeout);
   virtual Time GetCompressedBlockAckTimeout (void) const;
 
+
 protected:
   virtual void DoInitialize ();
   virtual void DoDispose ();
 
-  MacRxMiddle *m_rxMiddle; //!< RX middle (de-fragmentation etc.)
-  MacTxMiddle *m_txMiddle; //!< TX middle (aggregation etc.)
-  Ptr<MacLow> m_low; //!< MacLow (RTS, CTS, DATA, ACK etc.)
+  MacRxMiddle *m_rxMiddle;  //!< RX middle (de-fragmentation etc.)
+  MacTxMiddle *m_txMiddle;  //!< TX middle (aggregation etc.)
+  Ptr<MacLow> m_low;        //!< MacLow (RTS, CTS, DATA, ACK etc.)
   DcfManager *m_dcfManager; //!< DCF manager (access to channel)
-  Ptr<WifiPhy> m_phy; //!< Wifi PHY
+  Ptr<WifiPhy> m_phy;       //!< Wifi PHY
 
   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
+  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)
 
@@ -259,38 +263,39 @@
   /** This type defines a mapping between an Access Category index,
   and a pointer to the corresponding channel access function */
   typedef std::map<AcIndex, Ptr<EdcaTxopN> > EdcaQueues;
+
   /** This is a map from Access Category index to the corresponding
   channel access function */
   EdcaQueues m_edca;
 
   /**
    * Accessor for the DCF object
-   * 
+   *
    * \return a smart pointer to DcaTxop
    */
   Ptr<DcaTxop> GetDcaTxop (void) const;
 
   /**
    * Accessor for the AC_VO channel access function
-   * 
+   *
    * \return a smart pointer to EdcaTxopN
    */
   Ptr<EdcaTxopN> GetVOQueue (void) const;
   /**
    * Accessor for the AC_VI channel access function
-   * 
+   *
    * \return a smart pointer to EdcaTxopN
    */
   Ptr<EdcaTxopN> GetVIQueue (void) const;
   /**
    * Accessor for the AC_BE channel access function
-   * 
+   *
    * \return a smart pointer to EdcaTxopN
    */
   Ptr<EdcaTxopN> GetBEQueue (void) const;
   /**
    * Accessor for the AC_BK channel access function
-   * 
+   *
    * \return a smart pointer to EdcaTxopN
    */
   Ptr<EdcaTxopN> GetBKQueue (void) const;
@@ -334,10 +339,10 @@
    * \param hdr a pointer to the MAC header of the received frame.
    */
   virtual void Receive (Ptr<Packet> packet, const WifiMacHeader *hdr);
-    /**
+  /**
    * The packet we sent was successfully received by the receiver
    * (i.e. we received an ACK from the receiver).
-   * 
+   *
    * \param hdr the header of the packet that we successfully sent
    */
   virtual void TxOk (const WifiMacHeader &hdr);
@@ -392,33 +397,34 @@
    * however.
    */
   bool m_qosSupported;
+
   /**
    * Enable or disable QoS support for the device.
    *
    * \param enable whether QoS is supported
    */
   void SetQosSupported (bool enable);
-  /** 
+  /**
    * Return whether the device supports QoS.
    *
    * \return true if QoS is supported, false otherwise
    */
   bool GetQosSupported () const;
 
- /**
-   * This Boolean is set \c true iff this WifiMac is to model
-   * 802.11n. It is exposed through the
-   * attribute system.
-   *
-   * At the moment, this flag is the sole selection between HT and
-   * non-HT operation for the STA (whether IBSS, AP, or
-   * non-AP). Ultimately, we will want a HT-enabled STA to be able to
-   * fall back to non-HT operation with a non-HT peer. This'll
-   * require further intelligence - i.e., per-association HT
-   * state. Having a big switch seems like a good intermediate stage,
-   * however.
-   */
+  /**
+    * This Boolean is set \c true iff this WifiMac is to model
+    * 802.11n. It is exposed through the attribute system.
+    *
+    * At the moment, this flag is the sole selection between HT and
+    * non-HT operation for the STA (whether IBSS, AP, or
+    * non-AP). Ultimately, we will want a HT-enabled STA to be able to
+    * fall back to non-HT operation with a non-HT peer. This'll
+    * require further intelligence - i.e., per-association HT
+    * state. Having a big switch seems like a good intermediate stage,
+    * however.
+    */
   bool m_htSupported;
+
   /**
    * Enable or disable HT support for the device.
    *
@@ -426,12 +432,31 @@
    */
   void SetHtSupported (bool enable);
   /**
-   * Return whether the device supports QoS.
+   * Return whether the device supports HT.
    *
    * \return true if HT is supported, false otherwise
    */
   bool GetHtSupported () const;
 
+  /**
+  * This Boolean is set \c true iff this WifiMac is to model
+  * 802.11ac. It is exposed through the attribute system.
+  */
+  bool m_vhtSupported;
+  /**
+   * Enable or disable HT support for the device.
+   *
+   * \param enable whether VHT is supported
+   */
+  void SetVhtSupported (bool enable);
+  /**
+   * Return whether the device supports VHT.
+   *
+   * \return true if VHT is supported, false otherwise
+   */
+  bool GetVhtSupported () const;
+
+
 private:
   RegularWifiMac (const RegularWifiMac &);
   RegularWifiMac & operator= (const RegularWifiMac &);
@@ -448,6 +473,6 @@
   TracedCallback<const WifiMacHeader &> m_txErrCallback;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* REGULAR_WIFI_MAC_H */
diff -Naur ns-3.23/src/wifi/model/rraa-wifi-manager.cc ns-3.24/src/wifi/model/rraa-wifi-manager.cc
--- ns-3.23/src/wifi/model/rraa-wifi-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/rraa-wifi-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -189,11 +189,11 @@
 RraaWifiManager::RraaWifiManager ()
 {
 }
+
 RraaWifiManager::~RraaWifiManager ()
 {
 }
 
-
 WifiRemoteStation *
 RraaWifiManager::DoCreateStation (void) const
 {
@@ -224,13 +224,13 @@
 {
   return GetNSupported (station) - 1;
 }
+
 uint32_t
 RraaWifiManager::GetMinRate (RraaWifiRemoteStation *station)
 {
   return 0;
 }
 
-
 void
 RraaWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
 {
@@ -246,17 +246,20 @@
   station->m_failed++;
   RunBasicAlgorithm (station);
 }
+
 void
 RraaWifiManager::DoReportRxOk (WifiRemoteStation *st,
                                double rxSnr, WifiMode txMode)
 {
 }
+
 void
 RraaWifiManager::DoReportRtsOk (WifiRemoteStation *st,
                                 double ctsSnr, WifiMode ctsMode, double rtsSnr)
 {
   NS_LOG_DEBUG ("self=" << st << " rts ok");
 }
+
 void
 RraaWifiManager::DoReportDataOk (WifiRemoteStation *st,
                                  double ackSnr, WifiMode ackMode, double dataSnr)
@@ -267,10 +270,12 @@
   station->m_counter--;
   RunBasicAlgorithm (station);
 }
+
 void
 RraaWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
 {
 }
+
 void
 RraaWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
 {
@@ -278,19 +283,33 @@
 
 WifiTxVector
 RraaWifiManager::DoGetDataTxVector (WifiRemoteStation *st,
-                                uint32_t size)
+                                    uint32_t size)
 {
   RraaWifiRemoteStation *station = (RraaWifiRemoteStation *) st;
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
   if (!station->m_initialized)
     {
       ResetCountersBasic (station);
     }
-  return WifiTxVector (GetSupported (station, station->m_rate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), GetShortGuardInterval (station), Min (GetNumberOfReceiveAntennas (station),GetNumberOfTransmitAntennas()), GetNess (station), GetStbc (station));
+  return WifiTxVector (GetSupported (station, station->m_rate), GetDefaultTxPowerLevel (), GetLongRetryCount (station), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
+
 WifiTxVector
 RraaWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
 {
-  return WifiTxVector (GetSupported (st, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (st), GetShortGuardInterval (st), Min (GetNumberOfReceiveAntennas (st),GetNumberOfTransmitAntennas()), GetNess (st), GetStbc (st));
+  RraaWifiRemoteStation *station = (RraaWifiRemoteStation *) st;
+  uint32_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      //avoid to use legacy rate adaptation algorithms for IEEE 802.11n/ac
+      channelWidth = 20;
+    }
+  return WifiTxVector (GetSupported (st, 0), GetDefaultTxPowerLevel (), GetShortRetryCount (st), false, 1, 0, channelWidth, GetAggregation (station), false);
 }
 
 bool
@@ -369,13 +388,13 @@
                                 uint32_t rate) const
 {
   WifiMode mode = GetSupported (station, rate);
-  return GetThresholds (mode);
+  return GetThresholds (mode, station);
 }
 
 struct RraaWifiManager::ThresholdsItem
-RraaWifiManager::GetThresholds (WifiMode mode) const
+RraaWifiManager::GetThresholds (WifiMode mode, RraaWifiRemoteStation *station) const
 {
-  switch (mode.GetDataRate () / 1000000)
+  switch (mode.GetDataRate (GetChannelWidth (station), GetShortGuardInterval (station), 1) / 1000000)
     {
     case 54:
       {
@@ -468,4 +487,4 @@
   return true;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/rraa-wifi-manager.h ns-3.24/src/wifi/model/rraa-wifi-manager.h
--- ns-3.23/src/wifi/model/rraa-wifi-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/rraa-wifi-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Federico Maguolo <maguolof@dei.unipd.it>
  */
+
 #ifndef RRAA_WIFI_MANAGER_H
 #define RRAA_WIFI_MANAGER_H
 
@@ -44,6 +45,7 @@
   RraaWifiManager ();
   virtual ~RraaWifiManager ();
 
+
 private:
   struct ThresholdsItem
   {
@@ -53,7 +55,7 @@
     uint32_t ewnd;
   };
 
-  // overriden from base class
+  //overriden from base class
   virtual WifiRemoteStation * DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
@@ -76,6 +78,7 @@
    * the given station.
    *
    * \param station
+   *
    * \return the index for the maximum transmission rate
    */
   uint32_t GetMaxRate (RraaWifiRemoteStation *station);
@@ -84,6 +87,7 @@
    * the given station.
    *
    * \param station
+   *
    * \return the index for the minimum transmission rate
    */
   uint32_t GetMinRate (RraaWifiRemoteStation *station);
@@ -116,14 +120,17 @@
    * Get a threshold for the given mode.
    *
    * \param mode
+   * \param station
+   *
    * \return threshold
    */
-  struct ThresholdsItem GetThresholds (WifiMode mode) const;
+  struct ThresholdsItem GetThresholds (WifiMode mode, RraaWifiRemoteStation *station) const;
   /**
    * Get a threshold for the given station and mode index.
    *
    * \param station
    * \param rate
+   *
    * \return threshold
    */
   struct ThresholdsItem GetThresholds (RraaWifiRemoteStation *station, uint32_t rate) const;
@@ -154,6 +161,6 @@
   double m_pmtlfor9;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* RRAA_WIFI_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/snr-tag.cc ns-3.24/src/wifi/model/snr-tag.cc
--- ns-3.23/src/wifi/model/snr-tag.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/snr-tag.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,9 +17,9 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
- * Author: Konstantinos Katsaros <dinos.katsaros@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
+ *          Konstantinos Katsaros <dinos.katsaros@gmail.com>
  */
 
 #include "snr-tag.h"
@@ -44,6 +44,7 @@
   ;
   return tid;
 }
+
 TypeId
 SnrTag::GetInstanceTypeId (void) const
 {
@@ -54,42 +55,46 @@
   : m_snr (0)
 {
 }
+
 SnrTag::SnrTag (double snr)
   : m_snr (snr)
 {
 }
 
-
 uint32_t
 SnrTag::GetSerializedSize (void) const
 {
   return sizeof (double);
 }
+
 void
 SnrTag::Serialize (TagBuffer i) const
 {
   i.WriteDouble (m_snr);
 }
+
 void
 SnrTag::Deserialize (TagBuffer i)
 {
   m_snr = i.ReadDouble ();
 }
+
 void
 SnrTag::Print (std::ostream &os) const
 {
   os << "Snr=" << m_snr;
 }
+
 void
 SnrTag::Set (double snr)
 {
   m_snr = snr;
 }
+
 double
 SnrTag::Get (void) const
 {
   return m_snr;
 }
 
-
 }
diff -Naur ns-3.23/src/wifi/model/snr-tag.h ns-3.24/src/wifi/model/snr-tag.h
--- ns-3.23/src/wifi/model/snr-tag.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/snr-tag.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,9 +17,9 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
- * Author: Konstantinos Katsaros <dinos.katsaros@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
+ *          Konstantinos Katsaros <dinos.katsaros@gmail.com>
  */
 
 #ifndef SNR_TAG_H
@@ -38,15 +38,15 @@
   virtual TypeId GetInstanceTypeId (void) const;
 
   /**
-   * Create a SnrTag with the default snr 0 
+   * Create a SnrTag with the default snr 0
    */
-  SnrTag();
+  SnrTag ();
 
   /**
    * Create a SnrTag with the given snr value
    * \param snr the given SNR value
    */
-  SnrTag(double snr);
+  SnrTag (double snr);
 
   virtual uint32_t GetSerializedSize (void) const;
   virtual void Serialize (TagBuffer i) const;
@@ -65,10 +65,11 @@
    * \return the SNR value
    */
   double Get (void) const;
+
+
 private:
   double m_snr;  //!< SNR value
 };
 
-
 }
 #endif /* SNR_TAG_H */
diff -Naur ns-3.23/src/wifi/model/ssid.cc ns-3.24/src/wifi/model/ssid.cc
--- ns-3.23/src/wifi/model/ssid.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ssid.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "ssid.h"
 #include "ns3/assert.h"
 
@@ -30,6 +31,7 @@
       m_ssid[i] = 0;
     }
 }
+
 Ssid::Ssid (std::string s)
 {
   NS_ASSERT (s.size () < 32);
@@ -49,6 +51,7 @@
       len++;
     }
 }
+
 Ssid::Ssid (char const ssid[32], uint8_t length)
 {
   NS_ASSERT (length <= 32);
@@ -65,6 +68,7 @@
       len++;
     }
 }
+
 bool
 Ssid::IsEqual (const Ssid& o) const
 {
@@ -81,6 +85,7 @@
     }
   return true;
 }
+
 bool
 Ssid::IsBroadcast (void) const
 {
@@ -94,8 +99,8 @@
 char *
 Ssid::PeekString (void) const
 {
-  // it is safe to return a pointer to the buffer because it is
-  // guaranteed to be zero-terminated.
+  //It is safe to return a pointer to the buffer because it is
+  //guaranteed to be zero-terminated.
   return (char *)m_ssid;
 }
 
@@ -117,6 +122,7 @@
   NS_ASSERT (m_length <= 32);
   start.Write (m_ssid, m_length);
 }
+
 uint8_t
 Ssid::DeserializeInformationField (Buffer::Iterator start,
                                    uint8_t length)
@@ -134,6 +140,7 @@
  *
  * \param os
  * \param ssid
+ *
  * \return std::ostream
  */
 std::ostream &
@@ -148,6 +155,7 @@
  *
  * \param is
  * \param ssid
+ *
  * \return std::istream
  */
 std::istream &operator >> (std::istream &is, Ssid &ssid)
@@ -158,5 +166,4 @@
   return is;
 }
 
-
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/ssid.h ns-3.24/src/wifi/model/ssid.h
--- ns-3.23/src/wifi/model/ssid.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/ssid.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef SSID_H
 #define SSID_H
 
@@ -57,6 +58,7 @@
    * Check if the two SSIDs are equal.
    *
    * \param o SSID to compare to
+   *
    * \return true if the two SSIDs are equal,
    *         false otherwise
    */
@@ -92,6 +94,6 @@
 
 ATTRIBUTE_HELPER_HEADER (Ssid);
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* SSID_H */
diff -Naur ns-3.23/src/wifi/model/status-code.cc ns-3.24/src/wifi/model/status-code.cc
--- ns-3.23/src/wifi/model/status-code.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/status-code.cc	2015-09-15 11:18:44.000000000 -0700
@@ -27,11 +27,13 @@
 StatusCode::StatusCode ()
 {
 }
+
 void
 StatusCode::SetSuccess (void)
 {
   m_code = 0;
 }
+
 void
 StatusCode::SetFailure (void)
 {
@@ -43,17 +45,20 @@
 {
   return (m_code == 0);
 }
+
 uint32_t
 StatusCode::GetSerializedSize (void) const
 {
   return 2;
 }
+
 Buffer::Iterator
 StatusCode::Serialize (Buffer::Iterator start) const
 {
   start.WriteHtolsbU16 (m_code);
   return start;
 }
+
 Buffer::Iterator
 StatusCode::Deserialize (Buffer::Iterator start)
 {
@@ -66,6 +71,7 @@
  *
  * \param os
  * \param code
+ *
  * \return std::ostream
  */
 std::ostream &
@@ -82,4 +88,4 @@
   return os;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/status-code.h ns-3.24/src/wifi/model/status-code.h
--- ns-3.23/src/wifi/model/status-code.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/status-code.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef STATUS_CODE_H
 #define STATUS_CODE_H
 
@@ -38,14 +39,15 @@
    */
   void SetSuccess (void);
   /**
-   * Set success bit to 1 (failure.
+   * Set success bit to 1 (failure).
    */
   void SetFailure (void);
 
   /**
    * Return whether the status code is success.
    *
-   * \return true if success, false otherwise
+   * \return true if success,
+   *         false otherwise
    */
   bool IsSuccess (void) const;
 
@@ -57,8 +59,8 @@
    */
   uint32_t GetSerializedSize (void) const;
   /**
-   * \param start an iterator which points to where the status code should
-   *        be written.
+   * \param start an iterator which points to where the status code should be written
+   *
    * \return Buffer::Iterator
    *
    * This method is used to store a status code into the byte buffer.
@@ -68,19 +70,22 @@
   Buffer::Iterator Serialize (Buffer::Iterator start) const;
   /**
    * \param start an iterator which points to where the status code should be read.
+   *
    * \returns the number of bytes read.
    *
-   * This method is used to re-create a status code from the byte buffer. 
+   * This method is used to re-create a status code from the byte buffer.
    * The data read is expected to match bit-for-bit the representation of this
    * header in real networks.
    */
   Buffer::Iterator Deserialize (Buffer::Iterator start);
+
+
 private:
   uint16_t m_code;
 };
 
 std::ostream &operator << (std::ostream &os, const StatusCode &code);
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* STATUS_CODE_H */
diff -Naur ns-3.23/src/wifi/model/sta-wifi-mac.cc ns-3.24/src/wifi/model/sta-wifi-mac.cc
--- ns-3.23/src/wifi/model/sta-wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/sta-wifi-mac.cc	2015-09-15 11:18:44.000000000 -0700
@@ -16,18 +16,17 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
-#include "sta-wifi-mac.h"
 
+#include "sta-wifi-mac.h"
 #include "ns3/log.h"
 #include "ns3/simulator.h"
 #include "ns3/string.h"
 #include "ns3/pointer.h"
 #include "ns3/boolean.h"
 #include "ns3/trace-source-accessor.h"
-
 #include "qos-tag.h"
 #include "mac-low.h"
 #include "dcf-manager.h"
@@ -38,6 +37,7 @@
 #include "amsdu-subframe-header.h"
 #include "mgt-headers.h"
 #include "ht-capabilities.h"
+#include "vht-capabilities.h"
 
 /*
  * The state machine for this STA is:
@@ -82,7 +82,12 @@
                    UintegerValue (10),
                    MakeUintegerAccessor (&StaWifiMac::m_maxMissedBeacons),
                    MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("ActiveProbing", "If true, we send probe requests. If false, we don't. NOTE: if more than one STA in your simulation is using active probing, you should enable it at a different simulation time for each STA, otherwise all the STAs will start sending probes at the same time resulting in collisions. See bug 1060 for more info.",
+    .AddAttribute ("ActiveProbing",
+                   "If true, we send probe requests. If false, we don't."
+                   "NOTE: if more than one STA in your simulation is using active probing, "
+                   "you should enable it at a different simulation time for each STA, "
+                   "otherwise all the STAs will start sending probes at the same time resulting in collisions. "
+                   "See bug 1060 for more info.",
                    BooleanValue (false),
                    MakeBooleanAccessor (&StaWifiMac::SetActiveProbing, &StaWifiMac::GetActiveProbing),
                    MakeBooleanChecker ())
@@ -104,8 +109,8 @@
 {
   NS_LOG_FUNCTION (this);
 
-  // Let the lower layers know that we are acting as a non-AP STA in
-  // an infrastructure BSS.
+  //Let the lower layers know that we are acting as a non-AP STA in
+  //an infrastructure BSS.
   SetTypeOfStation (STA);
 }
 
@@ -156,7 +161,7 @@
     }
   m_activeProbing = enable;
 }
-  
+
 bool StaWifiMac::GetActiveProbing (void) const
 {
   return m_activeProbing;
@@ -177,18 +182,21 @@
   MgtProbeRequestHeader probe;
   probe.SetSsid (GetSsid ());
   probe.SetSupportedRates (GetSupportedRates ());
-  if (m_htSupported)
+  if (m_htSupported || m_vhtSupported)
     {
-      probe.SetHtCapabilities (GetHtCapabilities());
-      hdr.SetNoOrder();
+      probe.SetHtCapabilities (GetHtCapabilities ());
+      hdr.SetNoOrder ();
+    }
+  if (m_vhtSupported)
+    {
+      probe.SetVhtCapabilities (GetVhtCapabilities ());
     }
-
   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.
+  //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_dca->Queue (packet, hdr);
 
   if (m_probeRequestEvent.IsRunning ())
@@ -214,18 +222,21 @@
   MgtAssocRequestHeader assoc;
   assoc.SetSsid (GetSsid ());
   assoc.SetSupportedRates (GetSupportedRates ());
-  if (m_htSupported)
+  if (m_htSupported || m_vhtSupported)
     {
-      assoc.SetHtCapabilities (GetHtCapabilities());
-      hdr.SetNoOrder();
+      assoc.SetHtCapabilities (GetHtCapabilities ());
+      hdr.SetNoOrder ();
+    }
+  if (m_vhtSupported)
+    {
+      assoc.SetVhtCapabilities (GetVhtCapabilities ());
     }
-
   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.
+  //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_dca->Queue (packet, hdr);
 
   if (m_assocRequestEvent.IsRunning ())
@@ -258,10 +269,10 @@
        * We try to initiate a probe request now.
        */
       m_linkDown ();
-      if (m_activeProbing) 
+      if (m_activeProbing)
         {
-      SetState (WAIT_PROBE_RESP);
-      SendProbeRequest ();
+          SetState (WAIT_PROBE_RESP);
+          SendProbeRequest ();
         }
       break;
     case WAIT_ASSOC_RESP:
@@ -352,32 +363,32 @@
     }
   WifiMacHeader hdr;
 
-  // If we are not a QoS AP then we definitely want to use AC_BE to
-  // transmit the packet. A TID of zero will map to AC_BE (through \c
-  // QosUtilsMapTidToAc()), so we use that as our default here.
+  //If we are not a QoS AP then we definitely want to use AC_BE to
+  //transmit the packet. A TID of zero will map to AC_BE (through \c
+  //QosUtilsMapTidToAc()), so we use that as our default here.
   uint8_t tid = 0;
 
-  // For now, an AP that supports QoS does not support non-QoS
-  // associations, and vice versa. In future the AP model should
-  // support simultaneously associated QoS and non-QoS STAs, at which
-  // point there will need to be per-association QoS state maintained
-  // by the association state machine, and consulted here.
+  //For now, an AP that supports QoS does not support non-QoS
+  //associations, and vice versa. In future the AP model should
+  //support simultaneously associated QoS and non-QoS STAs, at which
+  //point there will need to be per-association QoS state maintained
+  //by the association state machine, and consulted here.
   if (m_qosSupported)
     {
       hdr.SetType (WIFI_MAC_QOSDATA);
       hdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
       hdr.SetQosNoEosp ();
       hdr.SetQosNoAmsdu ();
-      // Transmission of multiple frames in the same TXOP is not
-      // supported for now
+      //Transmission of multiple frames in the same TXOP is not
+      //supported for now
       hdr.SetQosTxopLimit (0);
 
-      // Fill in the QoS control field in the MAC header
+      //Fill in the QoS control field in the MAC header
       tid = QosUtilsGetTidForPacket (packet);
-      // Any value greater than 7 is invalid and likely indicates that
-      // the packet had no QoS tag, so we revert to zero, which'll
-      // mean that AC_BE is used.
-      if (tid >= 7)
+      //Any value greater than 7 is invalid and likely indicates that
+      //the packet had no QoS tag, so we revert to zero, which'll
+      //mean that AC_BE is used.
+      if (tid > 7)
         {
           tid = 0;
         }
@@ -387,9 +398,9 @@
     {
       hdr.SetTypeData ();
     }
-if (m_htSupported)
+  if (m_htSupported || m_vhtSupported)
     {
-      hdr.SetNoOrder();
+      hdr.SetNoOrder ();
     }
 
   hdr.SetAddr1 (GetBssid ());
@@ -400,7 +411,7 @@
 
   if (m_qosSupported)
     {
-      // Sanity check that the TID is valid
+      //Sanity check that the TID is valid
       NS_ASSERT (tid < 8);
       m_edca[QosUtilsMapTidToAc (tid)]->Queue (packet, hdr);
     }
@@ -447,7 +458,6 @@
           NotifyRxDrop (packet);
           return;
         }
-
       if (hdr->IsQosData ())
         {
           if (hdr->IsQosAmsdu ())
@@ -470,7 +480,7 @@
   else if (hdr->IsProbeReq ()
            || hdr->IsAssocReq ())
     {
-      // This is a frame aimed at an AP, so we can safely ignore it.
+      //This is a frame aimed at an AP, so we can safely ignore it.
       NotifyRxDrop (packet);
       return;
     }
@@ -487,12 +497,12 @@
       SupportedRates rates = beacon.GetSupportedRates ();
       for (uint32_t i = 0; i < m_phy->GetNBssMembershipSelectors (); i++)
         {
-           uint32_t selector = m_phy->GetBssMembershipSelector (i);
-           if (!rates.IsSupportedRate (selector))
-             {
-                goodBeacon = false;
-             }
-         }
+          uint32_t selector = m_phy->GetBssMembershipSelector (i);
+          if (!rates.IsSupportedRate (selector))
+            {
+              goodBeacon = false;
+            }
+        }
       if ((IsWaitAssocResp () || IsAssociated ()) && hdr->GetAddr3 () != GetBssid ())
         {
           goodBeacon = false;
@@ -524,11 +534,11 @@
           SupportedRates rates = probeResp.GetSupportedRates ();
           for (uint32_t i = 0; i < m_phy->GetNBssMembershipSelectors (); i++)
             {
-             uint32_t selector = m_phy->GetBssMembershipSelector (i);
-             if (!rates.IsSupportedRate (selector))
-               {
-                 return;
-               }
+              uint32_t selector = m_phy->GetBssMembershipSelector (i);
+              if (!rates.IsSupportedRate (selector))
+                {
+                  return;
+                }
             }
           SetBssid (hdr->GetAddr3 ());
           Time delay = MicroSeconds (probeResp.GetBeaconIntervalUs () * m_maxMissedBeacons);
@@ -562,30 +572,48 @@
                   HtCapabilities htcapabilities = assocResp.GetHtCapabilities ();
                   m_stationManager->AddStationHtCapabilities (hdr->GetAddr2 (),htcapabilities);
                 }
+              if (m_vhtSupported)
+                {
+                  VhtCapabilities vhtcapabilities = assocResp.GetVhtCapabilities ();
+                  m_stationManager->AddStationVhtCapabilities (hdr->GetAddr2 (), vhtcapabilities);
+                }
 
               for (uint32_t i = 0; i < m_phy->GetNModes (); i++)
                 {
                   WifiMode mode = m_phy->GetMode (i);
-                  if (rates.IsSupportedRate (mode.GetDataRate ()))
+                  if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), false, 1)))
                     {
                       m_stationManager->AddSupportedMode (hdr->GetAddr2 (), mode);
-                      if (rates.IsBasicRate (mode.GetDataRate ()))
+                      if (rates.IsBasicRate (mode.GetDataRate (m_phy->GetChannelWidth (), false, 1)))
                         {
                           m_stationManager->AddBasicMode (mode);
                         }
                     }
                 }
-              if(m_htSupported)
+              if (m_htSupported)
                 {
                   HtCapabilities htcapabilities = assocResp.GetHtCapabilities ();
-                  for (uint32_t i = 0; i < m_phy->GetNMcs(); i++)
+                  for (uint32_t i = 0; i < m_phy->GetNMcs (); i++)
                     {
-                       uint8_t mcs=m_phy->GetMcs(i);
-                       if (htcapabilities.IsSupportedMcs (mcs))
-                         {
-                           m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
+                      WifiMode mcs = m_phy->GetMcs (i);
+                      if (mcs.GetModulationClass () == WIFI_MOD_CLASS_HT && htcapabilities.IsSupportedMcs (mcs.GetMcsValue ()))
+                        {
+                          m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
                           //here should add a control to add basic MCS when it is implemented
-                         }
+                        }
+                    }
+                }
+              if (m_vhtSupported)
+                {
+                  VhtCapabilities vhtcapabilities = assocResp.GetVhtCapabilities ();
+                  for (uint32_t i = 0; i < m_phy->GetNMcs (); i++)
+                    {
+                      WifiMode mcs = m_phy->GetMcs (i);
+                      if (mcs.GetModulationClass () == WIFI_MOD_CLASS_VHT && vhtcapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
+                        {
+                          m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
+                          //here should add a control to add basic MCS when it is implemented
+                        }
                     }
                 }
               if (!m_linkUp.IsNull ())
@@ -602,9 +630,9 @@
       return;
     }
 
-  // Invoke the receive handler of our parent class to deal with any
-  // other frames. Specifically, this will handle Block Ack-related
-  // Management Action frames.
+  //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 (packet, hdr);
 }
 
@@ -612,34 +640,88 @@
 StaWifiMac::GetSupportedRates (void) const
 {
   SupportedRates rates;
-  if(m_htSupported)
+  if (m_htSupported || m_vhtSupported)
     {
-      for (uint32_t i = 0; i < m_phy->GetNBssMembershipSelectors(); i++)
+      for (uint32_t i = 0; i < m_phy->GetNBssMembershipSelectors (); i++)
         {
-          rates.SetBasicRate(m_phy->GetBssMembershipSelector(i));
+          rates.SetBasicRate (m_phy->GetBssMembershipSelector (i));
         }
     }
   for (uint32_t i = 0; i < m_phy->GetNModes (); i++)
     {
       WifiMode mode = m_phy->GetMode (i);
-      rates.AddSupportedRate (mode.GetDataRate ());
+      rates.AddSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), false, 1));
     }
   return rates;
 }
+
 HtCapabilities
 StaWifiMac::GetHtCapabilities (void) const
 {
- HtCapabilities capabilities;
- capabilities.SetHtSupported(1);
- capabilities.SetLdpc (m_phy->GetLdpc());
- capabilities.SetShortGuardInterval20 (m_phy->GetGuardInterval());
- capabilities.SetGreenfield (m_phy->GetGreenfield());
-for (uint8_t i =0 ; i < m_phy->GetNMcs();i++)
-  {
-     capabilities.SetRxMcsBitmask(m_phy->GetMcs(i));
-  }
- return capabilities;
+  HtCapabilities capabilities;
+  capabilities.SetHtSupported (1);
+  if (m_htSupported)
+    {
+      capabilities.SetLdpc (m_phy->GetLdpc ());
+      capabilities.SetSupportedChannelWidth (m_phy->GetChannelWidth () == 40);
+      capabilities.SetShortGuardInterval20 (m_phy->GetGuardInterval ());
+      capabilities.SetShortGuardInterval40 (m_phy->GetChannelWidth () == 40 && m_phy->GetGuardInterval ());
+      capabilities.SetGreenfield (m_phy->GetGreenfield ());
+      capabilities.SetMaxAmsduLength (1); //hardcoded for now (TBD)
+      capabilities.SetLSigProtectionSupport (!m_phy->GetGreenfield ());
+      capabilities.SetMaxAmpduLength (3); //hardcoded for now (TBD)
+      uint64_t maxSupportedRate = 0; //in bit/s
+      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+        {
+          WifiMode mcs = m_phy->GetMcs (i);
+          capabilities.SetRxMcsBitmask (mcs.GetMcsValue ());
+          if (mcs.GetDataRate (m_phy->GetGuardInterval (), m_phy->GetGuardInterval (), 1) > maxSupportedRate)
+            {
+              maxSupportedRate = mcs.GetDataRate (m_phy->GetGuardInterval (), m_phy->GetGuardInterval (), 1);
+            }
+        }
+      capabilities.SetRxHighestSupportedDataRate (maxSupportedRate / 1e6); //in Mbit/s
+      capabilities.SetTxMcsSetDefined (m_phy->GetNMcs () > 0);
+      capabilities.SetTxMaxNSpatialStreams (m_phy->GetNumberOfTransmitAntennas ());
+    }
+  return capabilities;
+}
+
+VhtCapabilities
+StaWifiMac::GetVhtCapabilities (void) const
+{
+  VhtCapabilities capabilities;
+  capabilities.SetVhtSupported (1);
+  if (m_vhtSupported)
+    {
+      if (m_phy->GetChannelWidth () == 160)
+        {
+          capabilities.SetSupportedChannelWidthSet (1);
+        }
+      else
+        {
+          capabilities.SetSupportedChannelWidthSet (0);
+        }
+      capabilities.SetMaxMpduLength (2); //hardcoded for now (TBD)
+      capabilities.SetRxLdpc (m_phy->GetLdpc ());
+      capabilities.SetShortGuardIntervalFor80Mhz ((m_phy->GetChannelWidth () == 80) && m_phy->GetGuardInterval ());
+      capabilities.SetShortGuardIntervalFor160Mhz ((m_phy->GetChannelWidth () == 160) && m_phy->GetGuardInterval ());
+      capabilities.SetMaxAmpduLengthExponent (7); //hardcoded for now (TBD)
+      uint8_t maxMcs = 0;
+      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+        {
+          WifiMode mcs = m_phy->GetMcs (i);
+          if (mcs.GetMcsValue () > maxMcs)
+            {
+              maxMcs = mcs.GetMcsValue ();
+            }
+        }
+      capabilities.SetRxMcsMap (maxMcs, 1); //Only 1 SS is currently supported
+      capabilities.SetTxMcsMap (maxMcs, 1); //Only 1 SS is currently supported
+    }
+  return capabilities;
 }
+
 void
 StaWifiMac::SetState (MacState value)
 {
@@ -656,4 +738,4 @@
   m_state = value;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/sta-wifi-mac.h ns-3.24/src/wifi/model/sta-wifi-mac.h
--- ns-3.23/src/wifi/model/sta-wifi-mac.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/sta-wifi-mac.h	2015-09-15 11:18:44.000000000 -0700
@@ -16,18 +16,16 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
 #ifndef STA_WIFI_MAC_H
 #define STA_WIFI_MAC_H
 
 #include "regular-wifi-mac.h"
-
 #include "ns3/event-id.h"
 #include "ns3/packet.h"
 #include "ns3/traced-callback.h"
-
 #include "supported-rates.h"
 #include "amsdu-subframe-header.h"
 
@@ -83,6 +81,7 @@
    */
   void StartActiveAssociation (void);
 
+
 private:
   /**
    * The current MAC state of the STA.
@@ -108,6 +107,7 @@
    * \return true if active probing is enabled, false otherwise
    */
   bool GetActiveProbing (void) const;
+
   virtual void Receive (Ptr<Packet> packet, const WifiMacHeader *hdr);
 
   /**
@@ -126,12 +126,12 @@
    */
   void TryToEnsureAssociated (void);
   /**
-   * This method is called after the association timeout occurred. We switch the state to 
+   * This method is called after the association timeout occurred. We switch the state to
    * WAIT_ASSOC_RESP and re-send an association request.
    */
   void AssocRequestTimeout (void);
   /**
-   * This method is called after the probe request timeout occurred. We switch the state to 
+   * This method is called after the probe request timeout occurred. We switch the state to
    * WAIT_PROBE_RESP and re-send a probe request.
    */
   void ProbeRequestTimeout (void);
@@ -148,11 +148,11 @@
    */
   bool IsWaitAssocResp (void) const;
   /**
-   * This method is called after we have not received a beacon from the AP 
+   * This method is called after we have not received a beacon from the AP
    */
   void MissedBeacons (void);
   /**
-   * Restarts the beacon timer. 
+   * Restarts the beacon timer.
    *
    * \param delay the delay before the watchdog fires
    */
@@ -170,14 +170,18 @@
    * \param value the new state
    */
   void SetState (enum MacState value);
-
   /**
    * Return the HT capability of the current AP.
-   * 
+   *
    * \return the HT capability that we support
    */
   HtCapabilities GetHtCapabilities (void) const;
-
+  /**
+   * Return the VHT capability of the current AP.
+   *
+   * \return the VHT capability that we support
+   */
+  VhtCapabilities GetVhtCapabilities (void) const;
 
   enum MacState m_state;
   Time m_probeRequestTimeout;
@@ -193,6 +197,6 @@
   TracedCallback<Mac48Address> m_deAssocLogger;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* STA_WIFI_MAC_H */
diff -Naur ns-3.23/src/wifi/model/supported-rates.cc ns-3.24/src/wifi/model/supported-rates.cc
--- ns-3.23/src/wifi/model/supported-rates.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/supported-rates.cc	2015-09-15 11:18:44.000000000 -0700
@@ -36,9 +36,8 @@
 {
   m_nRates = rates.m_nRates;
   memcpy (m_rates, rates.m_rates, MAX_SUPPORTED_RATES);
-  // reset the back pointer to this object
+  //reset the back pointer to this object
   extended.SetSupportedRates (this);
-
 }
 
 SupportedRates&
@@ -46,7 +45,7 @@
 {
   this->m_nRates = rates.m_nRates;
   memcpy (this->m_rates, rates.m_rates, MAX_SUPPORTED_RATES);
-  // reset the back pointer to this object
+  //reset the back pointer to this object
   this->extended.SetSupportedRates (this);
   return (*this);
 }
@@ -63,6 +62,7 @@
   m_nRates++;
   NS_LOG_DEBUG ("add rate=" << bs << ", n rates=" << (uint32_t)m_nRates);
 }
+
 void
 SupportedRates::SetBasicRate (uint32_t bs)
 {
@@ -83,6 +83,7 @@
   AddSupportedRate (bs);
   SetBasicRate (bs);
 }
+
 bool
 SupportedRates::IsBasicRate (uint32_t bs) const
 {
@@ -96,6 +97,7 @@
     }
   return false;
 }
+
 bool
 SupportedRates::IsSupportedRate (uint32_t bs) const
 {
@@ -110,11 +112,13 @@
     }
   return false;
 }
+
 uint8_t
 SupportedRates::GetNRates (void) const
 {
   return m_nRates;
 }
+
 uint32_t
 SupportedRates::GetRate (uint8_t i) const
 {
@@ -126,22 +130,25 @@
 {
   return IE_SUPPORTED_RATES;
 }
+
 uint8_t
 SupportedRates::GetInformationFieldSize () const
 {
-  // The Supported Rates Information Element contains only the first 8
-  // supported rates - the remainder appear in the Extended Supported
-  // Rates Information Element.
+  //The Supported Rates Information Element contains only the first 8
+  //supported rates - the remainder appear in the Extended Supported
+  //Rates Information Element.
   return m_nRates > 8 ? 8 : m_nRates;
 }
+
 void
 SupportedRates::SerializeInformationField (Buffer::Iterator start) const
 {
-  // The Supported Rates Information Element contains only the first 8
-  // supported rates - the remainder appear in the Extended Supported
-  // Rates Information Element.
+  //The Supported Rates Information Element contains only the first 8
+  //supported rates - the remainder appear in the Extended Supported
+  //Rates Information Element.
   start.Write (m_rates, m_nRates > 8 ? 8 : m_nRates);
 }
+
 uint8_t
 SupportedRates::DeserializeInformationField (Buffer::Iterator start,
                                              uint8_t length)
@@ -176,28 +183,28 @@
 uint8_t
 ExtendedSupportedRatesIE::GetInformationFieldSize () const
 {
-  // If there are 8 or fewer rates then we don't need an Extended
-  // Supported Rates IE and so could return zero here, but we're
-  // overriding the GetSerializedSize() method, so if this function is
-  // invoked in that case then it indicates a programming error. Hence
-  // we have an assertion on that condition.
+  //If there are 8 or fewer rates then we don't need an Extended
+  //Supported Rates IE and so could return zero here, but we're
+  //overriding the GetSerializedSize() method, so if this function is
+  //invoked in that case then it indicates a programming error. Hence
+  //we have an assertion on that condition.
   NS_ASSERT (m_supportedRates->m_nRates > 8);
 
-  // The number of rates we have beyond the initial 8 is the size of
-  // the information field.
+  //The number of rates we have beyond the initial 8 is the size of
+  //the information field.
   return (m_supportedRates->m_nRates - 8);
 }
 
 void
 ExtendedSupportedRatesIE::SerializeInformationField (Buffer::Iterator start) const
 {
-  // If there are 8 or fewer rates then there should be no Extended
-  // Supported Rates Information Element at all so being here would
-  // seemingly indicate a programming error.
+  //If there are 8 or fewer rates then there should be no Extended
+  //Supported Rates Information Element at all so being here would
+  //seemingly indicate a programming error.
   //
-  // Our overridden version of the Serialize() method should ensure
-  // that this routine is never invoked in that case (by ensuring that
-  // WifiInformationElement::Serialize() is not invoked).
+  //Our overridden version of the Serialize() method should ensure
+  //that this routine is never invoked in that case (by ensuring that
+  //WifiInformationElement::Serialize() is not invoked).
   NS_ASSERT (m_supportedRates->m_nRates > 8);
   start.Write (m_supportedRates->m_rates + 8, m_supportedRates->m_nRates - 8);
 }
@@ -205,29 +212,29 @@
 Buffer::Iterator
 ExtendedSupportedRatesIE::Serialize (Buffer::Iterator start) const
 {
-  // If there are 8 or fewer rates then we don't need an Extended
-  // Supported Rates IE, so we don't serialise anything.
+  //If there are 8 or fewer rates then we don't need an Extended
+  //Supported Rates IE, so we don't serialise anything.
   if (m_supportedRates->m_nRates <= 8)
     {
       return start;
     }
 
-  // If there are more than 8 rates then we serialise as per normal.
+  //If there are more than 8 rates then we serialise as per normal.
   return WifiInformationElement::Serialize (start);
 }
 
 uint16_t
 ExtendedSupportedRatesIE::GetSerializedSize () const
 {
-  // If there are 8 or fewer rates then we don't need an Extended
-  // Supported Rates IE, so it's serialised length will be zero.
+  //If there are 8 or fewer rates then we don't need an Extended
+  //Supported Rates IE, so it's serialised length will be zero.
   if (m_supportedRates->m_nRates <= 8)
     {
       return 0;
     }
 
-  // Otherwise, the size of it will be the number of supported rates
-  // beyond 8, plus 2 for the Element ID and Length.
+  //Otherwise, the size of it will be the number of supported rates
+  //beyond 8, plus 2 for the Element ID and Length.
   return WifiInformationElement::GetSerializedSize ();
 }
 
@@ -247,6 +254,7 @@
  *
  * \param os
  * \param rates
+ *
  * \return std::ostream
  */
 std::ostream &operator << (std::ostream &os, const SupportedRates &rates)
@@ -269,4 +277,4 @@
   return os;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/supported-rates.h ns-3.24/src/wifi/model/supported-rates.h
--- ns-3.23/src/wifi/model/supported-rates.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/supported-rates.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef SUPPORTED_RATES_H
 #define SUPPORTED_RATES_H
 
@@ -68,15 +69,16 @@
    * WifiInformationElement.
    *
    * \param start
+   *
    * \return an iterator
    */
   Buffer::Iterator Serialize (Buffer::Iterator start) const;
   /**
-   * Return the serialized size of this supported rates 
+   * Return the serialized size of this supported rates
    * information element.
-   * 
-   * \return the serialized size of this supported rates 
-   * information element
+   *
+   * \return the serialized size of this supported rates
+   *         information element
    */
   uint16_t GetSerializedSize () const;
 private:
@@ -132,6 +134,7 @@
    * Check if the given rate is supported.
    *
    * \param bs the rate to be checked
+   *
    * \return true if the rate is supported, false otherwise
    */
   bool IsSupportedRate (uint32_t bs) const;
@@ -139,6 +142,7 @@
    * Check if the given rate is a basic rate.
    *
    * \param bs the rate to be checked
+   *
    * \return true if the rate is a basic rate, false otherwise
    */
   bool IsBasicRate (uint32_t bs) const;
@@ -172,13 +176,15 @@
    */
   friend class ExtendedSupportedRatesIE;
   ExtendedSupportedRatesIE extended;
+
+
 private:
-  uint8_t m_nRates;  //!< Number of supported rates
+  uint8_t m_nRates;                      //!< Number of supported rates
   uint8_t m_rates[MAX_SUPPORTED_RATES];  //!< List of supported bitrate (divided by 500000)
 };
 
 std::ostream &operator << (std::ostream &os, const SupportedRates &rates);
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* SUPPORTED_RATES_H */
diff -Naur ns-3.23/src/wifi/model/vht-capabilities.cc ns-3.24/src/wifi/model/vht-capabilities.cc
--- ns-3.23/src/wifi/model/vht-capabilities.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/model/vht-capabilities.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,473 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015
+ *
+ * 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: Ghada Badawy <gbadawy@rim.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "vht-capabilities.h"
+#include "ns3/assert.h"
+#include "ns3/log.h"
+
+NS_LOG_COMPONENT_DEFINE ("VhtCapabilities");
+
+namespace ns3 {
+
+VhtCapabilities::VhtCapabilities ()
+  : m_maxMpduLength (0),
+    m_supportedChannelWidthSet (0),
+    m_rxLdpc (0),
+    m_shortGuardIntervalFor80Mhz (0),
+    m_shortGuardIntervalFor160Mhz (0),
+    m_txStbc (0),
+    m_rxStbc (0),
+    m_suBeamformerCapable (0),
+    m_suBeamformeeCapable (0),
+    m_beamformeeStsCapable (0),
+    m_numberOfSoundingDimensions (0),
+    m_muBeamformerCapable (0),
+    m_muBeamformeeCapable (0),
+    m_vhtTxopPs (0),
+    m_htcVhtCapable (0),
+    m_maxAmpduLengthExponent (0),
+    m_vhtLinkAdaptationCapable (0),
+    m_rxAntennaPatternConsistency (0),
+    m_txAntennaPatternConsistency (0),
+    m_rxHighestSupportedLongGuardIntervalDataRate (0),
+    m_txHighestSupportedLongGuardIntervalDataRate (0),
+    m_vhtSupported (0)
+{
+  m_rxMcsMap.resize (8,0);
+  m_txMcsMap.resize (8,0);
+}
+
+WifiInformationElementId
+VhtCapabilities::ElementId () const
+{
+  return IE_VHT_CAPABILITIES;
+}
+
+void
+VhtCapabilities::SetVhtSupported (uint8_t vhtsupported)
+{
+  m_vhtSupported = vhtsupported;
+}
+
+uint8_t
+VhtCapabilities::GetInformationFieldSize () const
+{
+  //we should not be here if ht is not supported
+  NS_ASSERT (m_vhtSupported > 0);
+  return 12;
+}
+
+Buffer::Iterator
+VhtCapabilities::Serialize (Buffer::Iterator i) const
+{
+  if (m_vhtSupported < 1)
+    {
+      return i;
+    }
+  return WifiInformationElement::Serialize (i);
+}
+
+uint16_t
+VhtCapabilities::GetSerializedSize () const
+{
+  if (m_vhtSupported < 1)
+    {
+      return 0;
+    }
+  return WifiInformationElement::GetSerializedSize ();
+}
+
+void
+VhtCapabilities::SerializeInformationField (Buffer::Iterator start) const
+{
+  if (m_vhtSupported == 1)
+    {
+      //write the corresponding value for each bit
+      start.WriteHtolsbU32 (GetVhtCapabilitiesInfo ());
+      start.WriteHtolsbU64 (GetSupportedMcsAndNssSet ());
+    }
+}
+
+uint8_t
+VhtCapabilities::DeserializeInformationField (Buffer::Iterator start,
+                                              uint8_t length)
+{
+  Buffer::Iterator i = start;
+  uint16_t vhtinfo = i.ReadLsbtohU32 ();
+  uint64_t mcsset = i.ReadLsbtohU64 ();
+  SetVhtCapabilitiesInfo (vhtinfo);
+  SetSupportedMcsAndNssSet (mcsset);
+  return length;
+}
+
+void
+VhtCapabilities::SetVhtCapabilitiesInfo (uint32_t ctrl)
+{
+  m_maxMpduLength = ctrl & 0x03;
+  m_supportedChannelWidthSet = (ctrl >> 2) & 0x03;
+  m_rxLdpc = (ctrl >> 4) & 0x01;
+  m_shortGuardIntervalFor80Mhz = (ctrl >> 5) & 0x01;
+  m_shortGuardIntervalFor160Mhz = (ctrl >> 6) & 0x01;
+  m_txStbc = (ctrl >> 7) & 0x01;
+  m_rxStbc = (ctrl >> 8) & 0x07;
+  m_suBeamformerCapable = (ctrl >> 11) & 0x01;
+  m_suBeamformeeCapable = (ctrl >> 12) & 0x01;
+  m_beamformeeStsCapable = (ctrl >> 13) & 0x07;
+  m_numberOfSoundingDimensions = (ctrl >> 16) & 0x07;
+  m_muBeamformerCapable = (ctrl >> 19) & 0x01;
+  m_muBeamformeeCapable = (ctrl >> 20) & 0x01;
+  m_vhtTxopPs = (ctrl >> 21) & 0x01;
+  m_htcVhtCapable = (ctrl >> 22) & 0x01;
+  m_maxAmpduLengthExponent = (ctrl >> 23) & 0x07;
+  m_vhtLinkAdaptationCapable = (ctrl >> 26) & 0x03;
+  m_rxAntennaPatternConsistency = (ctrl >> 28) & 0x01;
+  m_txAntennaPatternConsistency = (ctrl >> 29) & 0x01;
+}
+
+uint32_t
+VhtCapabilities::GetVhtCapabilitiesInfo () const
+{
+  uint32_t val = 0;
+  val |= m_maxMpduLength & 0x03;
+  val |= (m_supportedChannelWidthSet & 0x03) << 2;
+  val |= (m_rxLdpc & 0x01) << 4;
+  val |= (m_shortGuardIntervalFor80Mhz & 0x01) << 5;
+  val |= (m_shortGuardIntervalFor160Mhz & 0x01) << 6;
+  val |= (m_txStbc & 0x01) << 7;
+  val |= (m_rxStbc & 0x07) << 8;
+  val |= (m_suBeamformerCapable & 0x01) << 11;
+  val |= (m_suBeamformeeCapable & 0x01) << 12;
+  val |= (m_beamformeeStsCapable & 0x07) << 13;
+  val |= (m_numberOfSoundingDimensions & 0x07) << 16;
+  val |= (m_muBeamformerCapable & 0x01) << 19;
+  val |= (m_muBeamformeeCapable & 0x01) << 20;
+  val |= (m_vhtTxopPs & 0x01) << 21;
+  val |= (m_htcVhtCapable & 0x01) << 22;
+  val |= (m_maxAmpduLengthExponent & 0x07) << 23;
+  val |= (m_vhtLinkAdaptationCapable & 0x03) << 26;
+  val |= (m_rxAntennaPatternConsistency & 0x01) << 28;
+  val |= (m_txAntennaPatternConsistency & 0x01) << 29;
+  return val;
+}
+
+void
+VhtCapabilities::SetSupportedMcsAndNssSet (uint64_t ctrl)
+{
+  uint16_t n;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      n = i * 2;
+      m_rxMcsMap[i] = (ctrl >> n) & 0x03;
+    }
+  m_rxHighestSupportedLongGuardIntervalDataRate = (ctrl >> 16) & 0x1fff;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      uint16_t n = (i * 2) + 32;
+      m_txMcsMap[i] = (ctrl >> n) & 0x03;
+    }
+  m_txHighestSupportedLongGuardIntervalDataRate = (ctrl >> 48) & 0x1fff;
+}
+
+uint64_t
+VhtCapabilities::GetSupportedMcsAndNssSet () const
+{
+  uint64_t val = 0;
+  uint16_t n;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      n = i * 2;
+      val |= ((uint64_t)m_rxMcsMap[i] & 0x03) << n;
+    }
+  val |=  ((uint64_t)m_rxHighestSupportedLongGuardIntervalDataRate & 0x1fff) << 16;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      n = (i * 2) + 32;
+      val |= ((uint64_t)m_txMcsMap[i] & 0x03) << n;
+    }
+  val |= ((uint64_t)m_txHighestSupportedLongGuardIntervalDataRate & 0x1fff) << 48;
+  return val;
+}
+
+void
+VhtCapabilities::SetMaxMpduLength (uint8_t length)
+{
+  m_maxMpduLength = length;
+}
+
+void
+VhtCapabilities::SetSupportedChannelWidthSet (uint8_t channelwidthset)
+{
+  m_supportedChannelWidthSet = channelwidthset;
+}
+
+void
+VhtCapabilities::SetRxLdpc (uint8_t rxldpc)
+{
+  m_rxLdpc = rxldpc;
+}
+
+void
+VhtCapabilities::SetShortGuardIntervalFor80Mhz (uint8_t shortguardinterval)
+{
+  m_shortGuardIntervalFor80Mhz = shortguardinterval;
+}
+
+void
+VhtCapabilities::SetShortGuardIntervalFor160Mhz (uint8_t shortguardinterval)
+{
+  m_shortGuardIntervalFor160Mhz = shortguardinterval;
+}
+
+void
+VhtCapabilities::SetRxStbc (uint8_t rxstbc)
+{
+  m_rxStbc = rxstbc;
+}
+
+void
+VhtCapabilities::SetTxStbc (uint8_t txstbc)
+{
+  m_txStbc = txstbc;
+}
+
+void
+VhtCapabilities::SetMaxAmpduLengthExponent (uint8_t exponent)
+{
+  m_maxAmpduLengthExponent = exponent;
+}
+
+void
+VhtCapabilities::SetRxMcsMap (uint16_t map)
+{
+  //Set each element in the map accoriding to the 2 bits representing it page 98 in the 11ac standard
+  uint8_t n;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      n = i * 2;
+      m_rxMcsMap[i] = (map >> n) & 0x03;
+    }
+}
+
+void
+VhtCapabilities::SetRxMcsMap (uint8_t mcs, uint8_t nss)
+{
+  //MCS index should be at least 7 and should not exceed 9
+  NS_ASSERT (mcs >= 7 && mcs <= 9);
+  m_rxMcsMap[nss - 1] = mcs - 7; //1 = MCS 8; 2 = MCS 9
+}
+
+void
+VhtCapabilities::SetTxMcsMap (uint16_t map)
+{
+  //Set each element in the map accoriding to the 2 bits representing it page 98 in the 11ac standard
+  uint8_t n;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      n = i * 2;
+      m_txMcsMap[i] = (map >> n) & 0x03;
+    }
+}
+
+void
+VhtCapabilities::SetTxMcsMap (uint8_t mcs, uint8_t nss)
+{
+  //MCS index should be at least 7 and should not exceed 9
+  NS_ASSERT (mcs >= 7 && mcs <= 9);
+  m_txMcsMap[nss - 1] = mcs - 7; //1 = MCS 8; 2 = MCS 9
+}
+
+bool
+VhtCapabilities::IsSupportedTxMcs (uint8_t mcs) const
+{
+  NS_ASSERT (mcs >= 0 && mcs <= 9);
+  if (mcs <= 7)
+    {
+      return true;
+    }
+  if (mcs == 8 && m_txMcsMap[0] == 1)
+    {
+      return true;
+    }
+  if (mcs == 9 && m_txMcsMap[0] == 2)
+    {
+      return true;
+    }
+  return false;
+}
+
+bool
+VhtCapabilities::IsSupportedRxMcs (uint8_t mcs) const
+{
+  NS_ASSERT (mcs >= 0 && mcs <= 9);
+  if (mcs <= 7)
+    {
+      return true;
+    }
+  if (mcs == 8 && m_rxMcsMap[0] == 1)
+    {
+      return true;
+    }
+  if (mcs == 9 && m_rxMcsMap[0] == 2)
+    {
+      return true;
+    }
+  return false;
+}
+
+void
+VhtCapabilities::SetRxHighestSupportedLgiDataRate (uint16_t supporteddatarate)
+{
+  m_rxHighestSupportedLongGuardIntervalDataRate = supporteddatarate;
+}
+
+void
+VhtCapabilities::SetTxHighestSupportedLgiDataRate (uint16_t supporteddatarate)
+{
+  m_txHighestSupportedLongGuardIntervalDataRate = supporteddatarate;
+}
+
+uint8_t
+VhtCapabilities::GetMaxMpduLength () const
+{
+  return m_maxMpduLength;
+}
+
+uint8_t
+VhtCapabilities::GetSupportedChannelWidthSet () const
+{
+  return m_supportedChannelWidthSet;
+}
+
+uint8_t
+VhtCapabilities::GetRxLdpc () const
+{
+  return m_rxLdpc;
+}
+
+uint8_t
+VhtCapabilities::GetShortGuardIntervalFor80Mhz () const
+{
+  return m_shortGuardIntervalFor80Mhz;
+}
+
+uint8_t
+VhtCapabilities::GetShortGuardIntervalFor160Mhz () const
+{
+  return m_shortGuardIntervalFor160Mhz;
+}
+
+uint8_t
+VhtCapabilities::GetRxStbc () const
+{
+  return m_rxStbc;
+}
+
+uint8_t
+VhtCapabilities::GetTxStbc () const
+{
+  return m_txStbc;
+}
+
+uint8_t
+VhtCapabilities::GetMaxAmpduLengthExponent () const
+{
+  return m_maxAmpduLengthExponent;
+}
+
+bool
+VhtCapabilities::IsSupportedMcs (uint8_t mcs, uint8_t nss) const
+{
+  //The MCS index starts at 0 and NSS starts at 1
+  if (mcs <= 7 && m_rxMcsMap[nss - 1] < 3)
+    {
+      return true;
+    }
+  if (mcs == 8 && m_rxMcsMap[nss - 1] > 0 && m_rxMcsMap[nss - 1] < 3)
+    {
+      return true;
+    }
+  if (mcs == 9 && m_rxMcsMap[nss - 1] == 2)
+    {
+      return true;
+    }
+  return false;
+}
+
+uint16_t
+VhtCapabilities::GetRxMcsMap () const
+{
+  uint16_t val = 0;
+  uint8_t n;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      n = i * 2;
+      val |= (m_rxMcsMap[i] & 0x03) << n;
+    }
+  return val;
+}
+
+uint16_t
+VhtCapabilities::GetTxMcsMap () const
+{
+  uint16_t val = 0;
+  uint8_t n;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      n = i * 2;
+      val |= (m_txMcsMap[i] & 0x03) << n;
+    }
+  return val;
+}
+
+uint16_t
+VhtCapabilities::GetRxHighestSupportedLgiDataRate () const
+{
+  return m_rxHighestSupportedLongGuardIntervalDataRate;
+}
+
+uint16_t
+VhtCapabilities::GetTxHighestSupportedLgiDataRate () const
+{
+  return m_txHighestSupportedLongGuardIntervalDataRate;
+}
+
+ATTRIBUTE_HELPER_CPP (VhtCapabilities);
+
+std::ostream &
+operator << (std::ostream &os, const VhtCapabilities &VhtCapabilities)
+{
+  os <<  VhtCapabilities.GetVhtCapabilitiesInfo () << "|" << VhtCapabilities.GetSupportedMcsAndNssSet ();
+
+  return os;
+}
+
+std::istream &operator >> (std::istream &is,VhtCapabilities &VhtCapabilities)
+{
+  uint32_t c1;
+  uint64_t c2;
+  is >>  c1 >> c2;
+  VhtCapabilities.SetVhtCapabilitiesInfo (c1);
+  VhtCapabilities.SetSupportedMcsAndNssSet (c2);
+
+  return is;
+}
+
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/vht-capabilities.h ns-3.24/src/wifi/model/vht-capabilities.h
--- ns-3.23/src/wifi/model/vht-capabilities.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/model/vht-capabilities.h	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,159 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015
+ *
+ * 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: Ghada Badawy <gbadawy@gmail.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef VHT_CAPABILITIES_H
+#define VHT_CAPABILITIES_H
+
+#include <stdint.h>
+#include "ns3/buffer.h"
+#include "ns3/attribute-helper.h"
+#include "ns3/wifi-information-element.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ *
+ * The IEEE 802.11ac VHT Capabilities
+ */
+class VhtCapabilities : public WifiInformationElement
+{
+public:
+  VhtCapabilities ();
+  void SetVhtSupported (uint8_t vhtsupported);
+
+  WifiInformationElementId ElementId () const;
+  uint8_t GetInformationFieldSize () const;
+  void SerializeInformationField (Buffer::Iterator start) const;
+  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length);
+
+  /**
+   * Set the VHT Capabilties Info field in the VHT Capabilities information element.
+   *
+   * \param ctrl the VHT Capabilties Info field in the VHT Capabilities information element
+   */
+  void SetVhtCapabilitiesInfo (uint32_t ctrl);
+  /**
+   * Set the MCS and NSS field in the VHT Capabilities information element.
+   *
+   * \param ctrl the MCS and NSS field in the VHT Capabilities information element
+   */
+  void SetSupportedMcsAndNssSet (uint64_t ctrl);
+
+  /*
+   * Return the VHT Capabilties Info field in the VHT Capabilities information element.
+   *
+   * \return the VHT Capabilties Info field in the VHT Capabilities information element
+   */
+  uint32_t GetVhtCapabilitiesInfo () const;
+  /*
+   * Return the MCS and NSS field in the VHT Capabilities information element.
+   *
+   * \return the MCS and NSS field in the VHT Capabilities information element
+   */
+  uint64_t GetSupportedMcsAndNssSet () const;
+
+  //Capabilities Info fields
+  void SetMaxMpduLength (uint8_t length);
+  void SetSupportedChannelWidthSet (uint8_t channelwidthset);
+  void SetRxLdpc (uint8_t rxldpc);
+  void SetShortGuardIntervalFor80Mhz (uint8_t shortguardinterval);
+  void SetShortGuardIntervalFor160Mhz (uint8_t shortguardinterval);
+  void SetRxStbc (uint8_t rxstbc);
+  void SetTxStbc (uint8_t txstbc);
+  void SetMaxAmpduLengthExponent (uint8_t exponent);
+
+  uint8_t GetMaxMpduLength () const;
+  uint8_t GetSupportedChannelWidthSet () const;
+  uint8_t GetRxLdpc () const;
+  uint8_t GetShortGuardIntervalFor80Mhz () const;
+  uint8_t GetShortGuardIntervalFor160Mhz () const;
+  uint8_t GetRxStbc () const;
+  uint8_t GetTxStbc () const;
+  uint8_t GetMaxAmpduLengthExponent () const;
+
+  //MCS and NSS field information
+  void SetRxMcsMap (uint16_t map);
+  void SetRxMcsMap (uint8_t mcs, uint8_t nss);
+  void SetTxMcsMap (uint16_t map);
+  void SetTxMcsMap (uint8_t mcs, uint8_t nss);
+  void SetRxHighestSupportedLgiDataRate (uint16_t supporteddatarate);
+  void SetTxHighestSupportedLgiDataRate (uint16_t supporteddatarate);
+  bool IsSupportedMcs (uint8_t mcs, uint8_t Nss) const;
+
+  uint16_t GetRxMcsMap () const;
+  uint16_t GetTxMcsMap () const;
+  uint16_t GetRxHighestSupportedLgiDataRate () const;
+  uint16_t GetTxHighestSupportedLgiDataRate () const;
+
+  bool IsSupportedTxMcs (uint8_t mcs) const;
+  bool IsSupportedRxMcs (uint8_t mcs) const;
+
+  /*
+   * This information element is a bit special in that it is only
+   * included if the STA is an VHT STA. To support this we
+   * override the Serialize and GetSerializedSize methods of
+   * WifiInformationElement.
+   */
+  Buffer::Iterator Serialize (Buffer::Iterator start) const;
+  uint16_t GetSerializedSize () const;
+
+
+private:
+  //Capabilities Info fields
+  uint16_t m_maxMpduLength;
+  uint16_t m_supportedChannelWidthSet;
+  uint8_t m_rxLdpc;
+  uint8_t m_shortGuardIntervalFor80Mhz;
+  uint8_t m_shortGuardIntervalFor160Mhz;
+  uint8_t m_txStbc;
+  uint8_t m_rxStbc;
+  uint8_t m_suBeamformerCapable;
+  uint8_t m_suBeamformeeCapable;
+  uint8_t m_beamformeeStsCapable;
+  uint8_t m_numberOfSoundingDimensions;
+  uint8_t m_muBeamformerCapable;
+  uint8_t m_muBeamformeeCapable;
+  uint8_t m_vhtTxopPs;
+  uint8_t m_htcVhtCapable;
+  uint8_t m_maxAmpduLengthExponent;
+  uint8_t m_vhtLinkAdaptationCapable;
+  uint8_t m_rxAntennaPatternConsistency;
+  uint8_t m_txAntennaPatternConsistency;
+
+  //MCS and NSS field information
+  std::vector<uint8_t> m_rxMcsMap;
+  uint16_t m_rxHighestSupportedLongGuardIntervalDataRate;
+  std::vector<uint8_t> m_txMcsMap;
+  uint16_t m_txHighestSupportedLongGuardIntervalDataRate;
+
+  //This is used to decide if this element should be added to the frame or not
+  uint8_t m_vhtSupported;
+};
+
+std::ostream &operator << (std::ostream &os, const VhtCapabilities &vhtcapabilities);
+std::istream &operator >> (std::istream &is, VhtCapabilities &vhtcapabilities);
+
+ATTRIBUTE_HELPER_HEADER (VhtCapabilities)
+
+} //namespace ns3
+
+#endif /* VHT_CAPABILITY_H */
diff -Naur ns-3.23/src/wifi/model/wifi-channel.cc ns-3.24/src/wifi/model/wifi-channel.cc
--- ns-3.23/src/wifi/model/wifi-channel.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-channel.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage, <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "ns3/packet.h"
 #include "ns3/simulator.h"
 #include "ns3/mobility-model.h"
@@ -47,4 +48,4 @@
   return tid;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-channel.h ns-3.24/src/wifi/model/wifi-channel.h
--- ns-3.23/src/wifi/model/wifi-channel.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-channel.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage, <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef WIFI_CHANNEL_H
 #define WIFI_CHANNEL_H
 
@@ -45,7 +46,7 @@
   static TypeId GetTypeId (void);
 };
 
-} // namespace ns3
+} //namespace ns3
 
 
 #endif /* WIFI_CHANNEL_H */
diff -Naur ns-3.23/src/wifi/model/wifi-information-element.cc ns-3.24/src/wifi/model/wifi-information-element.cc
--- ns-3.23/src/wifi/model/wifi-information-element.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-information-element.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,7 +15,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Authors: Dean Armstrong <deanarm@gmail.com>
+ * Author: Dean Armstrong <deanarm@gmail.com>
  */
 
 #include "ns3/wifi-information-element.h"
@@ -52,8 +52,8 @@
 {
   Buffer::Iterator start = i;
   i = DeserializeIfPresent (i);
-  // This IE was not optional, so confirm that we did actually
-  // deserialise something.
+  //This IE was not optional, so confirm that we did actually
+  //deserialise something.
   NS_ASSERT (i.GetDistanceFrom (start) != 0);
   return i;
 }
@@ -61,12 +61,16 @@
 Buffer::Iterator
 WifiInformationElement::DeserializeIfPresent (Buffer::Iterator i)
 {
+  if (i.IsEnd ())
+    {
+      return i;
+    }
   Buffer::Iterator start = i;
   uint8_t elementId = i.ReadU8 ();
 
-  // If the element here isn't the one we're after then we immediately
-  // return the iterator we were passed indicating that we haven't
-  // taken anything from the buffer.
+  //If the element here isn't the one we're after then we immediately
+  //return the iterator we were passed indicating that we haven't
+  //taken anything from the buffer.
   if (elementId != ElementId ())
     {
       return start;
@@ -80,7 +84,6 @@
   return i;
 }
 
-
 bool
 WifiInformationElement::operator< (WifiInformationElement const & a) const
 {
@@ -112,4 +115,4 @@
   return (memcmp (myIe.PeekData (), hisIe.PeekData (), ieSize) == 0);
 }
 
-}
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-information-element.h ns-3.24/src/wifi/model/wifi-information-element.h
--- ns-3.23/src/wifi/model/wifi-information-element.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-information-element.h	2015-09-15 11:18:44.000000000 -0700
@@ -15,7 +15,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Authors: Dean Armstrong <deanarm@gmail.com>
+ * Author: Dean Armstrong <deanarm@gmail.com>
  */
 
 #ifndef WIFI_INFORMATION_ELEMENT_H
@@ -85,9 +85,39 @@
 #define IE_EXTENDED_SUPPORTED_RATES            ((WifiInformationElementId)50)
 // 51 to 126 are reserved in 802.11-2007
 #define IE_EXTENDED_CAPABILITIES               ((WifiInformationElementId)127)
-// 128 to 220 are reserved in 802.11-2007
+// 128 to 190 are reserved in 802.11-2007
+#define IE_VHT_CAPABILITIES                    ((WifiInformationElementId)191)
 #define IE_VENDOR_SPECIFIC                     ((WifiInformationElementId)221)
 // 222 to 255 are reserved in 802.11-2007
+#define IE11S_LINK_METRIC_REPORT               ((WifiInformationElementId)115)
+#define IE11S_CONGESTION_NOTIFICATION          ((WifiInformationElementId)116)
+#define IE11S_SUPP_MBSS_REG_CLASSES_CHANNELS   ((WifiInformationElementId)23)
+#define IE11S_MESH_CHANNEL_SWITCH_ANNOUNCEMENT ((WifiInformationElementId)24)
+#define IE11S_MESH_TIM                         ((WifiInformationElementId)25)
+#define IE11S_AWAKE_WINDOW                     ((WifiInformationElementId)119)
+#define IE11S_BEACON_TIMING                    ((WifiInformationElementId)120)
+#define IE11S_MCCAOP_SETUP_REQUEST             ((WifiInformationElementId)121)
+#define IE11S_MCCAOP_SETUP_REPLY               ((WifiInformationElementId)122)
+#define IE11S_MCCAOP_ADVERTISEMENT             ((WifiInformationElementId)123)
+#define IE11S_MCCAOP_RESERVATION_TEARDOWN      ((WifiInformationElementId)31)
+#define IE11S_PORTAL_ANNOUNCEMENT              ((WifiInformationElementId)32)
+#define IE11S_PROXY_UPDATE                     ((WifiInformationElementId)137)
+#define IE11S_PROXY_UPDATE_CONFIRMATION        ((WifiInformationElementId)138)
+#define IE11S_ABBREVIATED_HANDSHAKE            ((WifiInformationElementId)39)
+/* begin of open80211s-compatible IDs */
+#define IE11S_MESH_CONFIGURATION               ((WifiInformationElementId)113)
+#define IE11S_MESH_ID                          ((WifiInformationElementId)114)
+#define IE11S_PEERING_MANAGEMENT               ((WifiInformationElementId)117)
+/* end of open80211s-compatible IDs */
+#define IE11S_RANN                             ((WifiInformationElementId)126)
+/* begin of open80211s-compatible IDs */
+#define IE11S_PREQ                             ((WifiInformationElementId)130)
+#define IE11S_PREP                             ((WifiInformationElementId)131)
+#define IE11S_PERR                             ((WifiInformationElementId)132)
+/* end of open80211s-compatible IDs */
+#define IE11S_MESH_PEERING_PROTOCOL_VERSION    ((WifiInformationElementId)74)
+
+
 
 
 /**
@@ -134,8 +164,8 @@
   /**
    * Serialize entire IE including Element ID and length fields
    *
-   * \param i an iterator which points to where the IE should
-   *        be written.
+   * \param i an iterator which points to where the IE should be written.
+   *
    * \return an iterator
    */
   Buffer::Iterator Serialize (Buffer::Iterator i) const;
@@ -146,6 +176,7 @@
    * otherwise this method will generate a fatal error.
    *
    * \param i an iterator which points to where the IE should be read.
+   *
    * \return an iterator
    */
   Buffer::Iterator Deserialize (Buffer::Iterator i);
@@ -156,6 +187,7 @@
    * in then it will return the same iterator.
    *
    * \param i an iterator which points to where the IE should be read.
+   *
    * \return an iterator
    */
   Buffer::Iterator DeserializeIfPresent (Buffer::Iterator i);
@@ -191,15 +223,15 @@
    * Deserialize information (i.e., the body of the IE, not including
    * the Element ID and length octets)
    *
-   * \param start an iterator which points to where the information should
-   *        be written.
+   * \param start an iterator which points to where the information should be written.
    * \param length
+   *
    * \return the number of bytes read
    */
   virtual uint8_t DeserializeInformationField (Buffer::Iterator start,
                                                uint8_t length) = 0;
 
-  // In addition, a subclass my optionally override the following...
+  // In addition, a subclass may optionally override the following...
   /**
    * Generate human-readable form of IE
    *
@@ -210,6 +242,7 @@
    * Compare information elements using Element ID
    *
    * \param a another information element to compare with
+   *
    * \return true if the Element ID is less than the other IE Element ID,
    *         false otherwise
    */
@@ -219,11 +252,14 @@
    * memcmp of serialised version
    *
    * \param a another information element to compare with
-   * \return true if the two IEs are equal, false otherwise
+   *
+   * \return true if the two IEs are equal,
+   *         false otherwise
    */
   virtual bool operator== (WifiInformationElement const & a) const;
 
 };
 
-}
+} //namespace ns3
+
 #endif /* WIFI_INFORMATION_ELEMENT_H */
diff -Naur ns-3.23/src/wifi/model/wifi-information-element-vector.cc ns-3.24/src/wifi/model/wifi-information-element-vector.cc
--- ns-3.23/src/wifi/model/wifi-information-element-vector.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-information-element-vector.cc	2015-09-15 11:18:44.000000000 -0700
@@ -30,6 +30,7 @@
   : m_maxSize (1500)
 {
 }
+
 WifiInformationElementVector::~WifiInformationElementVector ()
 {
   for (IE_VECTOR::iterator i = m_elements.begin (); i != m_elements.end (); i++)
@@ -38,6 +39,7 @@
     }
   m_elements.clear ();
 }
+
 TypeId
 WifiInformationElementVector::GetTypeId ()
 {
@@ -47,16 +49,19 @@
     .AddConstructor<WifiInformationElementVector> ();
   return tid;
 }
+
 TypeId
 WifiInformationElementVector::GetInstanceTypeId () const
 {
   return GetTypeId ();
 }
+
 uint32_t
 WifiInformationElementVector::GetSerializedSize () const
 {
   return GetSize ();
 }
+
 void
 WifiInformationElementVector::Serialize (Buffer::Iterator start) const
 {
@@ -65,6 +70,7 @@
       start = (*i)->Serialize (start);
     }
 }
+
 uint32_t
 WifiInformationElementVector::Deserialize (Buffer::Iterator start)
 {
@@ -78,6 +84,7 @@
     }
   return i.GetDistanceFrom (start);
 }
+
 uint32_t
 WifiInformationElementVector::DeserializeSingleIe (Buffer::Iterator start)
 {
@@ -85,7 +92,7 @@
   uint8_t id = i.ReadU8 ();
   //unused: uint8_t length = i.ReadU8 ();
   //but need side effects of read:
-  i.ReadU8 ();  
+  i.ReadU8 ();
   Ptr<WifiInformationElement> newElement;
   switch (id)
     {
@@ -104,26 +111,36 @@
   return i.GetDistanceFrom (start);
   */
 }
+
 void
 WifiInformationElementVector::Print (std::ostream & os) const
 {
-  /// \todo
+  for (IE_VECTOR::const_iterator i = m_elements.begin (); i != m_elements.end (); i++)
+    {
+       os << "(";
+      (*i)->Print (os);
+       os << ")";
+    }
 }
+
 void
 WifiInformationElementVector::SetMaxSize (uint16_t size)
 {
   m_maxSize = size;
 }
+
 WifiInformationElementVector::Iterator
 WifiInformationElementVector::Begin ()
 {
   return m_elements.begin ();
 }
+
 WifiInformationElementVector::Iterator
 WifiInformationElementVector::End ()
 {
   return m_elements.end ();
 }
+
 bool
 WifiInformationElementVector::AddInformationElement (Ptr<WifiInformationElement> element)
 {
@@ -134,6 +151,7 @@
   m_elements.push_back (element);
   return true;
 }
+
 Ptr<WifiInformationElement>
 WifiInformationElementVector::FindFirst (WifiInformationElementId id) const
 {
@@ -146,7 +164,10 @@
     }
   return 0;
 }
+
+
 namespace {
+
 struct PIEComparator
 {
   bool
@@ -155,7 +176,10 @@
     return ((*PeekPointer (a)) < (*PeekPointer (b)));
   }
 };
+
 }
+
+
 uint32_t
 WifiInformationElementVector::GetSize () const
 {
@@ -175,13 +199,13 @@
       NS_ASSERT (false);
       return false;
     }
-  // In principle we could bypass some of the faffing about (and speed
-  // the comparison) by simply serialising each IE vector into a
-  // buffer and memcmp'ing the two.
+  //In principle we could bypass some of the faffing about (and speed
+  //the comparison) by simply serialising each IE vector into a
+  //buffer and memcmp'ing the two.
   //
-  // I'm leaving it like this, however, so that there is the option of
-  // having individual Information Elements implement slightly more
-  // flexible equality operators.
+  //I'm leaving it like this, however, so that there is the option of
+  //having individual Information Elements implement slightly more
+  //flexible equality operators.
   WifiInformationElementVector::IE_VECTOR::const_iterator j = a.m_elements.begin ();
   for (WifiInformationElementVector::IE_VECTOR::const_iterator i = m_elements.begin (); i
        != m_elements.end (); i++, j++)
@@ -195,4 +219,4 @@
   return true;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-information-element-vector.h ns-3.24/src/wifi/model/wifi-information-element-vector.h
--- ns-3.23/src/wifi/model/wifi-information-element-vector.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-information-element-vector.h	2015-09-15 11:18:44.000000000 -0700
@@ -24,10 +24,8 @@
 
 #include "ns3/header.h"
 #include "ns3/simple-ref-count.h"
-
 #include "ns3/wifi-information-element.h"
 
-
 namespace ns3 {
 
 /**
@@ -44,7 +42,7 @@
 {
 public:
   WifiInformationElementVector ();
-  ~WifiInformationElementVector ();
+  virtual ~WifiInformationElementVector ();
 
   static TypeId GetTypeId ();
   TypeId GetInstanceTypeId () const;
@@ -53,15 +51,17 @@
   /**
    * \attention When you use RemoveHeader, WifiInformationElementVector supposes, that
    * all buffer consists of information elements
-   * @param start
-   * @return
+   *
+   * \param start
    */
   virtual uint32_t Deserialize (Buffer::Iterator start);
   virtual void Print (std::ostream &os) const;
 
   /**
    * \brief Needed when you try to deserialize a lonely IE inside other header
+   *
    * \param start is the start of the buffer
+   *
    * \return deserialized bytes
    */
   virtual uint32_t DeserializeSingleIe (Buffer::Iterator start);
@@ -80,12 +80,15 @@
 
   /**
    * Check if the given WifiInformationElementVectors are equivalent.
-   * 
+   *
    * \param a another WifiInformationElementVector
+   *
    * \return true if the given WifiInformationElementVectors are equivalent,
    *         false otherwise
    */
   virtual bool operator== (const WifiInformationElementVector & a) const;
+
+
 protected:
   /**
    * typedef for a vector of WifiInformationElements.
@@ -98,5 +101,6 @@
   uint16_t m_maxSize;
 };
 
-}
+} //namespace ns3
+
 #endif /* WIFI_INFORMATION_ELEMENT_VECTOR_H */
diff -Naur ns-3.23/src/wifi/model/wifi-mac.cc ns-3.24/src/wifi/model/wifi-mac.cc
--- ns-3.23/src/wifi/model/wifi-mac.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-mac.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "wifi-mac.h"
 #include "dcf.h"
 #include "ns3/uinteger.h"
@@ -25,43 +26,49 @@
 namespace ns3 {
 
 NS_OBJECT_ENSURE_REGISTERED (WifiMac);
-  
+
 
 Time
 WifiMac::GetDefaultMaxPropagationDelay (void)
 {
-  // 1000m
+  //1000m
   return Seconds (1000.0 / 300000000.0);
 }
+
 Time
 WifiMac::GetDefaultSlot (void)
 {
-  // 802.11-a specific
+  //802.11-a specific
   return MicroSeconds (9);
 }
+
 Time
 WifiMac::GetDefaultSifs (void)
 {
-  // 802.11-a specific
+  //802.11-a specific
   return MicroSeconds (16);
 }
-Time 
+
+Time
 WifiMac::GetDefaultRifs (void)
 {
   //802.11n specific
   return MicroSeconds (2);
 }
+
 Time
 WifiMac::GetDefaultEifsNoDifs (void)
 {
   return GetDefaultSifs () + GetDefaultCtsAckDelay ();
 }
+
 Time
 WifiMac::GetDefaultCtsAckDelay (void)
 {
-  // 802.11-a specific: 6mb/s
+  //802.11-a specific: at 6 Mbit/s
   return MicroSeconds (44);
 }
+
 Time
 WifiMac::GetDefaultCtsAckTimeout (void)
 {
@@ -79,16 +86,18 @@
 Time
 WifiMac::GetDefaultBasicBlockAckDelay (void)
 {
-  // This value must be rivisited
+  //This value must be rivisited
   return MicroSeconds (250);
 }
+
 Time
 WifiMac::GetDefaultCompressedBlockAckDelay (void)
 {
-  // This value must be rivisited was 68. 
- //CompressedBlockAckSize 32* 8*time it takes to transfer at the lowest rate (6Mb/s)+ aPhy-StartDelay(33)
+  //This value must be rivisited
+  //CompressedBlockAckSize 32 * 8 * time it takes to transfer at the lowest rate (at 6 Mbit/s) + aPhy-StartDelay (33)
   return MicroSeconds (76);
 }
+
 Time
 WifiMac::GetDefaultBasicBlockAckTimeout (void)
 {
@@ -98,6 +107,7 @@
   blockAckTimeout += GetDefaultSlot ();
   return blockAckTimeout;
 }
+
 Time
 WifiMac::GetDefaultCompressedBlockAckTimeout (void)
 {
@@ -165,7 +175,7 @@
                    MakeTimeAccessor (&WifiMac::SetSifs,
                                      &WifiMac::GetSifs),
                    MakeTimeChecker ())
-    .AddAttribute ("EifsNoDifs", "The value of EIFS-DIFS",
+    .AddAttribute ("EifsNoDifs", "The value of EIFS-DIFS.",
                    TimeValue (GetDefaultEifsNoDifs ()),
                    MakeTimeAccessor (&WifiMac::SetEifsNoDifs,
                                      &WifiMac::GetEifsNoDifs),
@@ -180,12 +190,11 @@
                    MakeTimeAccessor (&WifiMac::SetPifs,
                                      &WifiMac::GetPifs),
                    MakeTimeChecker ())
-.AddAttribute ("Rifs", "The value of the RIFS constant.",
+    .AddAttribute ("Rifs", "The value of the RIFS constant.",
                    TimeValue (GetDefaultRifs ()),
                    MakeTimeAccessor (&WifiMac::SetRifs,
                                      &WifiMac::GetRifs),
                    MakeTimeChecker ())
-
     .AddAttribute ("MaxPropagationDelay", "The maximum propagation delay. Unused for now.",
                    TimeValue (GetDefaultMaxPropagationDelay ()),
                    MakeTimeAccessor (&WifiMac::m_maxPropagationDelay),
@@ -206,27 +215,25 @@
                      "ns3::Packet::TracedCallback")
     .AddTraceSource ("MacPromiscRx",
                      "A packet has been received by this device, has been passed up from the physical layer "
-                     "and is being forwarded up the local protocol stack.  This is a promiscuous trace,",
+                     "and is being forwarded up the local protocol stack.  This is a promiscuous trace.",
                      MakeTraceSourceAccessor (&WifiMac::m_macPromiscRxTrace),
                      "ns3::Packet::TracedCallback")
     .AddTraceSource ("MacRx",
                      "A packet has been received by this device, has been passed up from the physical layer "
-                     "and is being forwarded up the local protocol stack.  This is a non-promiscuous trace,",
+                     "and is being forwarded up the local protocol stack. This is a non-promiscuous trace.",
                      MakeTraceSourceAccessor (&WifiMac::m_macRxTrace),
                      "ns3::Packet::TracedCallback")
     .AddTraceSource ("MacRxDrop",
-                     "A packet has been dropped in the MAC layer after it has been passed up from the physical "
-                     "layer.",
+                     "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")
-#if 0
-    // Not currently implemented in this device
+    //Not currently implemented in this device
+    /*
     .AddTraceSource ("Sniffer",
                      "Trace source simulating a non-promiscuous packet sniffer attached to the device",
                      MakeTraceSourceAccessor (&WifiMac::m_snifferTrace))
-#endif
+    */
   ;
-
   return tid;
 }
 
@@ -241,6 +248,7 @@
 {
   return Seconds (10);
 }
+
 Time
 WifiMac::GetMaxPropagationDelay (void) const
 {
@@ -306,6 +314,9 @@
     case WIFI_PHY_STANDARD_80211n_5GHZ:
       Configure80211n_5Ghz ();
       break;
+    case WIFI_PHY_STANDARD_80211ac:
+      Configure80211ac ();
+      break;
     default:
       NS_ASSERT (false);
       break;
@@ -339,7 +350,11 @@
 WifiMac::Configure80211g (void)
 {
   SetSifs (MicroSeconds (10));
-  // Note no support for Short Slot Time as yet
+  // Slot time defaults to the "long slot time" of 20 us in the standard
+  // according to mixed 802.11b/g deployments.  Short slot time is supported
+  // if the user sets the slot to 9 us *after* calling Configure80211g().
+  // The other parameters below should also be adjusted accordingly as they
+  // depend on slot time.
   SetSlot (MicroSeconds (20));
   SetEifsNoDifs (MicroSeconds (10 + 304));
   SetPifs (MicroSeconds (10 + 20));
@@ -373,7 +388,7 @@
 WifiMac::Configure80211n_2_4Ghz (void)
 {
   Configure80211g ();
-  SetRifs(MicroSeconds (2));
+  SetRifs (MicroSeconds (2));
   SetBasicBlockAckTimeout (GetSifs () + GetSlot () + GetDefaultBasicBlockAckDelay () + GetDefaultMaxPropagationDelay () * 2);
   SetCompressedBlockAckTimeout (GetSifs () + GetSlot () + GetDefaultCompressedBlockAckDelay () + GetDefaultMaxPropagationDelay () * 2);
 }
@@ -381,12 +396,18 @@
 WifiMac::Configure80211n_5Ghz (void)
 {
   Configure80211a ();
-  SetRifs(MicroSeconds (2));
+  SetRifs (MicroSeconds (2));
   SetBasicBlockAckTimeout (GetSifs () + GetSlot () + GetDefaultBasicBlockAckDelay () + GetDefaultMaxPropagationDelay () * 2);
   SetCompressedBlockAckTimeout (GetSifs () + GetSlot () + GetDefaultCompressedBlockAckDelay () + GetDefaultMaxPropagationDelay () * 2);
 }
 
 void
+WifiMac::Configure80211ac (void)
+{
+  Configure80211n_5Ghz ();
+}
+
+void
 WifiMac::ConfigureDcf (Ptr<Dcf> dcf, uint32_t cwmin, uint32_t cwmax, enum AcIndex ac)
 {
   /* see IEE802.11 section 7.3.2.29 */
@@ -422,4 +443,6 @@
       break;
     }
 }
-} // namespace ns3
+
+} //namespace ns3
+
diff -Naur ns-3.23/src/wifi/model/wifi-mac.h ns-3.24/src/wifi/model/wifi-mac.h
--- ns-3.23/src/wifi/model/wifi-mac.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-mac.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,12 +17,12 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef WIFI_MAC_H
 #define WIFI_MAC_H
 
 #include "ns3/packet.h"
 #include "ns3/mac48-address.h"
-
 #include "wifi-phy.h"
 #include "wifi-remote-station-manager.h"
 #include "ssid.h"
@@ -84,12 +84,11 @@
    * Unused for now.
    */
   void SetMaxPropagationDelay (Time delay);
-/**
+
+  /**
    * \return the current RIFS duration.
    */
-
   virtual Time GetRifs (void) const = 0;
-
   /**
    * \return the current PIFS duration.
    */
@@ -122,11 +121,10 @@
   Time GetMsduLifetime (void) const;
   /**
    * \return the maximum propagation delay.
-   * 
+   *
    * Unused for now.
    */
   Time GetMaxPropagationDelay (void) const;
-
   /**
    * \return the MAC address associated to this MAC layer.
    */
@@ -163,7 +161,7 @@
    *
    * The packet should be enqueued in a tx queue, and should be
    * dequeued as soon as the DCF function determines that
-   * access it granted to this MAC.  The extra parameter "from" allows
+   * access it granted to this MAC. The extra parameter "from" allows
    * this device to operate in a bridged mode, forwarding received
    * frames without altering the source address.
    */
@@ -246,50 +244,45 @@
   /**
    * \param packet the packet being enqueued
    *
-   * Public method used to fire a MacTx trace.  Implemented for encapsulation
-   * purposes.  Note this trace indicates that the packet was accepted by the
-   * device only.  The packet may be dropped later (e.g. if the queue is full).
+   * Public method used to fire a MacTx trace. Implemented for encapsulation purposes.
+   * Note this trace indicates that the packet was accepted by the device only.
+   * The packet may be dropped later (e.g. if the queue is full).
    */
   void NotifyTx (Ptr<const Packet> packet);
-
   /**
    * \param packet the packet being dropped
-   * 
-   * Public method used to fire a MacTxDrop trace.  Implemented for encapsulation
-   * purposes.  This trace indicates that the packet was dropped before it was
-   * transmitted (e.g. when a STA is not associated with an AP).
+   *
+   * Public method used to fire a MacTxDrop trace. Implemented for encapsulation purposes.
+   * This trace indicates that the packet was dropped before it was transmitted
+   * (e.g. when a STA is not associated with an AP).
    */
   void NotifyTxDrop (Ptr<const Packet> packet);
-
   /**
    * \param packet the packet we received
-   * 
-   * Public method used to fire a MacRx trace.  Implemented for encapsulation
-   * purposes.
+   *
+   * Public method used to fire a MacRx trace. Implemented for encapsulation purposes.
    */
   void NotifyRx (Ptr<const Packet> packet);
-
   /**
    * \param packet the packet we received promiscuously
    *
-   * Public method used to fire a MacPromiscRx trace.  Implemented for encapsulation
-   * purposes.
+   * Public method used to fire a MacPromiscRx trace. Implemented for encapsulation purposes.
    */
   void NotifyPromiscRx (Ptr<const Packet> packet);
-
   /**
    * \param packet the packet we received but is not destined for us
-   * 
-   * Public method used to fire a MacRxDrop trace.  Implemented for encapsulation
-   * purposes.
+   *
+   * Public method used to fire a MacRxDrop trace. Implemented for encapsulation purposes.
    */
   void NotifyRxDrop (Ptr<const Packet> packet);
+
   /**
    * \param standard the wifi standard to be configured
    *
    * This method sets standards-compliant defaults for WifiMac
    * parameters such as sifs time, slot time, timeout values, etc.,
    * based on the standard selected.
+   *
    * \sa WifiMac::Configure80211a
    * \sa WifiMac::Configure80211b
    * \sa WifiMac::Configure80211g
@@ -297,9 +290,11 @@
    * \sa WifiMac::Configure80211_5Mhz
    * \sa WifiMac::Configure80211n_2_4Ghz
    * \sa WifiMac::Configure80211n_5Ghz
+   * \sa WifiMac::Configure80211ac
    */
   void ConfigureStandard (enum WifiPhyStandard standard);
 
+
 protected:
   /**
    * \param dcf the DCF to be configured
@@ -310,6 +305,8 @@
    * Configure the DCF with appropriate values depending on the given access category.
    */
   void ConfigureDcf (Ptr<Dcf> dcf, uint32_t cwmin, uint32_t cwmax, enum AcIndex ac);
+
+
 private:
   /**
    * \return the default maximum propagation delay
@@ -320,38 +317,38 @@
   static Time GetDefaultMaxPropagationDelay (void);
   /**
    * \return the default slot duration
-   * 
+   *
    * Return a default slot value for 802.11a (9 microseconds).
    */
   static Time GetDefaultSlot (void);
   /**
    * \return the default short interframe space (SIFS)
-   * 
+   *
    * Return a default SIFS value for 802.11a (16 microseconds).
    */
   static Time GetDefaultSifs (void);
   /**
    * \return the default reduced interframe space (RIFS)
-   * 
+   *
    * Return a default RIFS value for 802.11n (2 microseconds).
    */
   static Time GetDefaultRifs (void);
   /**
    * \return the default extended interframe space (EIFS) without
-   *          DCF interframe space (DIFS)
-   * 
+   *         DCF interframe space (DIFS)
+   *
    * Return default SIFS + default CTS-ACK delay
    */
   static Time GetDefaultEifsNoDifs (void);
   /**
    * \return the default CTS-ACK delay
-   * 
+   *
    * Return a default value for 802.11a at 6Mbps (44 microseconds)
    */
   static Time GetDefaultCtsAckDelay (void);
   /**
    * \return the default CTS and ACK timeout
-   * 
+   *
    * Return the default CTS and ACK timeout.
    * Cts_Timeout and Ack_Timeout are specified in the Annex C
    * (Formal description of MAC operation, see details on the
@@ -384,6 +381,7 @@
    * \return the default compressed block ACK timeout
    */
   static Time GetDefaultCompressedBlockAckTimeout (void);
+
   /**
    * \param standard the phy standard to be used
    *
@@ -407,7 +405,7 @@
    */
   void Configure80211b (void);
   /**
-   * This method sets 802.11g standards-compliant defaults for following attributes:  
+   * This method sets 802.11g standards-compliant defaults for following attributes:
    * Sifs, Slot, EifsNoDifs, Pifs, CtsTimeout, and AckTimeout.
    * There is no support for short slot time.
    */
@@ -424,15 +422,20 @@
   void Configure80211_5Mhz ();
   /**
    * This method sets 802.11n 2.4 GHz standards-compliant defaults for following attributes:
-   * Sifs, Slot, EifsNoDifs, Pifs, CtsTimeout, and AckTimeout.
+   * Sifs, Rifs, Slot, EifsNoDifs, Pifs, CtsTimeout, and AckTimeout.
    * There is no support for short slot time.
    */
   void Configure80211n_2_4Ghz (void);
   /**
    * This method sets 802.11n 5 GHz standards-compliant defaults for following attributes:
-   * Sifs, Slot, EifsNoDifs, Pifs, CtsTimeout, and AckTimeout.
+   * Sifs, Rifs, Slot, EifsNoDifs, Pifs, CtsTimeout, and AckTimeout.
    */
   void Configure80211n_5Ghz (void);
+  /**
+  * This method sets 802.11ac standards-compliant defaults for following attributes:
+  * Sifs, Slot, EifsNoDifs, Pifs, CtsTimeout, and AckTimeout.
+  */
+  void Configure80211ac (void);
 
   /**
    * The trace source fired when packets come into the "top" of the device
@@ -441,7 +444,6 @@
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_macTxTrace;
-
   /**
    * The trace source fired when packets coming into the "top" of the device
    * are dropped at the MAC layer during transmission.
@@ -449,7 +451,6 @@
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_macTxDropTrace;
-
   /**
    * The trace source fired for packets successfully received by the device
    * immediately before being forwarded up to higher layers (at the L2/L3
@@ -458,7 +459,6 @@
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_macPromiscRxTrace;
-
   /**
    * The trace source fired for packets successfully received by the device
    * immediately before being forwarded up to higher layers (at the L2/L3
@@ -467,7 +467,6 @@
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_macRxTrace;
-
   /**
    * The trace source fired when packets coming into the "top" of the device
    * are dropped at the MAC layer during reception.
@@ -475,9 +474,9 @@
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_macRxDropTrace;
-
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* WIFI_MAC_H */
+
diff -Naur ns-3.23/src/wifi/model/wifi-mac-header.cc ns-3.24/src/wifi/model/wifi-mac-header.cc
--- ns-3.23/src/wifi/model/wifi-mac-header.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-mac-header.cc	2015-09-15 11:18:44.000000000 -0700
@@ -41,13 +41,12 @@
   SUBTYPE_CTL_RTS = 11,
   SUBTYPE_CTL_CTS = 12,
   SUBTYPE_CTL_ACK = 13,
-  SUBTYPE_CTL_CTLWRAPPER=7
+  SUBTYPE_CTL_CTLWRAPPER = 7
 
 };
 
 WifiMacHeader::WifiMacHeader ()
-  :
-    m_ctrlMoreData (0),
+  : m_ctrlMoreData (0),
     m_ctrlWep (0),
     m_ctrlOrder (1),
     m_amsduPresent (0)
@@ -62,16 +61,19 @@
 {
   m_ctrlFromDs = 1;
 }
+
 void
 WifiMacHeader::SetDsNotFrom (void)
 {
   m_ctrlFromDs = 0;
 }
+
 void
 WifiMacHeader::SetDsTo (void)
 {
   m_ctrlToDs = 1;
 }
+
 void
 WifiMacHeader::SetDsNotTo (void)
 {
@@ -83,57 +85,67 @@
 {
   m_addr1 = address;
 }
+
 void
 WifiMacHeader::SetAddr2 (Mac48Address address)
 {
   m_addr2 = address;
 }
+
 void
 WifiMacHeader::SetAddr3 (Mac48Address address)
 {
   m_addr3 = address;
 }
+
 void
 WifiMacHeader::SetAddr4 (Mac48Address address)
 {
   m_addr4 = address;
 }
+
 void
 WifiMacHeader::SetAssocReq (void)
 {
   m_ctrlType = TYPE_MGT;
   m_ctrlSubtype = 0;
 }
+
 void
 WifiMacHeader::SetAssocResp (void)
 {
   m_ctrlType = TYPE_MGT;
   m_ctrlSubtype = 1;
 }
+
 void
 WifiMacHeader::SetProbeReq (void)
 {
   m_ctrlType = TYPE_MGT;
   m_ctrlSubtype = 4;
 }
+
 void
 WifiMacHeader::SetProbeResp (void)
 {
   m_ctrlType = TYPE_MGT;
   m_ctrlSubtype = 5;
 }
+
 void
 WifiMacHeader::SetBeacon (void)
 {
   m_ctrlType = TYPE_MGT;
   m_ctrlSubtype = 8;
 }
+
 void
 WifiMacHeader::SetBlockAckReq (void)
 {
   m_ctrlType = TYPE_CTL;
   m_ctrlSubtype = 8;
 }
+
 void
 WifiMacHeader::SetBlockAck (void)
 {
@@ -147,18 +159,21 @@
   m_ctrlType = TYPE_DATA;
   m_ctrlSubtype = 0;
 }
+
 void
 WifiMacHeader::SetAction (void)
 {
   m_ctrlType = TYPE_MGT;
   m_ctrlSubtype = 0x0D;
 }
+
 void
 WifiMacHeader::SetMultihopAction (void)
 {
   m_ctrlType = TYPE_MGT;
   m_ctrlSubtype = 0x0F;
 }
+
 void
 WifiMacHeader::SetType (enum WifiMacType type)
 {
@@ -184,7 +199,7 @@
       m_ctrlType = TYPE_CTL;
       m_ctrlSubtype = SUBTYPE_CTL_ACK;
       break;
-    case WIFI_MAC_CTL_CTLWRAPPER: 
+    case WIFI_MAC_CTL_CTLWRAPPER:
       m_ctrlType = TYPE_CTL;
       m_ctrlSubtype = SUBTYPE_CTL_CTLWRAPPER;
       break;
@@ -305,15 +320,17 @@
   m_ctrlToDs = 0;
   m_ctrlFromDs = 0;
 }
+
 void
 WifiMacHeader::SetRawDuration (uint16_t duration)
 {
   m_duration = duration;
 }
+
 void
 WifiMacHeader::SetDuration (Time duration)
 {
-  int64_t duration_us = ceil((double)duration.GetNanoSeconds ()/1000);
+  int64_t duration_us = ceil ((double)duration.GetNanoSeconds () / 1000);
   NS_ASSERT (duration_us >= 0 && duration_us <= 0x7fff);
   m_duration = static_cast<uint16_t> (duration_us);
 }
@@ -322,50 +339,62 @@
 {
   m_duration = id;
 }
+
 void WifiMacHeader::SetSequenceNumber (uint16_t seq)
 {
   m_seqSeq = seq;
 }
+
 void WifiMacHeader::SetFragmentNumber (uint8_t frag)
 {
   m_seqFrag = frag;
 }
+
 void WifiMacHeader::SetNoMoreFragments (void)
 {
   m_ctrlMoreFrag = 0;
 }
+
 void WifiMacHeader::SetMoreFragments (void)
 {
   m_ctrlMoreFrag = 1;
 }
+
 void WifiMacHeader::SetOrder (void)
 {
   m_ctrlOrder = 1;
 }
+
 void WifiMacHeader::SetNoOrder (void)
 {
   m_ctrlOrder = 0;
 }
+
 void WifiMacHeader::SetRetry (void)
 {
   m_ctrlRetry = 1;
 }
+
 void WifiMacHeader::SetNoRetry (void)
 {
   m_ctrlRetry = 0;
 }
+
 void WifiMacHeader::SetQosTid (uint8_t tid)
 {
   m_qosTid = tid;
 }
+
 void WifiMacHeader::SetQosEosp ()
 {
   m_qosEosp = 1;
 }
+
 void WifiMacHeader::SetQosNoEosp ()
 {
   m_qosEosp = 0;
 }
+
 void WifiMacHeader::SetQosAckPolicy (enum QosAckPolicy policy)
 {
   switch (policy)
@@ -384,49 +413,73 @@
       break;
     }
 }
+
 void
 WifiMacHeader::SetQosNormalAck ()
 {
   m_qosAckPolicy = 0;
 }
+
 void
 WifiMacHeader::SetQosBlockAck ()
 {
   m_qosAckPolicy = 3;
 }
+
 void
 WifiMacHeader::SetQosNoAck ()
 {
   m_qosAckPolicy = 1;
 }
+
 void WifiMacHeader::SetQosAmsdu (void)
 {
   m_amsduPresent = 1;
 }
+
 void WifiMacHeader::SetQosNoAmsdu (void)
 {
   m_amsduPresent = 0;
 }
+
 void WifiMacHeader::SetQosTxopLimit (uint8_t txop)
 {
   m_qosStuff = txop;
 }
 
+void WifiMacHeader::SetQosMeshControlPresent (void)
+{
+  // mark bit 0 of this variable instead of bit 8, since m_qosStuff is
+  // shifted by one byte when serialized
+  m_qosStuff = m_qosStuff | 0x01; // bit 8 of QoS Control Field
+}
+
+void WifiMacHeader::SetQosNoMeshControlPresent ()
+{
+  // clear bit 0 of this variable instead of bit 8, since m_qosStuff is
+  // shifted by one byte when serialized
+  m_qosStuff = m_qosStuff & 0xfe; // bit 8 of QoS Control Field
+}
+
+
 Mac48Address
 WifiMacHeader::GetAddr1 (void) const
 {
   return m_addr1;
 }
+
 Mac48Address
 WifiMacHeader::GetAddr2 (void) const
 {
   return m_addr2;
 }
+
 Mac48Address
 WifiMacHeader::GetAddr3 (void) const
 {
   return m_addr3;
 }
+
 Mac48Address
 WifiMacHeader::GetAddr4 (void) const
 {
@@ -480,7 +533,6 @@
         case 15:
           return WIFI_MAC_MGT_MULTIHOP_ACTION;
           break;
-
         }
       break;
     case TYPE_CTL:
@@ -551,19 +603,20 @@
         case 15:
           return WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL;
           break;
-
         }
       break;
     }
   // NOTREACHED
   NS_ASSERT (false);
-  return (enum WifiMacType)-1;
+  return (enum WifiMacType) -1;
 }
+
 bool
 WifiMacHeader::IsFromDs (void) const
 {
   return m_ctrlFromDs == 1;
 }
+
 bool
 WifiMacHeader::IsToDs (void) const
 {
@@ -576,21 +629,25 @@
   return (m_ctrlType == TYPE_DATA);
 
 }
+
 bool
 WifiMacHeader::IsQosData (void) const
 {
   return (m_ctrlType == TYPE_DATA && (m_ctrlSubtype & 0x08));
 }
+
 bool
 WifiMacHeader::IsCtl (void) const
 {
   return (m_ctrlType == TYPE_CTL);
 }
+
 bool
 WifiMacHeader::IsMgt (void) const
 {
   return (m_ctrlType == TYPE_MGT);
 }
+
 bool
 WifiMacHeader::IsCfpoll (void) const
 {
@@ -611,164 +668,193 @@
       break;
     }
 }
+
 bool
 WifiMacHeader::IsRts (void) const
 {
   return (GetType () == WIFI_MAC_CTL_RTS);
 }
+
 bool
 WifiMacHeader::IsCts (void) const
 {
   return (GetType () == WIFI_MAC_CTL_CTS);
 }
+
 bool
 WifiMacHeader::IsAck (void) const
 {
   return (GetType () == WIFI_MAC_CTL_ACK);
 }
+
 bool
 WifiMacHeader::IsAssocReq (void) const
 {
   return (GetType () == WIFI_MAC_MGT_ASSOCIATION_REQUEST);
 }
+
 bool
 WifiMacHeader::IsAssocResp (void) const
 {
   return (GetType () == WIFI_MAC_MGT_ASSOCIATION_RESPONSE);
 }
+
 bool
 WifiMacHeader::IsReassocReq (void) const
 {
   return (GetType () == WIFI_MAC_MGT_REASSOCIATION_REQUEST);
 }
+
 bool
 WifiMacHeader::IsReassocResp (void) const
 {
   return (GetType () == WIFI_MAC_MGT_REASSOCIATION_RESPONSE);
 }
+
 bool
 WifiMacHeader::IsProbeReq (void) const
 {
   return (GetType () == WIFI_MAC_MGT_PROBE_REQUEST);
 }
+
 bool
 WifiMacHeader::IsProbeResp (void) const
 {
   return (GetType () == WIFI_MAC_MGT_PROBE_RESPONSE);
 }
+
 bool
 WifiMacHeader::IsBeacon (void) const
 {
   return (GetType () == WIFI_MAC_MGT_BEACON);
 }
+
 bool
 WifiMacHeader::IsDisassociation (void) const
 {
   return (GetType () == WIFI_MAC_MGT_DISASSOCIATION);
 }
+
 bool
 WifiMacHeader::IsAuthentication (void) const
 {
   return (GetType () == WIFI_MAC_MGT_AUTHENTICATION);
 }
+
 bool
 WifiMacHeader::IsDeauthentication (void) const
 {
   return (GetType () == WIFI_MAC_MGT_DEAUTHENTICATION);
 }
+
 bool
 WifiMacHeader::IsAction (void) const
 {
   return (GetType () == WIFI_MAC_MGT_ACTION);
 }
+
 bool
 WifiMacHeader::IsMultihopAction (void) const
 {
   return (GetType () == WIFI_MAC_MGT_MULTIHOP_ACTION);
 }
+
 bool
 WifiMacHeader::IsBlockAckReq (void) const
 {
   return (GetType () == WIFI_MAC_CTL_BACKREQ) ? true : false;
 }
+
 bool
 WifiMacHeader::IsBlockAck (void) const
 {
   return (GetType () == WIFI_MAC_CTL_BACKRESP) ? true : false;
 }
 
-
 uint16_t
 WifiMacHeader::GetRawDuration (void) const
 {
   return m_duration;
 }
+
 Time
 WifiMacHeader::GetDuration (void) const
 {
   return MicroSeconds (m_duration);
 }
+
 uint16_t
 WifiMacHeader::GetSequenceControl (void) const
 {
   return (m_seqSeq << 4) | m_seqFrag;
 }
+
 uint16_t
 WifiMacHeader::GetSequenceNumber (void) const
 {
   return m_seqSeq;
 }
+
 uint16_t
 WifiMacHeader::GetFragmentNumber (void) const
 {
   return m_seqFrag;
 }
+
 bool
 WifiMacHeader::IsRetry (void) const
 {
   return (m_ctrlRetry == 1);
 }
+
 bool
 WifiMacHeader::IsMoreFragments (void) const
 {
   return (m_ctrlMoreFrag == 1);
 }
+
 bool
 WifiMacHeader::IsQosBlockAck (void) const
 {
   NS_ASSERT (IsQosData ());
   return (m_qosAckPolicy == 3);
 }
+
 bool
 WifiMacHeader::IsQosNoAck (void) const
 {
   NS_ASSERT (IsQosData ());
   return (m_qosAckPolicy == 1);
 }
+
 bool
 WifiMacHeader::IsQosAck (void) const
 {
   NS_ASSERT (IsQosData ());
   return (m_qosAckPolicy == 0);
 }
+
 bool
 WifiMacHeader::IsQosEosp (void) const
 {
   NS_ASSERT (IsQosData ());
   return (m_qosEosp == 1);
 }
+
 bool
 WifiMacHeader::IsQosAmsdu (void) const
 {
   NS_ASSERT (IsQosData ());
   return (m_amsduPresent == 1);
 }
+
 uint8_t
 WifiMacHeader::GetQosTid (void) const
 {
   NS_ASSERT (IsQosData ());
   return m_qosTid;
 }
+
 enum WifiMacHeader::QosAckPolicy
 WifiMacHeader::GetQosAckPolicy (void) const
 {
@@ -789,7 +875,7 @@
     }
   // NOTREACHED
   NS_ASSERT (false);
-  return (enum QosAckPolicy)-1;
+  return (enum QosAckPolicy) -1;
 }
 
 uint8_t
@@ -880,7 +966,7 @@
           size = 2 + 2 + 6 + 6;
           break;
         case SUBTYPE_CTL_CTLWRAPPER:
-          size = 2 +2 +6 +2 +4;
+          size = 2 + 2 + 6 + 2 + 4;
           break;
         }
       break;
@@ -898,6 +984,7 @@
     }
   return size;
 }
+
 const char *
 WifiMacHeader::GetTypeString (void) const
 {
@@ -1019,12 +1106,12 @@
     case WIFI_MAC_MGT_ACTION_NO_ACK:
       PrintFrameControl (os);
       os << " Duration/ID=" << m_duration << "us"
-         << "DA=" << m_addr1 << ", SA=" << m_addr2 << ", BSSID=" << m_addr3
+         << ", DA=" << m_addr1 << ", SA=" << m_addr2 << ", BSSID=" << m_addr3
          << ", FragNumber=" << std::hex << (int) m_seqFrag << std::dec << ", SeqNumber=" << m_seqSeq;
       break;
     case WIFI_MAC_MGT_MULTIHOP_ACTION:
       os << " Duration/ID=" << m_duration << "us"
-         << "RA=" << m_addr1 << ", TA=" << m_addr2 << ", DA=" << m_addr3
+         << ", RA=" << m_addr1 << ", TA=" << m_addr2 << ", DA=" << m_addr3
          << ", FragNumber=" << std::hex << (int) m_seqFrag << std::dec << ", SeqNumber=" << m_seqSeq;
       break;
     case WIFI_MAC_DATA:
@@ -1032,19 +1119,19 @@
       os << " Duration/ID=" << m_duration << "us";
       if (!m_ctrlToDs && !m_ctrlFromDs)
         {
-          os << "DA=" << m_addr1 << ", SA=" << m_addr2 << ", BSSID=" << m_addr3;
+          os << ", DA=" << m_addr1 << ", SA=" << m_addr2 << ", BSSID=" << m_addr3;
         }
       else if (!m_ctrlToDs && m_ctrlFromDs)
         {
-          os << "DA=" << m_addr1 << ", SA=" << m_addr3 << ", BSSID=" << m_addr2;
+          os << ", DA=" << m_addr1 << ", SA=" << m_addr3 << ", BSSID=" << m_addr2;
         }
       else if (m_ctrlToDs && !m_ctrlFromDs)
         {
-          os << "DA=" << m_addr3 << ", SA=" << m_addr2 << ", BSSID=" << m_addr1;
+          os << ", DA=" << m_addr3 << ", SA=" << m_addr2 << ", BSSID=" << m_addr1;
         }
       else if (m_ctrlToDs && m_ctrlFromDs)
         {
-          os << "DA=" << m_addr3 << ", SA=" << m_addr4 << ", RA=" << m_addr1 << ", TA=" << m_addr2;
+          os << ", DA=" << m_addr3 << ", SA=" << m_addr4 << ", RA=" << m_addr1 << ", TA=" << m_addr2;
         }
       else
         {
@@ -1070,11 +1157,13 @@
       break;
     }
 }
+
 uint32_t
 WifiMacHeader::GetSerializedSize (void) const
 {
   return GetSize ();
 }
+
 void
 WifiMacHeader::Serialize (Buffer::Iterator i) const
 {
@@ -1127,6 +1216,7 @@
       break;
     }
 }
+
 uint32_t
 WifiMacHeader::Deserialize (Buffer::Iterator start)
 {
@@ -1174,4 +1264,4 @@
   return i.GetDistanceFrom (start);
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-mac-header.h ns-3.24/src/wifi/model/wifi-mac-header.h
--- ns-3.23/src/wifi/model/wifi-mac-header.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-mac-header.h	2015-09-15 11:18:44.000000000 -0700
@@ -294,6 +294,14 @@
    */
   void SetQosTxopLimit (uint8_t txop);
   /**
+   * Set the Mesh Control Present flag for the QoS header.
+   */
+  void SetQosMeshControlPresent ();
+  /**
+   * Clear the Mesh Control Present flag for the QoS header.
+   */
+  void SetQosNoMeshControlPresent ();
+  /**
    * Set order bit in the frame control field.
    */
   void SetOrder (void);
@@ -546,7 +554,7 @@
    * Check if the A-MSDU present bit is set in the QoS control field.
    *
    * \return true if the A-MSDU present bit is set,
-   *        false otherwise
+   *         false otherwise
    */
   bool IsQosAmsdu (void) const;
   /**
@@ -567,7 +575,6 @@
    * \return the TXOP limit
    */
   uint8_t GetQosTxopLimit (void) const;
-
   /**
    * Return the size of the WifiMacHeader in octets.
    * GetSerializedSize calls this function.
@@ -585,10 +592,10 @@
   /**
    * TracedCallback signature for WifiMacHeader
    *
-   * \param [in] header The header 
+   * \param [in] header The header
    */
   typedef void (* TracedCallback)(const WifiMacHeader &header);
-  
+
 
 private:
   /**
@@ -651,8 +658,6 @@
   uint16_t m_qosStuff;
 };
 
-} // namespace ns3
-
-
+} //namespace ns3
 
 #endif /* WIFI_MAC_HEADER_H */
diff -Naur ns-3.23/src/wifi/model/wifi-mac-queue.cc ns-3.24/src/wifi/model/wifi-mac-queue.cc
--- ns-3.23/src/wifi/model/wifi-mac-queue.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-mac-queue.cc	2015-09-15 11:18:44.000000000 -0700
@@ -16,14 +16,13 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
 
 #include "ns3/simulator.h"
 #include "ns3/packet.h"
 #include "ns3/uinteger.h"
-
 #include "wifi-mac-queue.h"
 #include "qos-blocked-destinations.h"
 
@@ -52,7 +51,7 @@
                    MakeUintegerAccessor (&WifiMacQueue::m_maxSize),
                    MakeUintegerChecker<uint32_t> ())
     .AddAttribute ("MaxDelay", "If a packet stays longer than this delay in the queue, it is dropped.",
-                   TimeValue (Seconds (10.0)),
+                   TimeValue (MilliSeconds (500.0)),
                    MakeTimeAccessor (&WifiMacQueue::m_maxDelay),
                    MakeTimeChecker ())
   ;
@@ -116,7 +115,7 @@
 
   Time now = Simulator::Now ();
   uint32_t n = 0;
-  for (PacketQueueI i = m_queue.begin (); i != m_queue.end ();)
+  for (PacketQueueI i = m_queue.begin (); i != m_queue.end (); )
     {
       if (i->tstamp + m_maxDelay > now)
         {
@@ -203,7 +202,7 @@
                   && it->hdr.GetQosTid () == tid)
                 {
                   *hdr = it->hdr;
-                  *timestamp=it->tstamp;
+                  *timestamp = it->tstamp;
                   return it->packet;
                 }
             }
@@ -342,4 +341,4 @@
   return 0;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-mac-queue.h ns-3.24/src/wifi/model/wifi-mac-queue.h
--- ns-3.23/src/wifi/model/wifi-mac-queue.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-mac-queue.h	2015-09-15 11:18:44.000000000 -0700
@@ -16,9 +16,10 @@
  * 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>
- * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #ifndef WIFI_MAC_QUEUE_H
 #define WIFI_MAC_QUEUE_H
 
@@ -97,6 +98,7 @@
    * Dequeue the packet in the front of the queue.
    *
    * \param hdr the WifiMacHeader of the packet
+   *
    * \return the packet
    */
   Ptr<const Packet> Dequeue (WifiMacHeader *hdr);
@@ -104,6 +106,7 @@
    * Peek the packet in the front of the queue. The packet is not removed.
    *
    * \param hdr the WifiMacHeader of the packet
+   *
    * \return the packet
    */
   Ptr<const Packet> Peek (WifiMacHeader *hdr);
@@ -118,6 +121,7 @@
    * \param tid the given TID
    * \param type the given address type
    * \param addr the given destination
+   *
    * \return packet
    */
   Ptr<const Packet> DequeueByTidAndAddress (WifiMacHeader *hdr,
@@ -136,6 +140,7 @@
    * \param type the given address type
    * \param addr the given destination
    * \param timestamp
+   *
    * \return packet
    */
   Ptr<const Packet> PeekByTidAndAddress (WifiMacHeader *hdr,
@@ -149,6 +154,7 @@
    * performed in linear time (O(n)).
    *
    * \param packet the packet to be removed
+   *
    * \return true if the packet was removed, false otherwise
    */
   bool Remove (Ptr<const Packet> packet);
@@ -159,6 +165,7 @@
    * \param tid the given TID
    * \param type the given address type
    * \param addr the given destination
+   *
    * \return the number of QoS packets
    */
   uint32_t GetNPacketsByTidAndAddress (uint8_t tid,
@@ -174,17 +181,19 @@
    * \param hdr the header of the dequeued packet
    * \param tStamp
    * \param blockedPackets
+   *
    * \return packet
    */
   Ptr<const Packet> DequeueFirstAvailable (WifiMacHeader *hdr,
                                            Time &tStamp,
                                            const QosBlockedDestinations *blockedPackets);
   /**
-   * Returns first available packet for transmission. The packet isn't removed from queue.  
+   * Returns first available packet for transmission. The packet isn't removed from queue.
    *
    * \param hdr the header of the dequeued packet
    * \param tStamp
    * \param blockedPackets
+   *
    * \return packet
    */
   Ptr<const Packet> PeekFirstAvailable (WifiMacHeader *hdr,
@@ -208,6 +217,7 @@
    */
   uint32_t GetSize (void);
 
+
 protected:
   /**
    * Clean up the queue by removing packets that exceeded the maximum delay.
@@ -231,8 +241,8 @@
           const WifiMacHeader &hdr,
           Time tstamp);
     Ptr<const Packet> packet; //!< Actual packet
-    WifiMacHeader hdr; //!< Wifi MAC header associated with the packet
-    Time tstamp; //!< timestamp when the packet arrived at the queue
+    WifiMacHeader hdr;        //!< Wifi MAC header associated with the packet
+    Time tstamp;              //!< timestamp when the packet arrived at the queue
   };
 
   /**
@@ -252,16 +262,17 @@
    *
    * \param type
    * \param it
+   *
    * \return the address
    */
   Mac48Address GetAddressForPacket (enum WifiMacHeader::AddressType type, PacketQueueI it);
 
   PacketQueue m_queue; //!< Packet (struct Item) queue
-  uint32_t m_size; //!< Current queue size
-  uint32_t m_maxSize; //!< Queue capacity
-  Time m_maxDelay; //!< Time to live for packets in the queue
+  uint32_t m_size;     //!< Current queue size
+  uint32_t m_maxSize;  //!< Queue capacity
+  Time m_maxDelay;     //!< Time to live for packets in the queue
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* WIFI_MAC_QUEUE_H */
diff -Naur ns-3.23/src/wifi/model/wifi-mac-trailer.cc ns-3.24/src/wifi/model/wifi-mac-trailer.cc
--- ns-3.23/src/wifi/model/wifi-mac-trailer.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-mac-trailer.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "wifi-mac-trailer.h"
 #include "ns3/assert.h"
 
@@ -42,6 +43,7 @@
   ;
   return tid;
 }
+
 TypeId
 WifiMacTrailer::GetInstanceTypeId (void) const
 {
@@ -52,21 +54,24 @@
 WifiMacTrailer::Print (std::ostream &os) const
 {
 }
+
 uint32_t
 WifiMacTrailer::GetSerializedSize (void) const
 {
   return WIFI_MAC_FCS_LENGTH;
 }
+
 void
 WifiMacTrailer::Serialize (Buffer::Iterator start) const
 {
   start.Prev (WIFI_MAC_FCS_LENGTH);
   start.WriteU32 (0);
 }
+
 uint32_t
 WifiMacTrailer::Deserialize (Buffer::Iterator start)
 {
   return WIFI_MAC_FCS_LENGTH;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-mac-trailer.h ns-3.24/src/wifi/model/wifi-mac-trailer.h
--- ns-3.23/src/wifi/model/wifi-mac-trailer.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-mac-trailer.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef WIFI_MAC_TRAILER_H
 #define WIFI_MAC_TRAILER_H
 
@@ -25,8 +26,6 @@
 
 namespace ns3 {
 
-
-
 /**
  * The length in octects of the IEEE 802.11 MAC FCS field
  */
@@ -51,6 +50,6 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* WIFI_MAC_TRAILER_H */
diff -Naur ns-3.23/src/wifi/model/wifi-mode.cc ns-3.24/src/wifi/model/wifi-mode.cc
--- ns-3.23/src/wifi/model/wifi-mode.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-mode.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,12 +15,15 @@
  * 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>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
+
 #include "wifi-mode.h"
 #include "ns3/simulator.h"
 #include "ns3/assert.h"
 #include "ns3/log.h"
+#include <cmath>
 
 namespace ns3 {
 
@@ -29,6 +32,7 @@
  *
  * \param a WifiMode
  * \param b WifiMode
+ *
  * \return true if the two WifiModes are identical,
  *         false otherwise
  */
@@ -41,6 +45,7 @@
  *
  * \param os std::ostream
  * \param mode
+ *
  * \return std::ostream
  */
 std::ostream & operator << (std::ostream & os, const WifiMode &mode)
@@ -53,6 +58,7 @@
  *
  * \param is std::istream
  * \param mode
+ *
  * \return std::istream
  */
 std::istream & operator >> (std::istream &is, WifiMode &mode)
@@ -63,68 +69,325 @@
   return is;
 }
 
-uint32_t
-WifiMode::GetBandwidth (void) const
-{
-  struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  return item->bandwidth;
-}
 uint64_t
-WifiMode::GetPhyRate (void) const
+WifiMode::GetPhyRate (uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const
 {
-  struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  return item->phyRate;
+  uint32_t dataRate, phyRate;
+  dataRate = GetDataRate (channelWidth, isShortGuardInterval, nss);
+  switch (GetCodeRate (nss))
+    {
+    case WIFI_CODE_RATE_5_6:
+      phyRate = dataRate * 6 / 5;
+      break;
+    case WIFI_CODE_RATE_3_4:
+      phyRate = dataRate * 4 / 3;
+      break;
+    case WIFI_CODE_RATE_2_3:
+      phyRate = dataRate * 3 / 2;
+      break;
+    case WIFI_CODE_RATE_1_2:
+      phyRate = dataRate * 2 / 1;
+      break;
+    case WIFI_CODE_RATE_UNDEFINED:
+    default:
+      phyRate = dataRate;
+      break;
+    }
+  return phyRate;
 }
+
 uint64_t
-WifiMode::GetDataRate (void) const
+WifiMode::GetDataRate (uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const
 {
   struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  return item->dataRate;
+  uint64_t dataRate = 0;
+  if (nss > 1)
+    {
+      NS_FATAL_ERROR ("MIMO is not supported");
+      return 0;
+    }
+  if (item->modClass == WIFI_MOD_CLASS_DSSS)
+    {
+      dataRate = (11000000 / 11) * log2 (GetConstellationSize (1));
+    }
+  else if (item->modClass == WIFI_MOD_CLASS_HR_DSSS)
+    {
+      dataRate = (11000000 / 8) * log2 (GetConstellationSize (1));
+    }
+  else if (item->modClass == WIFI_MOD_CLASS_OFDM || item->modClass == WIFI_MOD_CLASS_ERP_OFDM)
+    {
+      double symbolRate = (1 / 4.0) * 1e6;
+
+      uint32_t usableSubCarriers;
+      switch (channelWidth)
+        {
+        case 20:
+        default:
+          usableSubCarriers = 48;
+          break;
+        case 10:
+          usableSubCarriers = 24;
+          break;
+        case 5:
+          usableSubCarriers = 12;
+          break;
+        }
+
+      double codingRate;
+      switch (GetCodeRate (1))
+        {
+        case WIFI_CODE_RATE_3_4:
+          codingRate = (3.0 / 4.0);
+          break;
+        case WIFI_CODE_RATE_2_3:
+          codingRate = (2.0 / 3.0);
+          break;
+        case WIFI_CODE_RATE_1_2:
+          codingRate = (1.0 / 2.0);
+          break;
+        case WIFI_CODE_RATE_UNDEFINED:
+        default:
+          NS_FATAL_ERROR ("trying to get datarate for a mcs without any coding rate defined");
+          break;
+        }
+
+      uint32_t numberOfBitsPerSubcarrier = log2 (GetConstellationSize (1));
+
+      dataRate = lrint (ceil (symbolRate * usableSubCarriers * numberOfBitsPerSubcarrier * codingRate));
+    }
+  else if (item->modClass == WIFI_MOD_CLASS_HT || item->modClass == WIFI_MOD_CLASS_VHT)
+    {
+      if (item->mcsValue == 9)
+        {
+          //VHT MCS 9 forbidden at 20 MHz
+          NS_ASSERT (channelWidth != 20);
+        }
+
+      double symbolRate;
+      if (!isShortGuardInterval)
+        {
+          symbolRate = (1 / 4.0) * 1e6;
+        }
+      else
+        {
+          symbolRate = (1 / 3.6) * 1e6;
+        }
+
+      uint32_t usableSubCarriers;
+      switch (channelWidth)
+        {
+        case 20:
+        default:
+          usableSubCarriers = 52;
+          break;
+        case 40:
+          usableSubCarriers = 108;
+          break;
+        case 80:
+          usableSubCarriers = 234;
+          break;
+        case 160:
+          usableSubCarriers = 468;
+          break;
+        }
+
+      double codingRate;
+      switch (GetCodeRate (nss))
+        {
+        case WIFI_CODE_RATE_5_6:
+          codingRate = (5.0 / 6.0);
+          break;
+        case WIFI_CODE_RATE_3_4:
+          codingRate = (3.0 / 4.0);
+          break;
+        case WIFI_CODE_RATE_2_3:
+          codingRate = (2.0 / 3.0);
+          break;
+        case WIFI_CODE_RATE_1_2:
+          codingRate = (1.0 / 2.0);
+          break;
+        case WIFI_CODE_RATE_UNDEFINED:
+        default:
+          NS_FATAL_ERROR ("trying to get datarate for a mcs without any coding rate defined");
+          break;
+        }
+
+      uint32_t numberOfBitsPerSubcarrier = log2 (GetConstellationSize (nss));
+
+      dataRate = lrint (ceil (symbolRate * usableSubCarriers * numberOfBitsPerSubcarrier * codingRate));
+    }
+  else
+    {
+      NS_ASSERT ("undefined datarate for the modulation class!");
+    }
+  return dataRate;
 }
+
 enum WifiCodeRate
-WifiMode::GetCodeRate (void) const
+WifiMode::GetCodeRate (uint8_t nss) const
 {
   struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  return item->codingRate;
+  if (item->modClass == WIFI_MOD_CLASS_HT)
+    {
+      NS_ASSERT (nss <= 4);
+      NS_ASSERT ((item->mcsValue - (8 * (nss - 1))) >= 0 || (item->mcsValue - (8 * (nss - 1))) <= 7);
+      switch (item->mcsValue - (8 * (nss - 1)))
+        {
+        case 0:
+        case 1:
+        case 3:
+          return WIFI_CODE_RATE_1_2;
+        case 2:
+        case 4:
+        case 6:
+          return WIFI_CODE_RATE_3_4;
+        case 5:
+          return WIFI_CODE_RATE_2_3;
+        case 7:
+          return WIFI_CODE_RATE_5_6;
+        default:
+          return WIFI_CODE_RATE_UNDEFINED;
+        }
+    }
+  else if (item->modClass == WIFI_MOD_CLASS_VHT)
+    {
+      NS_ASSERT (nss <= 8);
+      switch (item->mcsValue)
+        {
+        case 0:
+        case 1:
+        case 3:
+          return WIFI_CODE_RATE_1_2;
+        case 2:
+        case 4:
+        case 6:
+        case 8:
+          return WIFI_CODE_RATE_3_4;
+        case 5:
+          return WIFI_CODE_RATE_2_3;
+        case 7:
+        case 9:
+          return WIFI_CODE_RATE_5_6;
+        default:
+          return WIFI_CODE_RATE_UNDEFINED;
+        }
+    }
+  else
+    {
+      return item->codingRate;
+    }
 }
-uint8_t
-WifiMode::GetConstellationSize (void) const
+
+uint16_t
+WifiMode::GetConstellationSize (uint8_t nss) const
 {
   struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  return item->constellationSize;
+  if (item->modClass == WIFI_MOD_CLASS_HT)
+    {
+      NS_ASSERT (nss <= 4);
+      NS_ASSERT ((item->mcsValue - (8 * (nss - 1))) >= 0 || (item->mcsValue - (8 * (nss - 1))) <= 7);
+      switch (item->mcsValue - (8 * (nss - 1)))
+        {
+        case 0:
+          return 2;
+        case 1:
+        case 2:
+          return 4;
+        case 3:
+        case 4:
+          return 16;
+        case 5:
+        case 6:
+        case 7:
+          return 64;
+        default:
+          return 0;
+        }
+    }
+  else if (item->modClass == WIFI_MOD_CLASS_VHT)
+    {
+      NS_ASSERT (nss <= 8);
+      switch (item->mcsValue)
+        {
+        case 0:
+          return 2;
+        case 1:
+        case 2:
+          return 4;
+        case 3:
+        case 4:
+          return 16;
+        case 5:
+        case 6:
+        case 7:
+          return 64;
+        case 8:
+        case 9:
+          return 256;
+        default:
+          return 0;
+        }
+    }
+  else
+    {
+      return item->constellationSize;
+    }
 }
+
 std::string
 WifiMode::GetUniqueName (void) const
 {
-  // needed for ostream printing of the invalid mode
+  //needed for ostream printing of the invalid mode
   struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
   return item->uniqueUid;
 }
+
 bool
 WifiMode::IsMandatory (void) const
 {
   struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
   return item->isMandatory;
 }
+
+uint8_t
+WifiMode::GetMcsValue (void) const
+{
+  struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
+  if (item->modClass == WIFI_MOD_CLASS_HT || item->modClass == WIFI_MOD_CLASS_VHT)
+    {
+      return item->mcsValue;
+    }
+  else
+    {
+      //We should not go here!
+      NS_ASSERT (false);
+      return 0;
+    }
+}
+
 uint32_t
 WifiMode::GetUid (void) const
 {
   return m_uid;
 }
+
 enum WifiModulationClass
 WifiMode::GetModulationClass () const
 {
   struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
   return item->modClass;
 }
+
 WifiMode::WifiMode ()
   : m_uid (0)
 {
 }
+
 WifiMode::WifiMode (uint32_t uid)
   : m_uid (uid)
 {
 }
+
 WifiMode::WifiMode (std::string name)
 {
   *this = WifiModeFactory::GetFactory ()->Search (name);
@@ -136,64 +399,64 @@
 {
 }
 
-
 WifiMode
 WifiModeFactory::CreateWifiMode (std::string uniqueName,
                                  enum WifiModulationClass modClass,
                                  bool isMandatory,
-                                 uint32_t bandwidth,
-                                 uint32_t dataRate,
                                  enum WifiCodeRate codingRate,
-                                 uint8_t constellationSize)
+                                 uint16_t constellationSize)
 {
   WifiModeFactory *factory = GetFactory ();
   uint32_t uid = factory->AllocateUid (uniqueName);
   WifiModeItem *item = factory->Get (uid);
   item->uniqueUid = uniqueName;
   item->modClass = modClass;
-  // The modulation class for this WifiMode must be valid.
+  //The modulation class for this WifiMode must be valid.
   NS_ASSERT (modClass != WIFI_MOD_CLASS_UNKNOWN);
-
-  item->bandwidth = bandwidth;
-  item->dataRate = dataRate;
-
   item->codingRate = codingRate;
 
-  switch (codingRate)
-    {
-    case WIFI_CODE_RATE_5_6:
-      item->phyRate = dataRate * 6 / 5;
-      break;
-    case WIFI_CODE_RATE_3_4:
-      item->phyRate = dataRate * 4 / 3;
-      break;
-    case WIFI_CODE_RATE_2_3:
-      item->phyRate = dataRate * 3 / 2;
-      break;
-    case WIFI_CODE_RATE_1_2:
-      item->phyRate = dataRate * 2 / 1;
-      break;
-    case WIFI_CODE_RATE_UNDEFINED:
-    default:
-      item->phyRate = dataRate;
-      break;
-    }
-
-  // Check for compatibility between modulation class and coding
-  // rate. If modulation class is DSSS then coding rate must be
-  // undefined, and vice versa. I could have done this with an
-  // assertion, but it seems better to always give the error (i.e.,
-  // not only in non-optimised builds) and the cycles that extra test
-  // here costs are only suffered at simulation setup.
-  if ((codingRate == WIFI_CODE_RATE_UNDEFINED) != (modClass == WIFI_MOD_CLASS_DSSS))
+  //Check for compatibility between modulation class and coding
+  //rate. If modulation class is DSSS then coding rate must be
+  //undefined, and vice versa. I could have done this with an
+  //assertion, but it seems better to always give the error (i.e.,
+  //not only in non-optimised builds) and the cycles that extra test
+  //here costs are only suffered at simulation setup.
+  if ((codingRate == WIFI_CODE_RATE_UNDEFINED) && modClass != WIFI_MOD_CLASS_DSSS && modClass != WIFI_MOD_CLASS_HR_DSSS)
     {
       NS_FATAL_ERROR ("Error in creation of WifiMode named " << uniqueName << std::endl
-                                                             << "Code rate must be WIFI_CODE_RATE_UNDEFINED iff Modulation Class is WIFI_MOD_CLASS_DSSS");
+                                                             << "Code rate must be WIFI_CODE_RATE_UNDEFINED iff Modulation Class is WIFI_MOD_CLASS_DSSS or WIFI_MOD_CLASS_HR_DSSS");
     }
 
   item->constellationSize = constellationSize;
   item->isMandatory = isMandatory;
 
+  NS_ASSERT (modClass != WIFI_MOD_CLASS_HT && modClass != WIFI_MOD_CLASS_VHT);
+  //fill unused mcs item with a dummy value
+  item->mcsValue = 0;
+
+  return WifiMode (uid);
+}
+
+WifiMode
+WifiModeFactory::CreateWifiMcs (std::string uniqueName,
+                                uint8_t mcsValue,
+                                enum WifiModulationClass modClass)
+{
+  WifiModeFactory *factory = GetFactory ();
+  uint32_t uid = factory->AllocateUid (uniqueName);
+  WifiModeItem *item = factory->Get (uid);
+  item->uniqueUid = uniqueName;
+  item->modClass = modClass;
+
+  //The modulation class must be either HT or VHT
+  NS_ASSERT (modClass == WIFI_MOD_CLASS_HT || modClass == WIFI_MOD_CLASS_VHT);
+
+  item->mcsValue = mcsValue;
+  //fill unused items with dummy values
+  item->constellationSize = 0;
+  item->codingRate = WIFI_CODE_RATE_UNDEFINED;
+  item->isMandatory = false;
+
   return WifiMode (uid);
 }
 
@@ -211,24 +474,24 @@
       j++;
     }
 
-  // If we get here then a matching WifiMode was not found above. This
-  // is a fatal problem, but we try to be helpful by displaying the
-  // list of WifiModes that are supported.
+  //If we get here then a matching WifiMode was not found above. This
+  //is a fatal problem, but we try to be helpful by displaying the
+  //list of WifiModes that are supported.
   NS_LOG_UNCOND ("Could not find match for WifiMode named \""
                  << name << "\". Valid options are:");
   for (i = m_itemList.begin (); i != m_itemList.end (); i++)
     {
       NS_LOG_UNCOND ("  " << i->uniqueUid);
     }
-  // Empty fatal error to die. We've already unconditionally logged
-  // the helpful information.
+  //Empty fatal error to die. We've already unconditionally logged
+  //the helpful information.
   NS_FATAL_ERROR ("");
 
-  // This next line is unreachable because of the fatal error
-  // immediately above, and that is fortunate, because we have no idea
-  // what is in WifiMode (0), but we do know it is not what our caller
-  // has requested by name. It's here only because it's the safest
-  // thing that'll give valid code.
+  //This next line is unreachable because of the fatal error
+  //immediately above, and that is fortunate, because we have no idea
+  //what is in WifiMode (0), but we do know it is not what our caller
+  //has requested by name. It's here only because it's the safest
+  //thing that'll give valid code.
   return WifiMode (0);
 }
 
@@ -267,16 +530,14 @@
       uint32_t uid = factory.AllocateUid ("Invalid-WifiMode");
       WifiModeItem *item = factory.Get (uid);
       item->uniqueUid = "Invalid-WifiMode";
-      item->bandwidth = 0;
-      item->dataRate = 0;
-      item->phyRate = 0;
       item->modClass = WIFI_MOD_CLASS_UNKNOWN;
       item->constellationSize = 0;
       item->codingRate = WIFI_CODE_RATE_UNDEFINED;
       item->isMandatory = false;
+      item->mcsValue = 0;
       isFirstTime = false;
     }
   return &factory;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-mode.h ns-3.24/src/wifi/model/wifi-mode.h
--- ns-3.23/src/wifi/model/wifi-mode.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-mode.h	2015-09-15 11:18:44.000000000 -0700
@@ -15,8 +15,10 @@
  * 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>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
+
 #ifndef WIFI_MODE_H
 #define WIFI_MODE_H
 
@@ -30,7 +32,7 @@
 namespace ns3 {
 
 /**
- * This enumeration defines the modulation classes per 
+ * This enumeration defines the modulation classes per
  * (Table 9-4 "Modulation classes"; IEEE 802.11-2012).
  */
 enum WifiModulationClass
@@ -42,8 +44,10 @@
   WIFI_MOD_CLASS_IR,
   /** Frequency-hopping spread spectrum (FHSS) PHY (Clause 14) */
   WIFI_MOD_CLASS_FHSS,
-  /** DSSS PHY (Clause 15) and HR/DSSS PHY (Clause 18) */
+  /** DSSS PHY (Clause 15) */
   WIFI_MOD_CLASS_DSSS,
+  /** HR/DSSS PHY (Clause 18) */
+  WIFI_MOD_CLASS_HR_DSSS,
   /** ERP-PBCC PHY (19.6) */
   WIFI_MOD_CLASS_ERP_PBCC,
   /** DSSS-OFDM PHY (19.7) */
@@ -53,10 +57,11 @@
   /** OFDM PHY (Clause 17) */
   WIFI_MOD_CLASS_OFDM,
   /** HT PHY (Clause 20) */
-  WIFI_MOD_CLASS_HT
+  WIFI_MOD_CLASS_HT,
+  /** VHT PHY (Clause 22) */
+  WIFI_MOD_CLASS_VHT
 };
 
-
 /**
  * This enumeration defines the various convolutional coding rates
  * used for the OFDM transmission modes in the IEEE 802.11
@@ -74,9 +79,8 @@
   WIFI_CODE_RATE_2_3,
   /** Rate 1/2 */
   WIFI_CODE_RATE_1_2,
- /** Rate 5/6 */
- WIFI_CODE_RATE_5_6
-
+  /** Rate 5/6 */
+  WIFI_CODE_RATE_5_6
 };
 
 /**
@@ -94,41 +98,54 @@
 {
 public:
   /**
-   * \returns the number of Hz used by this signal
-   */
-  uint32_t GetBandwidth (void) const;
-  /**
+   *
+   * \param channelWidth the considered channel width in MHz
+   * \param isShortGuardInterval whether short guard interval is considered or not
+   * \param nss the considered number of streams
+   *
    * \returns the physical bit rate of this signal.
    *
    * If a transmission mode uses 1/2 FEC, and if its
-   * data rate is 3Mbps, the phy rate is 6Mbps
+   * data rate is 3.25Mbps, the phy rate is 6.5Mbps
    */
-  uint64_t GetPhyRate (void) const;
+  uint64_t GetPhyRate (uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const;
   /**
+   *
+   * \param channelWidth the considered channel width in MHz
+   * \param isShortGuardInterval whether short guard interval is considered or not
+   * \param nss the considered number of streams
+   *
    * \returns the data bit rate of this signal.
    */
-  uint64_t GetDataRate (void) const;
+  uint64_t GetDataRate (uint32_t channelWidth, bool isShortGuardInterval, uint8_t nss) const;
   /**
+   *
+   * \param nss the considered number of streams
+   *
    * \returns the coding rate of this transmission mode
    */
-  enum WifiCodeRate GetCodeRate (void) const;
+  enum WifiCodeRate GetCodeRate (uint8_t nss) const;
   /**
+   *
+   * \param nss the considered number of streams
+   *
    * \returns the size of the modulation constellation.
    */
-  uint8_t GetConstellationSize (void) const;
-
+  uint16_t GetConstellationSize (uint8_t nss) const;
+  /**
+   * \returns the MCS value.
+   */
+  uint8_t GetMcsValue (void) const;
   /**
    * \returns a human-readable representation of this WifiMode
    * instance.
    */
   std::string GetUniqueName (void) const;
-
   /**
    * \returns true if this mode is a mandatory mode, false
    *          otherwise.
    */
   bool IsMandatory (void) const;
-
   /**
    * \returns the uid associated to this wireless mode.
    *
@@ -137,7 +154,6 @@
    * should have different uids.
    */
   uint32_t GetUid (void) const;
-
   /**
    *
    * \returns the Modulation Class (Section 9.7.8 "Modulation classes"; IEEE 802.11-2012)
@@ -159,6 +175,8 @@
    * \param name std::string of a valid WifiMode name
    */
   WifiMode (std::string name);
+
+
 private:
   friend class WifiModeFactory;
   /**
@@ -189,15 +207,6 @@
 typedef WifiModeList::const_iterator WifiModeListIterator;
 
 /**
- * A list of Wi-Fi Modulation and Coding Scheme (MCS).
- */
-typedef std::vector<uint8_t> WifiMcsList;
-/**
- * An iterator for WifiMcsList vector.
- */
-typedef WifiMcsList::const_iterator WifiMcsListIterator;
-
-/**
  * \brief create WifiMode class instances and keep track of them.
  *
  * This factory ensures that each WifiMode created has a unique name
@@ -211,26 +220,37 @@
    *        must be unique accross _all_ instances.
    * \param modClass the class of modulation
    * \param isMandatory true if this WifiMode is mandatory, false otherwise.
-   * \param bandwidth the bandwidth (Hz) of the signal generated when the
-   *        associated WifiMode is used.
-   * \param dataRate the rate (bits/second) at which the user data is transmitted
    * \param codingRate if convolutional coding is used for this rate
    *        then this parameter specifies the convolutional coding rate
    *        used. If there is no explicit convolutional coding step (e.g.,
    *        for DSSS rates) then the caller should set this parameter to
    *        WIFI_CODE_RATE_UNCODED.
    * \param constellationSize the order of the constellation used.
+   *
    * \return WifiMode
    *
-   * Create a WifiMode.
+   * Create a WifiMode (not used for HT or VHT).
    */
   static WifiMode CreateWifiMode (std::string uniqueName,
                                   enum WifiModulationClass modClass,
                                   bool isMandatory,
-                                  uint32_t bandwidth,
-                                  uint32_t dataRate,
                                   enum WifiCodeRate codingRate,
-                                  uint8_t constellationSize);
+                                  uint16_t constellationSize);
+
+  /**
+   * \param uniqueName the name of the associated WifiMode. This name
+   *        must be unique accross _all_ instances.
+   * \param mcsValue the mcs value
+   * \param modClass the class of modulation
+   *
+   * \return WifiMode
+   *
+   * Create a HT or VHT WifiMode.
+   */
+  static WifiMode CreateWifiMcs (std::string uniqueName,
+                                 uint8_t mcsValue,
+                                 enum WifiModulationClass modClass);
+
 
 private:
   friend class WifiMode;
@@ -252,19 +272,18 @@
   struct WifiModeItem
   {
     std::string uniqueUid;
-    uint32_t bandwidth;
-    uint32_t dataRate;
-    uint32_t phyRate;
     enum WifiModulationClass modClass;
-    uint8_t constellationSize;
+    uint16_t constellationSize;
     enum WifiCodeRate codingRate;
     bool isMandatory;
+    uint8_t mcsValue;
   };
 
   /**
    * Search and return WifiMode from a given name.
    *
    * \param name human-readable WifiMode
+   *
    * \return WifiMode
    */
   WifiMode Search (std::string name);
@@ -272,6 +291,7 @@
    * Allocate a WifiModeItem from a given uniqueUid.
    *
    * \param uniqueUid
+   *
    * \return uid
    */
   uint32_t AllocateUid (std::string uniqueUid);
@@ -279,6 +299,7 @@
    * Return a WifiModeItem at the given uid index.
    *
    * \param uid
+   *
    * \return WifiModeItem at the given uid
    */
   WifiModeItem* Get (uint32_t uid);
@@ -290,6 +311,6 @@
   WifiModeItemList m_itemList;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* WIFI_MODE_H */
diff -Naur ns-3.23/src/wifi/model/wifi-net-device.cc ns-3.24/src/wifi/model/wifi-net-device.cc
--- ns-3.23/src/wifi/model/wifi-net-device.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-net-device.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "wifi-net-device.h"
 #include "wifi-mac.h"
 #include "wifi-phy.h"
@@ -76,6 +77,7 @@
 {
   NS_LOG_FUNCTION_NOARGS ();
 }
+
 WifiNetDevice::~WifiNetDevice ()
 {
   NS_LOG_FUNCTION_NOARGS ();
@@ -92,7 +94,6 @@
   m_mac = 0;
   m_phy = 0;
   m_stationManager = 0;
-  // chain up.
   NetDevice::DoDispose ();
 }
 
@@ -132,28 +133,33 @@
   m_mac = mac;
   CompleteConfig ();
 }
+
 void
 WifiNetDevice::SetPhy (Ptr<WifiPhy> phy)
 {
   m_phy = phy;
   CompleteConfig ();
 }
+
 void
 WifiNetDevice::SetRemoteStationManager (Ptr<WifiRemoteStationManager> manager)
 {
   m_stationManager = manager;
   CompleteConfig ();
 }
+
 Ptr<WifiMac>
 WifiNetDevice::GetMac (void) const
 {
   return m_mac;
 }
+
 Ptr<WifiPhy>
 WifiNetDevice::GetPhy (void) const
 {
   return m_phy;
 }
+
 Ptr<WifiRemoteStationManager>
 WifiNetDevice::GetRemoteStationManager (void) const
 {
@@ -165,31 +171,37 @@
 {
   m_ifIndex = index;
 }
+
 uint32_t
 WifiNetDevice::GetIfIndex (void) const
 {
   return m_ifIndex;
 }
+
 Ptr<Channel>
 WifiNetDevice::GetChannel (void) const
 {
   return m_phy->GetChannel ();
 }
+
 Ptr<WifiChannel>
 WifiNetDevice::DoGetChannel (void) const
 {
   return m_phy->GetChannel ();
 }
+
 void
 WifiNetDevice::SetAddress (Address address)
 {
   m_mac->SetAddress (Mac48Address::ConvertFrom (address));
 }
+
 Address
 WifiNetDevice::GetAddress (void) const
 {
   return m_mac->GetAddress ();
 }
+
 bool
 WifiNetDevice::SetMtu (const uint16_t mtu)
 {
@@ -200,55 +212,66 @@
   m_mtu = mtu;
   return true;
 }
+
 uint16_t
 WifiNetDevice::GetMtu (void) const
 {
   return m_mtu;
 }
+
 bool
 WifiNetDevice::IsLinkUp (void) const
 {
   return m_phy != 0 && m_linkUp;
 }
+
 void
 WifiNetDevice::AddLinkChangeCallback (Callback<void> callback)
 {
   m_linkChanges.ConnectWithoutContext (callback);
 }
+
 bool
 WifiNetDevice::IsBroadcast (void) const
 {
   return true;
 }
+
 Address
 WifiNetDevice::GetBroadcast (void) const
 {
   return Mac48Address::GetBroadcast ();
 }
+
 bool
 WifiNetDevice::IsMulticast (void) const
 {
   return true;
 }
+
 Address
 WifiNetDevice::GetMulticast (Ipv4Address multicastGroup) const
 {
   return Mac48Address::GetMulticast (multicastGroup);
 }
+
 Address WifiNetDevice::GetMulticast (Ipv6Address addr) const
 {
   return Mac48Address::GetMulticast (addr);
 }
+
 bool
 WifiNetDevice::IsPointToPoint (void) const
 {
   return false;
 }
+
 bool
 WifiNetDevice::IsBridge (void) const
 {
   return false;
 }
+
 bool
 WifiNetDevice::Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber)
 {
@@ -264,22 +287,26 @@
   m_mac->Enqueue (packet, realTo);
   return true;
 }
+
 Ptr<Node>
 WifiNetDevice::GetNode (void) const
 {
   return m_node;
 }
+
 void
 WifiNetDevice::SetNode (Ptr<Node> node)
 {
   m_node = node;
   CompleteConfig ();
 }
+
 bool
 WifiNetDevice::NeedsArp (void) const
 {
   return true;
 }
+
 void
 WifiNetDevice::SetReceiveCallback (NetDevice::ReceiveCallback cb)
 {
@@ -328,6 +355,7 @@
   m_linkUp = true;
   m_linkChanges ();
 }
+
 void
 WifiNetDevice::LinkDown (void)
 {
@@ -358,7 +386,7 @@
 WifiNetDevice::SetPromiscReceiveCallback (PromiscReceiveCallback cb)
 {
   m_promiscRx = cb;
-  m_mac->SetPromisc();
+  m_mac->SetPromisc ();
 }
 
 bool
@@ -367,5 +395,4 @@
   return m_mac->SupportsSendFrom ();
 }
 
-} // namespace ns3
-
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-net-device.h ns-3.24/src/wifi/model/wifi-net-device.h
--- ns-3.23/src/wifi/model/wifi-net-device.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -82,7 +82,7 @@
   Ptr<WifiRemoteStationManager> GetRemoteStationManager (void) const;
 
 
-  // inherited from NetDevice base class.
+  //inherited from NetDevice base class.
   virtual void SetIfIndex (const uint32_t index);
   virtual uint32_t GetIfIndex (void) const;
   virtual Ptr<Channel> GetChannel (void) const;
@@ -109,9 +109,11 @@
   virtual bool SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber);
   virtual void SetPromiscReceiveCallback (PromiscReceiveCallback cb);
   virtual bool SupportsSendFrom (void) const;
+
+
 protected:
-   virtual void DoDispose (void);
-   virtual void DoInitialize (void);
+  virtual void DoDispose (void);
+  virtual void DoInitialize (void);
   /**
    * Receive a packet from the lower layer and pass the
    * packet up the stack.
@@ -120,9 +122,11 @@
    * \param from
    * \param to
    */
-   void ForwardUp (Ptr<Packet> packet, Mac48Address from, Mac48Address to);
+  void ForwardUp (Ptr<Packet> packet, Mac48Address from, Mac48Address to);
+
+
 private:
-  // This value conforms to the 802.11 specification
+  //This value conforms to the 802.11 specification
   static const uint16_t MAX_MSDU_SIZE = 2304;
 
   /**
@@ -163,6 +167,6 @@
   bool m_configComplete;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* WIFI_NET_DEVICE_H */
diff -Naur ns-3.23/src/wifi/model/wifi-phy.cc ns-3.24/src/wifi/model/wifi-phy.cc
--- ns-3.23/src/wifi/model/wifi-phy.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-phy.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,7 +15,8 @@
  * 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>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
 #include "wifi-phy.h"
@@ -95,12 +96,12 @@
                      "Trace source simulating a wifi device in monitor mode "
                      "sniffing all received frames",
                      MakeTraceSourceAccessor (&WifiPhy::m_phyMonitorSniffRxTrace),
-                     "ns3::WifiPhy::MonitorSnifferRxCallback")
+                     "ns3::WifiPhy::MonitorSnifferRxTracedCallback")
     .AddTraceSource ("MonitorSnifferTx",
                      "Trace source simulating the capability of a wifi device "
                      "in monitor mode to sniff all frames being transmitted",
                      MakeTraceSourceAccessor (&WifiPhy::m_phyMonitorSniffTxTrace),
-                     "ns3::WifiPhy::MonitorSnifferTxCallback")
+                     "ns3::WifiPhy::MonitorSnifferTxTracedCallback")
   ;
   return tid;
 }
@@ -117,319 +118,331 @@
   NS_LOG_FUNCTION (this);
 }
 
-//return the L-SIG
 WifiMode
-WifiPhy::GetMFPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble)
+WifiPhy::GetHtPlcpHeaderMode (WifiMode payloadMode)
 {
-    switch (payloadMode.GetBandwidth ())
-       {
-       case 20000000:
-          return WifiPhy::GetOfdmRate6_5MbpsBW20MHz ();
-        case 40000000:
-           return WifiPhy::GetOfdmRate13_5MbpsBW40MHz ();
-        default:
-            return WifiPhy::GetOfdmRate6_5MbpsBW20MHz ();
-      }
+  return WifiPhy::GetHtMcs0 ();
+}
+
+WifiMode
+WifiPhy::GetVhtPlcpHeaderMode (WifiMode payloadMode)
+{
+  return WifiPhy::GetVhtMcs0 ();
 }
 
 Time
-WifiPhy::GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector txvector)
+WifiPhy::GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector txVector)
 {
   uint8_t Ndltf, Neltf;
-
-  //We suppose here that STBC = 0. 
+  //We suppose here that STBC = 0.
   //If STBC > 0, we need a different mapping between Nss and Nltf (IEEE 802.11n-2012 standard, page 1682).
-  if (txvector.GetNss () < 3)
+  if (txVector.GetNss () < 3)
     {
-      Ndltf = txvector.GetNss();
+      Ndltf = txVector.GetNss ();
     }
-  else 
+  else if (txVector.GetNss () < 5)
     {
       Ndltf = 4;
     }
-  if (txvector.GetNess () < 3)
+  else if (txVector.GetNss () < 7)
+    {
+      Ndltf = 6;
+    }
+  else
+    {
+      Ndltf = 8;
+    }
+
+  if (txVector.GetNess () < 3)
     {
-      Neltf = txvector.GetNess();
+      Neltf = txVector.GetNess ();
     }
-  else 
+  else
     {
       Neltf = 4;
     }
 
   switch (preamble)
     {
-     case WIFI_PREAMBLE_HT_MF:
-         return MicroSeconds(4 + (4 * Ndltf) + (4 * Neltf));
-     case WIFI_PREAMBLE_HT_GF:
-	     return MicroSeconds((4 * Ndltf) + (4 * Neltf));
-     default:
-       // no training for non HT
-         return MicroSeconds(0);
+    case WIFI_PREAMBLE_HT_MF:
+      return MicroSeconds (4 + (4 * Ndltf) + (4 * Neltf));
+    case WIFI_PREAMBLE_HT_GF:
+      return MicroSeconds ((4 * Ndltf) + (4 * Neltf));
+    case WIFI_PREAMBLE_VHT:
+      return MicroSeconds (4 + (4 * Ndltf));
+    default:
+      //no training for non HT
+      return MicroSeconds (0);
     }
 }
 
-//return L-SIG
 Time
 WifiPhy::GetPlcpHtSigHeaderDuration (WifiPreamble preamble)
 {
-         switch (preamble)
-            {
-             case WIFI_PREAMBLE_HT_MF:
-               // HT-SIG
-               return MicroSeconds(8);
-             case WIFI_PREAMBLE_HT_GF:
-               //HT-SIG
-               return MicroSeconds(8);
-             default:
-               // no HT-SIG for non HT
-               return MicroSeconds(0);
-            }
+  switch (preamble)
+    {
+    case WIFI_PREAMBLE_HT_MF:
+    case WIFI_PREAMBLE_HT_GF:
+      //HT-SIG
+      return MicroSeconds (8);
+    default:
+      //no HT-SIG for non HT
+      return MicroSeconds (0);
+    }
+}
+
+Time
+WifiPhy::GetPlcpVhtSigA1Duration (WifiPreamble preamble)
+{
+  switch (preamble)
+    {
+    case WIFI_PREAMBLE_VHT:
+      //VHT-SIG-A1
+      return MicroSeconds (4);
+    default:
+      // no VHT-SIG-A1 for non VHT
+      return MicroSeconds (0);
+    }
+}
+
+Time
+WifiPhy::GetPlcpVhtSigA2Duration (WifiPreamble preamble)
+{
+  switch (preamble)
+    {
+    case WIFI_PREAMBLE_VHT:
+      //VHT-SIG-A2
+      return MicroSeconds (4);
+    default:
+      // no VHT-SIG-A2 for non VHT
+      return MicroSeconds (0);
+    }
+}
+
+Time
+WifiPhy::GetPlcpVhtSigBDuration (WifiPreamble preamble)
+{
+  switch (preamble)
+    {
+    case WIFI_PREAMBLE_VHT:
+      //VHT-SIG-B
+      return MicroSeconds (4);
+    default:
+      // no VHT-SIG-B for non VHT
+      return MicroSeconds (0);
+    }
 }
 
 WifiMode
-WifiPhy::GetPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble)
+WifiPhy::GetPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble, WifiTxVector txVector)
 {
   switch (payloadMode.GetModulationClass ())
     {
     case WIFI_MOD_CLASS_OFDM:
-      {
-        switch (payloadMode.GetBandwidth ())
-          {
-          case 5000000:
-            return WifiPhy::GetOfdmRate1_5MbpsBW5MHz ();
-          case 10000000:
-            return WifiPhy::GetOfdmRate3MbpsBW10MHz ();
-          default:
-            // (Section 18.3.2 "PLCP frame format"; IEEE Std 802.11-2012)
-            // actually this is only the first part of the PlcpHeader,
-            // because the last 16 bits of the PlcpHeader are using the
-            // same mode of the payload
-            return WifiPhy::GetOfdmRate6Mbps ();
-          }
-      }
-    //Added by Ghada to support 11n
     case WIFI_MOD_CLASS_HT:
-      {  //return the HT-SIG
-         // IEEE Std 802.11n, 20.3.23
-         switch (preamble)
-           {
-            case WIFI_PREAMBLE_HT_MF:
-                switch (payloadMode.GetBandwidth ())
-                  {
-                   case 20000000:
-                      return WifiPhy::GetOfdmRate13MbpsBW20MHz ();
-                   case 40000000:
-                      return WifiPhy::GetOfdmRate27MbpsBW40MHz ();
-                   default:
-                      return WifiPhy::GetOfdmRate13MbpsBW20MHz ();
-                  }
-            case WIFI_PREAMBLE_HT_GF:
-                  switch (payloadMode.GetBandwidth ())
-                  {
-                   case 20000000:
-                      return WifiPhy::GetOfdmRate13MbpsBW20MHz ();
-                   case 40000000:
-                      return WifiPhy::GetOfdmRate27MbpsBW40MHz ();
-                   default:
-                      return WifiPhy::GetOfdmRate13MbpsBW20MHz ();
-                  }
-             default:
-                return WifiPhy::GetOfdmRate6Mbps ();
-          }
-      }
+    case WIFI_MOD_CLASS_VHT:
+      switch (txVector.GetChannelWidth ())
+        {
+        case 5000000:
+          return WifiPhy::GetOfdmRate1_5MbpsBW5MHz ();
+        case 10000000:
+          return WifiPhy::GetOfdmRate3MbpsBW10MHz ();
+        case 20000000:
+        case 40000000:
+        case 80000000:
+        case 160000000:
+        default:
+          //(Section 18.3.2 "PLCP frame format"; IEEE Std 802.11-2012)
+          //actually this is only the first part of the PlcpHeader,
+          //because the last 16 bits of the PlcpHeader are using the
+          //same mode of the payload
+          return WifiPhy::GetOfdmRate6Mbps ();
+        }
     case WIFI_MOD_CLASS_ERP_OFDM:
       return WifiPhy::GetErpOfdmRate6Mbps ();
-
     case WIFI_MOD_CLASS_DSSS:
+    case WIFI_MOD_CLASS_HR_DSSS:
       if (preamble == WIFI_PREAMBLE_LONG)
         {
-          // (Section 16.2.3 "PLCP field definitions" and Section 17.2.2.2 "Long PPDU format"; IEEE Std 802.11-2012)
+          //(Section 16.2.3 "PLCP field definitions" and Section 17.2.2.2 "Long PPDU format"; IEEE Std 802.11-2012)
           return WifiPhy::GetDsssRate1Mbps ();
         }
-      else  //  WIFI_PREAMBLE_SHORT
+      else //WIFI_PREAMBLE_SHORT
         {
-          // (Section 17.2.2.3 "Short PPDU format"; IEEE Std 802.11-2012)
+          //(Section 17.2.2.3 "Short PPDU format"; IEEE Std 802.11-2012)
           return WifiPhy::GetDsssRate2Mbps ();
         }
-
     default:
       NS_FATAL_ERROR ("unsupported modulation class");
       return WifiMode ();
     }
 }
 
-
 Time
-WifiPhy::GetPlcpHeaderDuration (WifiMode payloadMode, WifiPreamble preamble)
+WifiPhy::GetPlcpHeaderDuration (WifiTxVector txVector, WifiPreamble preamble)
 {
   if (preamble == WIFI_PREAMBLE_NONE)
-  {
-      return MicroSeconds(0);
-  }
-  switch (payloadMode.GetModulationClass ())
+    {
+      return MicroSeconds (0);
+    }
+  switch (txVector.GetMode ().GetModulationClass ())
     {
     case WIFI_MOD_CLASS_OFDM:
       {
-        switch (payloadMode.GetBandwidth ())
+        switch (txVector.GetChannelWidth ())
           {
           case 20000000:
           default:
-            // (Section 18.3.3 "PLCP preamble (SYNC))" and Figure 18-4 "OFDM training structure"; IEEE Std 802.11-2012)
-            // also (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
-            // We return the duration of the SIGNAL field only, since the
-            // SERVICE field (which strictly speaking belongs to the PLCP
-            // header, see Section 18.3.2 and Figure 18-1) is sent using the
-            // payload mode.
-            return MicroSeconds(4);
+            //(Section 18.3.3 "PLCP preamble (SYNC))" and Figure 18-4 "OFDM training structure"; IEEE Std 802.11-2012)
+            //also (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
+            //We return the duration of the SIGNAL field only, since the
+            //SERVICE field (which strictly speaking belongs to the PLCP
+            //header, see Section 18.3.2 and Figure 18-1) is sent using the
+            //payload mode.
+            return MicroSeconds (4);
           case 10000000:
-            // (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
-            return MicroSeconds(8);
+            //(Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
+            return MicroSeconds (8);
           case 5000000:
-            // (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
-            return MicroSeconds(16);
+            //(Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012)
+            return MicroSeconds (16);
           }
       }
-     //Added by Ghada to support 11n
     case WIFI_MOD_CLASS_HT:
-      { //IEEE 802.11n Figure 20.1
-         switch (preamble)
-            {
-             case WIFI_PREAMBLE_HT_MF:
-               // L-SIG
-               return MicroSeconds(4);
-             case WIFI_PREAMBLE_HT_GF:
-               //L-SIG
-               return MicroSeconds(0);
-             default:
-               // L-SIG
-               return MicroSeconds(4);
-            }
+      {
+        //L-SIG
+        //IEEE 802.11n Figure 20.1
+        switch (preamble)
+          {
+          case WIFI_PREAMBLE_HT_MF:
+          default:
+            return MicroSeconds (4);
+          case WIFI_PREAMBLE_HT_GF:
+            return MicroSeconds (0);
+          }
       }
+    case WIFI_MOD_CLASS_VHT:
     case WIFI_MOD_CLASS_ERP_OFDM:
-      return MicroSeconds(4);
-
+      return MicroSeconds (4);
     case WIFI_MOD_CLASS_DSSS:
+    case WIFI_MOD_CLASS_HR_DSSS:
       if (preamble == WIFI_PREAMBLE_SHORT)
         {
-          // (Section 17.2.2.3 "Short PPDU format" and Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012)
-          return MicroSeconds(24);
+          //(Section 17.2.2.3 "Short PPDU format" and Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012)
+          return MicroSeconds (24);
         }
-      else // WIFI_PREAMBLE_LONG
+      else //WIFI_PREAMBLE_LONG
         {
-          // (Section 17.2.2.2 "Long PPDU format" and Figure 17-1 "Short PPDU format"; IEEE Std 802.11-2012)
-          return MicroSeconds(48);
+          //(Section 17.2.2.2 "Long PPDU format" and Figure 17-1 "Short PPDU format"; IEEE Std 802.11-2012)
+          return MicroSeconds (48);
         }
-
     default:
       NS_FATAL_ERROR ("unsupported modulation class");
-      return MicroSeconds(0);
+      return MicroSeconds (0);
     }
 }
 
 Time
-WifiPhy::GetPlcpPreambleDuration (WifiMode payloadMode, WifiPreamble preamble)
+WifiPhy::GetPlcpPreambleDuration (WifiTxVector txVector, WifiPreamble preamble)
 {
   if (preamble == WIFI_PREAMBLE_NONE)
-  {
-      return MicroSeconds(0);
-  }
-  switch (payloadMode.GetModulationClass ())
+    {
+      return MicroSeconds (0);
+    }
+  switch (txVector.GetMode ().GetModulationClass ())
     {
     case WIFI_MOD_CLASS_OFDM:
       {
-        switch (payloadMode.GetBandwidth ())
+        switch (txVector.GetChannelWidth ())
           {
           case 20000000:
           default:
-            // (Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
-            // also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
-            return MicroSeconds(16);
+            //(Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
+            //also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
+            return MicroSeconds (16);
           case 10000000:
-            // (Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
-            // also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
-            return MicroSeconds(32);
+            //(Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
+            //also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
+            return MicroSeconds (32);
           case 5000000:
-            // (Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
-            // also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
-            return MicroSeconds(64);
+            //(Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure"
+            //also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
+            return MicroSeconds (64);
           }
       }
+    case WIFI_MOD_CLASS_VHT:
     case WIFI_MOD_CLASS_HT:
-      {
-        //IEEE 802.11n Figure 20.1 the training symbols before L_SIG or HT_SIG
-        return MicroSeconds(16);
-      }
+      //IEEE 802.11n Figure 20.1 the training symbols before L_SIG or HT_SIG
+      return MicroSeconds (16);
     case WIFI_MOD_CLASS_ERP_OFDM:
-      return MicroSeconds(16);
-
+      return MicroSeconds (16);
     case WIFI_MOD_CLASS_DSSS:
+    case WIFI_MOD_CLASS_HR_DSSS:
       if (preamble == WIFI_PREAMBLE_SHORT)
         {
-          // (Section 17.2.2.3 "Short PPDU format)" Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012)
-          return MicroSeconds(72);
+          //(Section 17.2.2.3 "Short PPDU format)" Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012)
+          return MicroSeconds (72);
         }
-      else // WIFI_PREAMBLE_LONG
+      else //WIFI_PREAMBLE_LONG
         {
-          // (Section 17.2.2.2 "Long PPDU format)" Figure 17-1 "Long PPDU format"; IEEE Std 802.11-2012)
-          return MicroSeconds(144);
+          //(Section 17.2.2.2 "Long PPDU format)" Figure 17-1 "Long PPDU format"; IEEE Std 802.11-2012)
+          return MicroSeconds (144);
         }
     default:
       NS_FATAL_ERROR ("unsupported modulation class");
-      return MicroSeconds(0);
+      return MicroSeconds (0);
     }
 }
 
 Time
-WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag)
+WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txVector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag)
 {
-  WifiMode payloadMode=txvector.GetMode();
-
+  WifiMode payloadMode = txVector.GetMode ();
   NS_LOG_FUNCTION (size << payloadMode);
- 
+
   switch (payloadMode.GetModulationClass ())
     {
     case WIFI_MOD_CLASS_OFDM:
     case WIFI_MOD_CLASS_ERP_OFDM:
       {
-        // (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012
-        // corresponds to T_{SYM} in the table)
+        //(Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012
+        //corresponds to T_{SYM} in the table)
         Time symbolDuration;
 
-        switch (payloadMode.GetBandwidth ())
+        switch (txVector.GetChannelWidth ())
           {
           case 20000000:
           default:
-            symbolDuration = MicroSeconds(4);
+            symbolDuration = MicroSeconds (4);
             break;
           case 10000000:
-            symbolDuration = MicroSeconds(8);
+            symbolDuration = MicroSeconds (8);
             break;
           case 5000000:
-            symbolDuration = MicroSeconds(16);
+            symbolDuration = MicroSeconds (16);
             break;
           }
 
-        // (Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
-        // corresponds to N_{DBPS} in the table
-        double numDataBitsPerSymbol = payloadMode.GetDataRate () * symbolDuration.GetNanoSeconds() / 1e9;
-
-        // (Section 18.3.5.4 "Pad bits (PAD)" Equation 18-11; IEEE Std 802.11-2012)
+        //(Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012)
+        //corresponds to N_{DBPS} in the table
+        double numDataBitsPerSymbol = payloadMode.GetDataRate (txVector.GetChannelWidth (), 0, 1) * symbolDuration.GetNanoSeconds () / 1e9;
+        //(Section 18.3.5.4 "Pad bits (PAD)" Equation 18-11; IEEE Std 802.11-2012)
         uint32_t numSymbols;
 
         if (packetType == 1 && preamble != WIFI_PREAMBLE_NONE)
           {
             //First packet in an A-MPDU
-            numSymbols= ceil((16 + size * 8.0 + 6) / (numDataBitsPerSymbol));
+            numSymbols = ceil ((16 + size * 8.0 + 6) / numDataBitsPerSymbol);
             if (incFlag == 1)
               {
                 m_totalAmpduSize += size;
                 m_totalAmpduNumSymbols += numSymbols;
-              } 
+              }
           }
         else if (packetType == 1 && preamble == WIFI_PREAMBLE_NONE)
           {
             //consecutive packets in an A-MPDU
-            numSymbols= ((size * 8.0) / (numDataBitsPerSymbol));
+            numSymbols = ((size * 8.0) / numDataBitsPerSymbol);
             if (incFlag == 1)
               {
                 m_totalAmpduSize += size;
@@ -438,28 +451,30 @@
           }
         else if (packetType == 2 && preamble == WIFI_PREAMBLE_NONE)
           {
-           //last packet in an A-MPDU
-           uint32_t totalAmpduSize = m_totalAmpduSize + size;
-           numSymbols = lrint (ceil((16 + totalAmpduSize * 8.0 + 6) / (numDataBitsPerSymbol)));
-           numSymbols -= m_totalAmpduNumSymbols;
-           if (incFlag == 1)
-             {
-               m_totalAmpduSize = 0;
-               m_totalAmpduNumSymbols = 0;
-             }
+            //last packet in an A-MPDU
+            uint32_t totalAmpduSize = m_totalAmpduSize + size;
+            numSymbols = lrint (ceil ((16 + totalAmpduSize * 8.0 + 6) / numDataBitsPerSymbol));
+            numSymbols -= m_totalAmpduNumSymbols;
+            if (incFlag == 1)
+              {
+                m_totalAmpduSize = 0;
+                m_totalAmpduNumSymbols = 0;
+              }
           }
         else if (packetType == 0 && preamble != WIFI_PREAMBLE_NONE)
           {
             //Not an A-MPDU
-            numSymbols = lrint (ceil ((16 + size * 8.0 + 6.0) / (numDataBitsPerSymbol)));
+            numSymbols = lrint (ceil ((16 + size * 8.0 + 6.0) / numDataBitsPerSymbol));
           }
         else
-            NS_FATAL_ERROR ("Wrong combination of preamble and packet type"); 
+          {
+            NS_FATAL_ERROR ("Wrong combination of preamble and packet type");
+          }
 
-        // Add signal extension for ERP PHY
+        //Add signal extension for ERP PHY
         if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
           {
-            return Time (numSymbols * symbolDuration) + MicroSeconds(6);
+            return Time (numSymbols * symbolDuration) + MicroSeconds (6);
           }
         else
           {
@@ -467,62 +482,61 @@
           }
       }
     case WIFI_MOD_CLASS_HT:
+    case WIFI_MOD_CLASS_VHT:
       {
-         Time symbolDuration;
-         double m_Stbc;
+        Time symbolDuration;
+        double m_Stbc;
         //if short GI data rate is used then symbol duration is 3.6us else symbol duration is 4us
         //In the future has to create a stationmanager that only uses these data rates if sender and reciever support GI
-         if (payloadMode.GetUniqueName() == "OfdmRate135MbpsBW40MHzShGi" || payloadMode.GetUniqueName() == "OfdmRate65MbpsBW20MHzShGi" )
-           {
-             symbolDuration = NanoSeconds(3600);
-           }
-         else
-           {
-             switch (payloadMode.GetDataRate ()/ (txvector.GetNss()))
-               { //shortGi
-                  case 7200000:
-                  case 14400000:
-                  case 21700000:
-                  case 28900000:
-                  case 43300000:
-                  case 57800000:
-                  case 72200000:
-                  case 15000000:
-                  case 30000000:
-                  case 45000000:
-                  case 60000000:
-                  case 90000000:
-                  case 120000000:
-                  case 150000000:
-                    symbolDuration = NanoSeconds(3600);
-                    break;               
-                 default:
-                    symbolDuration = MicroSeconds(4);
-              }
-           }
-         if  (txvector.IsStbc())
-            m_Stbc=2;
-         else
-           m_Stbc=1;
-         double numDataBitsPerSymbol = payloadMode.GetDataRate () * txvector.GetNss() * symbolDuration.GetNanoSeconds() / 1e9;
-         //check tables 20-35 and 20-36 in the standard to get cases when nes =2
-         double Nes=1;
-        // IEEE Std 802.11n, section 20.3.11, equation (20-32)
+        if (txVector.IsShortGuardInterval ())
+          {
+            symbolDuration = NanoSeconds (3600);
+          }
+        else
+          {
+            symbolDuration = MicroSeconds (4);
+          }
+
+        if (txVector.IsStbc ())
+          {
+            m_Stbc = 2;
+          }
+        else
+          {
+            m_Stbc = 1;
+          }
+
+        //check tables 20-35 and 20-36 in the .11n standard to get cases when nes = 2
+        //check tables 22-30 to 22-61 in the .11ac standard to get cases when nes > 1
+        double Nes;
+        if (txVector.GetChannelWidth () == 160
+            && (payloadMode.GetUniqueName () == "VhtMcs7" || payloadMode.GetUniqueName () == "VhtMcs8" || payloadMode.GetUniqueName () == "VhtMcs9"))
+          {
+            Nes = 2;
+          }
+        else
+          {
+            Nes = 1;
+          }
+
+        //IEEE Std 802.11n, section 20.3.11, equation (20-32)
         uint32_t numSymbols;
+        double numDataBitsPerSymbol = payloadMode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1) * txVector.GetNss () * symbolDuration.GetNanoSeconds () / 1e9;
+
         if (packetType == 1 && preamble != WIFI_PREAMBLE_NONE)
           {
-           //First packet in an A-MPDU
-           numSymbols = ceil(m_Stbc*(16 + size * 8.0 + 6*Nes) / (m_Stbc* numDataBitsPerSymbol));
-           if (incFlag == 1)
-             {
-               m_totalAmpduSize += size;
-               m_totalAmpduNumSymbols += numSymbols;
-             }
+            //First packet in an A-MPDU
+            numSymbols = ceil (m_Stbc * (16 + size * 8.0 + 6 * Nes) / (m_Stbc * numDataBitsPerSymbol));
+            if (incFlag == 1)
+              {
+                m_totalAmpduSize += size;
+                m_totalAmpduNumSymbols += numSymbols;
+              }
           }
         else if (packetType == 1 && preamble == WIFI_PREAMBLE_NONE)
           {
             //consecutive packets in an A-MPDU
-            numSymbols = m_Stbc* ((size * 8.0 ) / (m_Stbc* numDataBitsPerSymbol));
+            numSymbols = m_Stbc * ((size * 8.0 ) / (m_Stbc * numDataBitsPerSymbol));
             if (incFlag == 1)
               {
                 m_totalAmpduSize += size;
@@ -532,8 +546,8 @@
         else if (packetType == 2 && preamble == WIFI_PREAMBLE_NONE)
           {
             //last packet in an A-MPDU
-            uint32_t totalAmpduSize = m_totalAmpduSize+size;
-            numSymbols = lrint (m_Stbc* ceil((16 + totalAmpduSize * 8.0 + 6*Nes) / (m_Stbc* numDataBitsPerSymbol)));
+            uint32_t totalAmpduSize = m_totalAmpduSize + size;
+            numSymbols = lrint (m_Stbc * ceil ((16 + totalAmpduSize * 8.0 + 6 * Nes) / (m_Stbc * numDataBitsPerSymbol)));
             NS_ASSERT (m_totalAmpduNumSymbols <= numSymbols);
             numSymbols -= m_totalAmpduNumSymbols;
             if (incFlag == 1)
@@ -543,30 +557,31 @@
               }
           }
         else if (packetType == 0 && preamble != WIFI_PREAMBLE_NONE)
-           //Not an A-MPDU
           {
-           numSymbols = lrint (m_Stbc*ceil ((16 + size * 8.0 + 6.0*Nes) / (m_Stbc* numDataBitsPerSymbol)));
+            //Not an A-MPDU
+            numSymbols = lrint (m_Stbc * ceil ((16 + size * 8.0 + 6.0 * Nes) / (m_Stbc * numDataBitsPerSymbol)));
           }
         else
-           NS_FATAL_ERROR ("Wrong combination of preamble and packet type");
-       
-        if (frequency >= 2400 && frequency <= 2500 && ((packetType == 0 && preamble != WIFI_PREAMBLE_NONE) || (packetType == 2 && preamble == WIFI_PREAMBLE_NONE))) //at 2.4 GHz
           {
-            return Time (numSymbols * symbolDuration) + MicroSeconds(6);
+            NS_FATAL_ERROR ("Wrong combination of preamble and packet type");
           }
-        else  //at 5 GHz
+
+        if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_HT && frequency >= 2400 && frequency <= 2500 && ((packetType == 0 && preamble != WIFI_PREAMBLE_NONE) || (packetType == 2 && preamble == WIFI_PREAMBLE_NONE))) //at 2.4 GHz
+          {
+            return Time (numSymbols * symbolDuration) + MicroSeconds (6);
+          }
+        else //at 5 GHz
           {
             return Time (numSymbols * symbolDuration);
           }
-         
       }
     case WIFI_MOD_CLASS_DSSS:
-      // (Section 17.2.3.6 "Long PLCP LENGTH field"; IEEE Std 802.11-2012)
+    case WIFI_MOD_CLASS_HR_DSSS:
+      //(Section 17.2.3.6 "Long PLCP LENGTH field"; IEEE Std 802.11-2012)
       NS_LOG_LOGIC (" size=" << size
                              << " mode=" << payloadMode
-                             << " rate=" << payloadMode.GetDataRate () );
-      return MicroSeconds (lrint (ceil ((size * 8.0) / (payloadMode.GetDataRate () / 1.0e6))));
-
+                             << " rate=" << payloadMode.GetDataRate (22, 0, 1));
+      return MicroSeconds (lrint (ceil ((size * 8.0) / (payloadMode.GetDataRate (22, 0, 1) / 1.0e6))));
     default:
       NS_FATAL_ERROR ("unsupported modulation class");
       return MicroSeconds (0);
@@ -574,24 +589,23 @@
 }
 
 Time
-WifiPhy::CalculateTxDuration (uint32_t size, WifiTxVector txvector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag)
+WifiPhy::CalculatePlcpPreambleAndHeaderDuration (WifiTxVector txVector, WifiPreamble preamble)
 {
-  WifiMode payloadMode=txvector.GetMode();
-  Time duration = GetPlcpPreambleDuration (payloadMode, preamble)
-    + GetPlcpHeaderDuration (payloadMode, preamble)
+  Time duration = GetPlcpPreambleDuration (txVector, preamble)
+    + GetPlcpHeaderDuration (txVector, preamble)
     + GetPlcpHtSigHeaderDuration (preamble)
-    + GetPlcpHtTrainingSymbolDuration (preamble, txvector)
-    + GetPayloadDuration (size, txvector, preamble, frequency, packetType, incFlag);
+    + GetPlcpVhtSigA1Duration (preamble)
+    + GetPlcpVhtSigA2Duration (preamble)
+    + GetPlcpHtTrainingSymbolDuration (preamble, txVector)
+    + GetPlcpVhtSigBDuration (preamble);
   return duration;
 }
+
 Time
-WifiPhy::CalculatePlcpDuration (WifiTxVector txvector, WifiPreamble preamble)
+WifiPhy::CalculateTxDuration (uint32_t size, WifiTxVector txVector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag)
 {
-  WifiMode payloadMode=txvector.GetMode();
-  Time duration = GetPlcpPreambleDuration (payloadMode, preamble)
-    + GetPlcpHeaderDuration (payloadMode, preamble)
-    + GetPlcpHtSigHeaderDuration (preamble)
-    + GetPlcpHtTrainingSymbolDuration (preamble, txvector);
+  Time duration = CalculatePlcpPreambleAndHeaderDuration (txVector, preamble)
+    + GetPayloadDuration (size, txVector, preamble, frequency, packetType, incFlag);
   return duration;
 }
 
@@ -632,15 +646,15 @@
 }
 
 void
-WifiPhy::NotifyMonitorSniffRx (Ptr<const Packet> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm)
+WifiPhy::NotifyMonitorSniffRx (Ptr<const Packet> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, WifiPreamble preamble, WifiTxVector txVector, struct mpduInfo aMpdu, struct signalNoiseDbm signalNoise)
 {
-  m_phyMonitorSniffRxTrace (packet, channelFreqMhz, channelNumber, rate, isShortPreamble, signalDbm, noiseDbm);
+  m_phyMonitorSniffRxTrace (packet, channelFreqMhz, channelNumber, rate, preamble, txVector, aMpdu, signalNoise);
 }
 
 void
-WifiPhy::NotifyMonitorSniffTx (Ptr<const Packet> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower)
+WifiPhy::NotifyMonitorSniffTx (Ptr<const Packet> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, WifiPreamble preamble, WifiTxVector txVector, struct mpduInfo aMpdu)
 {
-  m_phyMonitorSniffTxTrace (packet, channelFreqMhz, channelNumber, rate, isShortPreamble, txPower);
+  m_phyMonitorSniffTxTrace (packet, channelFreqMhz, channelNumber, rate, preamble, txVector, aMpdu);
 }
 
 
@@ -653,7 +667,6 @@
     WifiModeFactory::CreateWifiMode ("DsssRate1Mbps",
                                      WIFI_MOD_CLASS_DSSS,
                                      true,
-                                     22000000, 1000000,
                                      WIFI_CODE_RATE_UNDEFINED,
                                      2);
   return mode;
@@ -666,7 +679,6 @@
     WifiModeFactory::CreateWifiMode ("DsssRate2Mbps",
                                      WIFI_MOD_CLASS_DSSS,
                                      true,
-                                     22000000, 2000000,
                                      WIFI_CODE_RATE_UNDEFINED,
                                      4);
   return mode;
@@ -680,11 +692,10 @@
 {
   static WifiMode mode =
     WifiModeFactory::CreateWifiMode ("DsssRate5_5Mbps",
-                                     WIFI_MOD_CLASS_DSSS,
+                                     WIFI_MOD_CLASS_HR_DSSS,
                                      true,
-                                     22000000, 5500000,
                                      WIFI_CODE_RATE_UNDEFINED,
-                                     4);
+                                     16);
   return mode;
 }
 
@@ -693,11 +704,10 @@
 {
   static WifiMode mode =
     WifiModeFactory::CreateWifiMode ("DsssRate11Mbps",
-                                     WIFI_MOD_CLASS_DSSS,
+                                     WIFI_MOD_CLASS_HR_DSSS,
                                      true,
-                                     22000000, 11000000,
                                      WIFI_CODE_RATE_UNDEFINED,
-                                     4);
+                                     256);
   return mode;
 }
 
@@ -711,7 +721,6 @@
     WifiModeFactory::CreateWifiMode ("ErpOfdmRate6Mbps",
                                      WIFI_MOD_CLASS_ERP_OFDM,
                                      true,
-                                     20000000, 6000000,
                                      WIFI_CODE_RATE_1_2,
                                      2);
   return mode;
@@ -724,7 +733,6 @@
     WifiModeFactory::CreateWifiMode ("ErpOfdmRate9Mbps",
                                      WIFI_MOD_CLASS_ERP_OFDM,
                                      false,
-                                     20000000, 9000000,
                                      WIFI_CODE_RATE_3_4,
                                      2);
   return mode;
@@ -737,7 +745,6 @@
     WifiModeFactory::CreateWifiMode ("ErpOfdmRate12Mbps",
                                      WIFI_MOD_CLASS_ERP_OFDM,
                                      true,
-                                     20000000, 12000000,
                                      WIFI_CODE_RATE_1_2,
                                      4);
   return mode;
@@ -750,7 +757,6 @@
     WifiModeFactory::CreateWifiMode ("ErpOfdmRate18Mbps",
                                      WIFI_MOD_CLASS_ERP_OFDM,
                                      false,
-                                     20000000, 18000000,
                                      WIFI_CODE_RATE_3_4,
                                      4);
   return mode;
@@ -763,7 +769,6 @@
     WifiModeFactory::CreateWifiMode ("ErpOfdmRate24Mbps",
                                      WIFI_MOD_CLASS_ERP_OFDM,
                                      true,
-                                     20000000, 24000000,
                                      WIFI_CODE_RATE_1_2,
                                      16);
   return mode;
@@ -776,7 +781,6 @@
     WifiModeFactory::CreateWifiMode ("ErpOfdmRate36Mbps",
                                      WIFI_MOD_CLASS_ERP_OFDM,
                                      false,
-                                     20000000, 36000000,
                                      WIFI_CODE_RATE_3_4,
                                      16);
   return mode;
@@ -789,7 +793,6 @@
     WifiModeFactory::CreateWifiMode ("ErpOfdmRate48Mbps",
                                      WIFI_MOD_CLASS_ERP_OFDM,
                                      false,
-                                     20000000, 48000000,
                                      WIFI_CODE_RATE_2_3,
                                      64);
   return mode;
@@ -802,7 +805,6 @@
     WifiModeFactory::CreateWifiMode ("ErpOfdmRate54Mbps",
                                      WIFI_MOD_CLASS_ERP_OFDM,
                                      false,
-                                     20000000, 54000000,
                                      WIFI_CODE_RATE_3_4,
                                      64);
   return mode;
@@ -818,7 +820,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate6Mbps",
                                      WIFI_MOD_CLASS_OFDM,
                                      true,
-                                     20000000, 6000000,
                                      WIFI_CODE_RATE_1_2,
                                      2);
   return mode;
@@ -831,7 +832,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate9Mbps",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     20000000, 9000000,
                                      WIFI_CODE_RATE_3_4,
                                      2);
   return mode;
@@ -844,7 +844,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate12Mbps",
                                      WIFI_MOD_CLASS_OFDM,
                                      true,
-                                     20000000, 12000000,
                                      WIFI_CODE_RATE_1_2,
                                      4);
   return mode;
@@ -857,7 +856,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate18Mbps",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     20000000, 18000000,
                                      WIFI_CODE_RATE_3_4,
                                      4);
   return mode;
@@ -870,7 +868,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate24Mbps",
                                      WIFI_MOD_CLASS_OFDM,
                                      true,
-                                     20000000, 24000000,
                                      WIFI_CODE_RATE_1_2,
                                      16);
   return mode;
@@ -883,7 +880,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate36Mbps",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     20000000, 36000000,
                                      WIFI_CODE_RATE_3_4,
                                      16);
   return mode;
@@ -896,7 +892,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate48Mbps",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     20000000, 48000000,
                                      WIFI_CODE_RATE_2_3,
                                      64);
   return mode;
@@ -909,12 +904,12 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate54Mbps",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     20000000, 54000000,
                                      WIFI_CODE_RATE_3_4,
                                      64);
   return mode;
 }
 
+
 // 10 MHz channel rates
 
 WifiMode
@@ -924,7 +919,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate3MbpsBW10MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      true,
-                                     10000000, 3000000,
                                      WIFI_CODE_RATE_1_2,
                                      2);
   return mode;
@@ -937,7 +931,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate4_5MbpsBW10MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     10000000, 4500000,
                                      WIFI_CODE_RATE_3_4,
                                      2);
   return mode;
@@ -950,7 +943,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate6MbpsBW10MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      true,
-                                     10000000, 6000000,
                                      WIFI_CODE_RATE_1_2,
                                      4);
   return mode;
@@ -963,7 +955,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate9MbpsBW10MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     10000000, 9000000,
                                      WIFI_CODE_RATE_3_4,
                                      4);
   return mode;
@@ -976,7 +967,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate12MbpsBW10MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      true,
-                                     10000000, 12000000,
                                      WIFI_CODE_RATE_1_2,
                                      16);
   return mode;
@@ -989,7 +979,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate18MbpsBW10MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     10000000, 18000000,
                                      WIFI_CODE_RATE_3_4,
                                      16);
   return mode;
@@ -1002,7 +991,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate24MbpsBW10MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     10000000, 24000000,
                                      WIFI_CODE_RATE_2_3,
                                      64);
   return mode;
@@ -1015,12 +1003,12 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate27MbpsBW10MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     10000000, 27000000,
                                      WIFI_CODE_RATE_3_4,
                                      64);
   return mode;
 }
 
+
 // 5 MHz channel rates
 
 WifiMode
@@ -1030,7 +1018,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate1_5MbpsBW5MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      true,
-                                     5000000, 1500000,
                                      WIFI_CODE_RATE_1_2,
                                      2);
   return mode;
@@ -1043,7 +1030,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate2_25MbpsBW5MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     5000000, 2250000,
                                      WIFI_CODE_RATE_3_4,
                                      2);
   return mode;
@@ -1056,7 +1042,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate3MbpsBW5MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      true,
-                                     5000000, 3000000,
                                      WIFI_CODE_RATE_1_2,
                                      4);
   return mode;
@@ -1069,7 +1054,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate4_5MbpsBW5MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     5000000, 4500000,
                                      WIFI_CODE_RATE_3_4,
                                      4);
   return mode;
@@ -1082,7 +1066,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate6MbpsBW5MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      true,
-                                     5000000, 6000000,
                                      WIFI_CODE_RATE_1_2,
                                      16);
   return mode;
@@ -1095,7 +1078,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate9MbpsBW5MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     5000000, 9000000,
                                      WIFI_CODE_RATE_3_4,
                                      16);
   return mode;
@@ -1108,7 +1090,6 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate12MbpsBW5MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     5000000, 12000000,
                                      WIFI_CODE_RATE_2_3,
                                      64);
   return mode;
@@ -1121,424 +1102,352 @@
     WifiModeFactory::CreateWifiMode ("OfdmRate13_5MbpsBW5MHz",
                                      WIFI_MOD_CLASS_OFDM,
                                      false,
-                                     5000000, 13500000,
                                      WIFI_CODE_RATE_3_4,
                                      64);
   return mode;
 }
 
+
 // Clause 20
 
 WifiMode
-WifiPhy::GetOfdmRate6_5MbpsBW20MHz ()
+WifiPhy::GetHtMcs0 ()
 {
-  static WifiMode mode =
-  WifiModeFactory::CreateWifiMode ("OfdmRate6_5MbpsBW20MHz",
-                                    WIFI_MOD_CLASS_HT,
-                                    true,
-                                    20000000, 6500000,
-                                    WIFI_CODE_RATE_1_2,
-                                    2);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs0", 0, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
+
 WifiMode
-WifiPhy::GetOfdmRate7_2MbpsBW20MHz ()
+WifiPhy::GetHtMcs1 ()
 {
-  static WifiMode mode =
-  WifiModeFactory::CreateWifiMode ("OfdmRate7_2MbpsBW20MHz",
-                                    WIFI_MOD_CLASS_HT,
-                                    false,
-                                    20000000, 7200000,
-                                    WIFI_CODE_RATE_1_2,
-                                    2);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs1", 1, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate13MbpsBW20MHz ()
+WifiPhy::GetHtMcs2 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate13MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     true,
-                                     20000000, 13000000,
-                                     WIFI_CODE_RATE_1_2,
-                                     4);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs2", 2, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate14_4MbpsBW20MHz ()
+WifiPhy::GetHtMcs3 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate14_4MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     20000000, 14400000,
-                                     WIFI_CODE_RATE_1_2,
-                                     4);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs3", 3, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
+
 WifiMode
-WifiPhy::GetOfdmRate19_5MbpsBW20MHz ()
+WifiPhy::GetHtMcs4 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate19_5MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     true,
-                                     20000000, 19500000,
-                                     WIFI_CODE_RATE_3_4,
-                                     4);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs4", 4, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate21_7MbpsBW20MHz ()
+WifiPhy::GetHtMcs5 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate21_7MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     20000000, 21700000,
-                                     WIFI_CODE_RATE_3_4,
-                                     4);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs5", 5, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
+WifiMode
+WifiPhy::GetHtMcs6 ()
+{
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs6", 6, WIFI_MOD_CLASS_HT);
+  return mcs;
+}
 
 WifiMode
-WifiPhy::GetOfdmRate26MbpsBW20MHz ()
+WifiPhy::GetHtMcs7 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate26MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     true,
-                                     20000000, 26000000,
-                                     WIFI_CODE_RATE_1_2,
-                                     16);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs7", 7, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate28_9MbpsBW20MHz ()
+WifiPhy::GetHtMcs8 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate28_9MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     20000000, 28900000,
-                                     WIFI_CODE_RATE_1_2,
-                                     16);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs8", 8, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate39MbpsBW20MHz ()
+WifiPhy::GetHtMcs9 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate39MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     true,
-                                     20000000, 39000000,
-                                     WIFI_CODE_RATE_3_4,
-                                     16);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs9", 9, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate43_3MbpsBW20MHz ()
+WifiPhy::GetHtMcs10 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate43_3MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     20000000, 43300000,
-                                     WIFI_CODE_RATE_3_4,
-                                     16);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs10", 10, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate52MbpsBW20MHz ()
+WifiPhy::GetHtMcs11 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate52MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     true,
-                                     20000000, 52000000,
-                                     WIFI_CODE_RATE_2_3,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs11", 11, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate57_8MbpsBW20MHz ()
+WifiPhy::GetHtMcs12 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate57_8MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     20000000, 57800000,
-                                     WIFI_CODE_RATE_2_3,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs12", 12, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
+WifiMode
+WifiPhy::GetHtMcs13 ()
+{
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs13", 13, WIFI_MOD_CLASS_HT);
+  return mcs;
+}
 
 WifiMode
-WifiPhy::GetOfdmRate58_5MbpsBW20MHz ()
+WifiPhy::GetHtMcs14 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate58_5MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     true,
-                                     20000000, 58500000,
-                                     WIFI_CODE_RATE_3_4,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs14", 14, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate65MbpsBW20MHzShGi ()
+WifiPhy::GetHtMcs15 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate65MbpsBW20MHzShGi",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     20000000, 65000000,
-                                     WIFI_CODE_RATE_3_4,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs15", 15, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate65MbpsBW20MHz ()
+WifiPhy::GetHtMcs16 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate65MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     true,
-                                     20000000, 65000000,
-                                     WIFI_CODE_RATE_5_6,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs16", 16, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate72_2MbpsBW20MHz ()
+WifiPhy::GetHtMcs17 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate72_2MbpsBW20MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     20000000, 72200000,
-                                     WIFI_CODE_RATE_5_6,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs17", 17, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate13_5MbpsBW40MHz ()
+WifiPhy::GetHtMcs18 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate13_5MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 13500000,
-                                     WIFI_CODE_RATE_1_2,
-                                     2);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs18", 18, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate15MbpsBW40MHz ()
+WifiPhy::GetHtMcs19 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate15MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 15000000,
-                                     WIFI_CODE_RATE_1_2,
-                                     2);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs19", 19, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate27MbpsBW40MHz ()
+WifiPhy::GetHtMcs20 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate27MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 27000000,
-                                     WIFI_CODE_RATE_1_2,
-                                     4);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs20", 20, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
+
 WifiMode
-WifiPhy::GetOfdmRate30MbpsBW40MHz ()
+WifiPhy::GetHtMcs21 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate30MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 30000000,
-                                     WIFI_CODE_RATE_1_2,
-                                     4);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs21", 21, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate40_5MbpsBW40MHz ()
+WifiPhy::GetHtMcs22 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate40_5MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 40500000,
-                                     WIFI_CODE_RATE_3_4,
-                                     4);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs22", 22, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
+
 WifiMode
-WifiPhy::GetOfdmRate45MbpsBW40MHz ()
+WifiPhy::GetHtMcs23 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate45MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 45000000,
-                                     WIFI_CODE_RATE_3_4,
-                                     4);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs23", 23, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate54MbpsBW40MHz ()
+WifiPhy::GetHtMcs24 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate54MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 54000000,
-                                     WIFI_CODE_RATE_1_2,
-                                     16);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs24", 24, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate60MbpsBW40MHz ()
+WifiPhy::GetHtMcs25 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate60MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 60000000,
-                                     WIFI_CODE_RATE_1_2,
-                                     16);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs25", 25, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate81MbpsBW40MHz ()
+WifiPhy::GetHtMcs26 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate81MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 81000000,
-                                     WIFI_CODE_RATE_3_4,
-                                     16);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs26", 26, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
+
 WifiMode
-WifiPhy::GetOfdmRate90MbpsBW40MHz ()
+WifiPhy::GetHtMcs27 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate90MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 90000000,
-                                     WIFI_CODE_RATE_3_4,
-                                     16);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs27", 27, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate108MbpsBW40MHz ()
+WifiPhy::GetHtMcs28 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate108MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 108000000,
-                                     WIFI_CODE_RATE_2_3,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs28", 28, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
+
 WifiMode
-WifiPhy::GetOfdmRate120MbpsBW40MHz ()
+WifiPhy::GetHtMcs29 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate120MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 120000000,
-                                     WIFI_CODE_RATE_2_3,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs29", 29, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
+
 WifiMode
-WifiPhy::GetOfdmRate121_5MbpsBW40MHz ()
+WifiPhy::GetHtMcs30 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate121_5MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 121500000,
-                                     WIFI_CODE_RATE_3_4,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs30", 30, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
+
 WifiMode
-WifiPhy::GetOfdmRate135MbpsBW40MHzShGi ()
+WifiPhy::GetHtMcs31 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate135MbpsBW40MHzShGi",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 135000000,
-                                     WIFI_CODE_RATE_3_4,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("HtMcs31", 31, WIFI_MOD_CLASS_HT);
+  return mcs;
 }
+
+
+// Clause 22
+
 WifiMode
-WifiPhy::GetOfdmRate135MbpsBW40MHz ()
+WifiPhy::GetVhtMcs0 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate135MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 135000000,
-                                     WIFI_CODE_RATE_5_6,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("VhtMcs0", 0, WIFI_MOD_CLASS_VHT);
+  return mcs;
 }
 
 WifiMode
-WifiPhy::GetOfdmRate150MbpsBW40MHz ()
+WifiPhy::GetVhtMcs1 ()
 {
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate150MbpsBW40MHz",
-                                     WIFI_MOD_CLASS_HT,
-                                     false,
-                                     40000000, 150000000,
-                                     WIFI_CODE_RATE_5_6,
-                                     64);
-  return mode;
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("VhtMcs1", 1, WIFI_MOD_CLASS_VHT);
+  return mcs;
+}
+
+WifiMode
+WifiPhy::GetVhtMcs2 ()
+{
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("VhtMcs2", 2, WIFI_MOD_CLASS_VHT);
+  return mcs;
+}
+
+WifiMode
+WifiPhy::GetVhtMcs3 ()
+{
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("VhtMcs3", 3, WIFI_MOD_CLASS_VHT);
+  return mcs;
+}
+
+WifiMode
+WifiPhy::GetVhtMcs4 ()
+{
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("VhtMcs4", 4, WIFI_MOD_CLASS_VHT);
+  return mcs;
 }
 
+WifiMode
+WifiPhy::GetVhtMcs5 ()
+{
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("VhtMcs5", 5, WIFI_MOD_CLASS_VHT);
+  return mcs;
+}
 
+WifiMode
+WifiPhy::GetVhtMcs6 ()
+{
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("VhtMcs6", 6, WIFI_MOD_CLASS_VHT);
+  return mcs;
+}
+
+WifiMode
+WifiPhy::GetVhtMcs7 ()
+{
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("VhtMcs7", 7, WIFI_MOD_CLASS_VHT);
+  return mcs;
+}
+
+WifiMode
+WifiPhy::GetVhtMcs8 ()
+{
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("VhtMcs8", 8, WIFI_MOD_CLASS_VHT);
+  return mcs;
+}
+
+WifiMode
+WifiPhy::GetVhtMcs9 ()
+{
+  static WifiMode mcs =
+    WifiModeFactory::CreateWifiMcs ("VhtMcs9", 9, WIFI_MOD_CLASS_VHT);
+  return mcs;
+}
 
 std::ostream& operator<< (std::ostream& os, enum WifiPhy::State state)
 {
@@ -1562,9 +1471,7 @@
     }
 }
 
-
-
-} // namespace ns3
+} //namespace ns3
 
 namespace {
 
@@ -1609,38 +1516,49 @@
     ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz ();
     ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz ();
     ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz ();
-    ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz ();    
-    ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi ();
-    ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz ();
-    ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz ();
-    ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi ();
-    ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz ();
+    ns3::WifiPhy::GetHtMcs0 ();
+    ns3::WifiPhy::GetHtMcs1 ();
+    ns3::WifiPhy::GetHtMcs2 ();
+    ns3::WifiPhy::GetHtMcs3 ();
+    ns3::WifiPhy::GetHtMcs4 ();
+    ns3::WifiPhy::GetHtMcs5 ();
+    ns3::WifiPhy::GetHtMcs6 ();
+    ns3::WifiPhy::GetHtMcs7 ();
+    ns3::WifiPhy::GetHtMcs8 ();
+    ns3::WifiPhy::GetHtMcs9 ();
+    ns3::WifiPhy::GetHtMcs10 ();
+    ns3::WifiPhy::GetHtMcs11 ();
+    ns3::WifiPhy::GetHtMcs12 ();
+    ns3::WifiPhy::GetHtMcs13 ();
+    ns3::WifiPhy::GetHtMcs14 ();
+    ns3::WifiPhy::GetHtMcs15 ();
+    ns3::WifiPhy::GetHtMcs16 ();
+    ns3::WifiPhy::GetHtMcs17 ();
+    ns3::WifiPhy::GetHtMcs18 ();
+    ns3::WifiPhy::GetHtMcs19 ();
+    ns3::WifiPhy::GetHtMcs20 ();
+    ns3::WifiPhy::GetHtMcs21 ();
+    ns3::WifiPhy::GetHtMcs22 ();
+    ns3::WifiPhy::GetHtMcs23 ();
+    ns3::WifiPhy::GetHtMcs24 ();
+    ns3::WifiPhy::GetHtMcs25 ();
+    ns3::WifiPhy::GetHtMcs26 ();
+    ns3::WifiPhy::GetHtMcs27 ();
+    ns3::WifiPhy::GetHtMcs28 ();
+    ns3::WifiPhy::GetHtMcs29 ();
+    ns3::WifiPhy::GetHtMcs30 ();
+    ns3::WifiPhy::GetHtMcs31 ();
+    ns3::WifiPhy::GetVhtMcs0 ();
+    ns3::WifiPhy::GetVhtMcs1 ();
+    ns3::WifiPhy::GetVhtMcs2 ();
+    ns3::WifiPhy::GetVhtMcs3 ();
+    ns3::WifiPhy::GetVhtMcs4 ();
+    ns3::WifiPhy::GetVhtMcs5 ();
+    ns3::WifiPhy::GetVhtMcs6 ();
+    ns3::WifiPhy::GetVhtMcs7 ();
+    ns3::WifiPhy::GetVhtMcs8 ();
+    ns3::WifiPhy::GetVhtMcs9 ();
   }
 } g_constructor;
+
 }
diff -Naur ns-3.23/src/wifi/model/wifi-phy.h ns-3.24/src/wifi/model/wifi-phy.h
--- ns-3.23/src/wifi/model/wifi-phy.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -15,7 +15,8 @@
  * 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>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
 #ifndef WIFI_PHY_H
@@ -38,6 +39,18 @@
 class WifiChannel;
 class NetDevice;
 
+struct signalNoiseDbm
+{
+  double signal; //in dBm
+  double noise; //in dBm
+};
+
+struct mpduInfo
+{
+  uint8_t packetType;
+  uint32_t referenceNumber;
+};
+
 /**
  * \brief receive notifications about phy events.
  */
@@ -82,7 +95,6 @@
    * unless they have received a cca busy report.
    */
   virtual void NotifyTxStart (Time duration, double txPowerDbm) = 0;
-
   /**
    * \param duration the expected busy duration.
    *
@@ -163,12 +175,12 @@
    * arg3: TXVECTOR of packet
    * arg4: type of preamble used for packet.
    */
-  typedef Callback<void,Ptr<Packet>, double, WifiTxVector, enum WifiPreamble> RxOkCallback;
+  typedef Callback<void, Ptr<Packet>, double, WifiTxVector, enum WifiPreamble> RxOkCallback;
   /**
    * arg1: packet received unsuccessfully
    * arg2: snr of packet
    */
-  typedef Callback<void,Ptr<const Packet>, double> RxErrorCallback;
+  typedef Callback<void, Ptr<const Packet>, double> RxErrorCallback;
 
   static TypeId GetTypeId (void);
 
@@ -205,13 +217,14 @@
 
   /**
    * \param packet the packet to send
-   * \param txvector the txvector that has tx parameters such as mode, the transmission mode to use to send
+   * \param txVector the TXVECTOR that has tx parameters such as mode, the transmission mode to use to send
    *        this packet, and txPowerLevel, a power level to use to send this packet. The real transmission
    *        power is calculated as txPowerMin + txPowerLevel * (txPowerMax - txPowerMin) / nTxLevels
    * \param preamble the type of preamble to use to send this packet.
    * \param packetType the type of the packet 0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU
+   * \param mpduReferenceNumber the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
    */
-  virtual void SendPacket (Ptr<const Packet> packet, WifiTxVector txvector, enum WifiPreamble preamble, uint8_t packetType) = 0;
+  virtual void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, enum WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) = 0;
 
   /**
    * \param listener the new listener
@@ -286,80 +299,101 @@
 
   /**
    * \param size the number of bytes in the packet to send
-   * \param txvector the transmission parameters used for this packet
+   * \param txVector the TXVECTOR used for the transmission of this packet
    * \param preamble the type of preamble to use for this packet.
    * \param frequency the channel center frequency (MHz)
-   * \param packetType the type of the packet 0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU  and 2 is the last MPDU in an A-MPDU
-   * \param incFlag this flag is used to indicate that the static variables need to be update or not. This function is called a couple of times for the same packet so static variables should not be increased each time. 
-   * \return the total amount of time this PHY will stay busy for
-   *          the transmission of these bytes.
+   * \param packetType the type of the packet 0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU
+   * \param incFlag this flag is used to indicate that the static variables need to be update or not. This function is called a couple of times for the same packet so static variables should not be increased each time.
+   *
+   * \return the total amount of time this PHY will stay busy for the transmission of these bytes.
    */
-  Time CalculateTxDuration (uint32_t size, WifiTxVector txvector, enum WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag);
-  
+  Time CalculateTxDuration (uint32_t size, WifiTxVector txVector, enum WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag);
+
   /**
-   * \param txvector the transmission parameters used for this packet
+   * \param txVector the transmission parameters used for this packet
    * \param preamble the type of preamble to use for this packet.
-   * \return the total amount of time this PHY will stay busy for the transmission of the plcp.
+   *
+   * \return the total amount of time this PHY will stay busy for the transmission of the PLCP preamble and PLCP header.
    */
-  Time CalculatePlcpDuration (WifiTxVector txvector, enum WifiPreamble preamble);
+  Time CalculatePlcpPreambleAndHeaderDuration (WifiTxVector txVector, enum WifiPreamble preamble);
 
   /**
    * \param preamble the type of preamble
-   * \param txvector the transmission parameters used for this packet
-
+   * \param txVector the transmission parameters used for this packet
+   *
    * \return the training symbol duration
    */
-  static Time GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector txvector);
+  static Time GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector txVector);
   /**
    * \param payloadMode the WifiMode use for the transmission of the payload
-   * \param preamble the type of preamble
-   * 
-   * \return the WifiMode used for the transmission of the HT-SIG in Mixed Format and greenfield format PLCP header 
+   *
+   * \return the WifiMode used for the transmission of the HT-SIG and the HT training fields
+   *         in Mixed Format and greenfield format PLCP header
+   */
+  static WifiMode GetHtPlcpHeaderMode (WifiMode payloadMode);
+  /**
+   * \param payloadMode the WifiMode use for the transmission of the payload
+   *
+   * \return the WifiMode used for the transmission of the VHT-STF, VHT-LTF and VHT-SIG-B fields
    */
-  static WifiMode GetMFPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble);
-  /** 
+  static WifiMode GetVhtPlcpHeaderMode (WifiMode payloadMode);
+  /**
    * \param preamble the type of preamble
-   * 
-   * \return the duration of the HT-SIG in Mixed Format and greenfield format PLCP header 
+   *
+   * \return the duration of the HT-SIG in Mixed Format and greenfield format PLCP header
    */
   static Time GetPlcpHtSigHeaderDuration (WifiPreamble preamble);
-
-
-  /** 
-   * \param payloadMode the WifiMode use for the transmission of the payload
+  /**
    * \param preamble the type of preamble
-   * 
-   * \return the WifiMode used for the transmission of the PLCP header 
+   *
+   * \return the duration of the VHT-SIG-A1 in PLCP header
    */
-  static WifiMode GetPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble);
-
+  static Time GetPlcpVhtSigA1Duration (WifiPreamble preamble);
+  /**
+   * \param preamble the type of preamble
+   *
+   * \return the duration of the VHT-SIG-A2 in PLCP header
+   */
+  static Time GetPlcpVhtSigA2Duration (WifiPreamble preamble);
+  /**
+   * \param preamble the type of preamble
+   *
+   * \return the duration of the VHT-SIG-B in PLCP header
+   */
+  static Time GetPlcpVhtSigBDuration (WifiPreamble preamble);
   /**
    * \param payloadMode the WifiMode use for the transmission of the payload
    * \param preamble the type of preamble
-   * 
+   * \param txVector the transmission parameters used for this packet
+   *
+   * \return the WifiMode used for the transmission of the PLCP header
+   */
+  static WifiMode GetPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble, WifiTxVector txVector);
+  /**
+   * \param txVector the transmission parameters used for this packet
+   * \param preamble the type of preamble
+   *
    * \return the duration of the PLCP header
    */
-  static Time GetPlcpHeaderDuration (WifiMode payloadMode, WifiPreamble preamble);
-
-  /** 
-   * \param payloadMode the WifiMode use for the transmission of the payload
-   * \param preamble the type of preamble 
-   * 
+  static Time GetPlcpHeaderDuration (WifiTxVector txVector, WifiPreamble preamble);
+  /**
+   * \param txVector the transmission parameters used for this packet
+   * \param preamble the type of preamble
+   *
    * \return the duration of the PLCP preamble
    */
-  static Time GetPlcpPreambleDuration (WifiMode payloadMode, WifiPreamble preamble);
-
-  /** 
+  static Time GetPlcpPreambleDuration (WifiTxVector txVector, WifiPreamble preamble);
+  /**
    * \param size the number of bytes in the packet to send
-   * \param txvector the transmission parameters used for this packet
-   * \param preamble the type of preamble to use for this packet.
+   * \param txVector the TXVECTOR used for the transmission of this packet
+   * \param preamble the type of preamble to use for this packet
    * \param frequency the channel center frequency (MHz)
-   * \param packetType the type of the packet 0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU  and 2 is the last MPDU in an A-MPDU
+   * \param packetType the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
    * \param incFlag this flag is used to indicate that the static variables need to be update or not. This function is called a couple of times for the same packet so static variables should not be increased each time
-   * 
+   *
    * \return the duration of the payload
    */
-  Time GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag);
+  Time GetPayloadDuration (uint32_t size, WifiTxVector txVector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag);
 
   /**
    * The WifiPhy::GetNModes() and WifiPhy::GetMode() methods are used
@@ -393,6 +427,7 @@
    * necessarily proper) of the BSSBasicRateSet.
    *
    * \param mode index in array of supported modes
+   *
    * \return the mode whose index is specified.
    *
    * \sa WifiPhy::GetNModes()
@@ -402,43 +437,43 @@
    * Check if the given WifiMode is supported by the PHY.
    *
    * \param mode the wifi mode to check
+   *
    * \return true if the given mode is supported,
    *         false otherwise
    */
   virtual bool IsModeSupported (WifiMode mode) const = 0;
+
   /**
    * \param txMode the transmission mode
    * \param ber the probability of bit error rate
+   *
    * \return the minimum snr which is required to achieve
    *          the requested ber for the specified transmission mode. (W/W)
    */
   virtual double CalculateSnr (WifiMode txMode, double ber) const = 0;
-   /**
-   * The WifiPhy::NBssMembershipSelectors() method is used
-   * (e.g., by a WifiRemoteStationManager) to determine the set of
-   * transmission/reception modes that this WifiPhy(-derived class)
-   * can support - a set of WifiMode objects which we call the
-   * BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet.
-   *
-   * This was introduced with 11n
-   *
-   * \return the memebership selector whose index is specified.
-   */
-  virtual uint32_t GetNBssMembershipSelectors (void) const=0;
 
-   /**
-   * The WifiPhy::BssMembershipSelector() method is used
-   * (e.g., by a WifiRemoteStationManager) to determine the set of
-   * transmission/reception modes that this WifiPhy(-derived class)
-   * can support - a set of WifiMode objects which we call the
-   * BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet.
-   *
-   * This was introduced with 11n
-   *
-   * \param selector index in array of supported memberships
-   * \return the memebership selector whose index is specified.
-   */
-  virtual uint32_t GetBssMembershipSelector (uint32_t selector) const=0;
+  /**
+  * The WifiPhy::NBssMembershipSelectors() method is used
+  * (e.g., by a WifiRemoteStationManager) to determine the set of
+  * transmission/reception modes that this WifiPhy(-derived class)
+  * can support - a set of WifiMode objects which we call the
+  * BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet.
+  *
+  * \return the memebership selector whose index is specified.
+  */
+  virtual uint32_t GetNBssMembershipSelectors (void) const = 0;
+  /**
+  * The WifiPhy::BssMembershipSelector() method is used
+  * (e.g., by a WifiRemoteStationManager) to determine the set of
+  * transmission/reception modes that this WifiPhy(-derived class)
+  * can support - a set of WifiMode objects which we call the
+  * BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet.
+  *
+  * \param selector index in array of supported memberships
+  *
+  * \return the memebership selector whose index is specified.
+  */
+  virtual uint32_t GetBssMembershipSelector (uint32_t selector) const = 0;
   /**
    * The WifiPhy::GetMembershipSelectorModes() method is used
    * (e.g., by a WifiRemoteStationManager) to determine the set of
@@ -446,14 +481,13 @@
    * can support - a set of WifiMode objects which we call the
    * BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet.
    *
-   * This was introduced with 11n
-   *
    * \param selector index in array of supported memberships
+   *
    * \return a WifiModeList that contains the WifiModes associrated with the selected index.
    *
    * \sa WifiPhy::GetMembershipSelectorModes()
    */
-  virtual WifiModeList GetMembershipSelectorModes(uint32_t selector)=0;
+  virtual WifiModeList GetMembershipSelectorModes (uint32_t selector) = 0;
   /**
    * The WifiPhy::GetNMcs() method is used
    * (e.g., by a WifiRemoteStationManager) to determine the set of
@@ -461,11 +495,9 @@
    * can support - a set of MCS indexes which we call the
    * DeviceMcsSet, and which is stored as WifiPhy::m_deviceMcsSet.
    *
-   * This was introduced with 11n
-   *
    * \return the MCS index whose index is specified.
    */
-  virtual uint8_t GetNMcs (void) const=0;
+  virtual uint8_t GetNMcs (void) const = 0;
   /**
    * The WifiPhy::GetMcs() method is used
    * (e.g., by a WifiRemoteStationManager) to determine the set of
@@ -473,31 +505,12 @@
    * can support - a set of MCS indexes which we call the
    * DeviceMcsSet, and which is stored as WifiPhy::m_deviceMcsSet.
    *
-   * This was introduced with 11n
-   *
    * \param mcs index in array of supported MCS
+   *
    * \return the MCS index whose index is specified.
    */
-  virtual uint8_t GetMcs (uint8_t mcs) const=0;
-
-  /**
-  * For a given WifiMode finds the corresponding MCS value and returns it 
-  * as defined in the IEEE 802.11n standard 
-  *
-  * \param mode the WifiMode
-  * \return the MCS number that corresponds to the given WifiMode
-  */
-  virtual uint32_t WifiModeToMcs (WifiMode mode)=0;
- /**
-  * For a given MCS finds the corresponding WifiMode and returns it 
-  * as defined in the IEEE 802.11n standard. 
-  * 
-  * \param mcs the MCS number 
-  * \return the WifiMode that corresponds to the given MCS number
-  */
-  virtual WifiMode McsToWifiMode (uint8_t mcs)=0;
+  virtual WifiMode GetMcs (uint8_t mcs) const = 0;
 
-  
   /**
    * \brief Set channel number.
    *
@@ -509,7 +522,7 @@
    * \param id the channel number
    */
   virtual void SetChannelNumber (uint16_t id) = 0;
-  /**  
+  /**
    * Return current channel number.
    *
    * \return the current channel number
@@ -750,254 +763,307 @@
    * \return a WifiMode for OFDM at 13.5Mbps with 5MHz channel spacing
    */
   static WifiMode GetOfdmRate13_5MbpsBW5MHz ();
+
   /**
-   * Return a WifiMode for OFDM at 6.5Mbps with 20MHz channel spacing.
+   * Return MCS 0 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 6.5Mbps with 20MHz channel spacing
+   * \return MCS 0 from HT MCS values
    */
-  static WifiMode GetOfdmRate6_5MbpsBW20MHz ();
+  static WifiMode GetHtMcs0 ();
   /**
-   * Return a WifiMode for OFDM at 13Mbps with 20MHz channel spacing.
+   * Return MCS 1 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 13Mbps with 20MHz channel spacing
+   * \return MCS 1 from HT MCS values
    */
-  static WifiMode GetOfdmRate13MbpsBW20MHz ();
+  static WifiMode GetHtMcs1 ();
   /**
-   * Return a WifiMode for OFDM at 19.5Mbps with 20MHz channel spacing.
+   * Return MCS 2 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 19.5Mbps with 20MHz channel spacing
+   * \return MCS 2 from HT MCS values
    */
-  static WifiMode GetOfdmRate19_5MbpsBW20MHz ();
+  static WifiMode GetHtMcs2 ();
   /**
-   * Return a WifiMode for OFDM at 26Mbps with 20MHz channel spacing.
+   * Return MCS 3 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 26Mbps with 20MHz channel spacing
+   * \return MCS 3 from HT MCS values
    */
-  static WifiMode GetOfdmRate26MbpsBW20MHz ();
+  static WifiMode GetHtMcs3 ();
   /**
-   * Return a WifiMode for OFDM at 39Mbps with 20MHz channel spacing.
+   * Return MCS 4 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 39Mbps with 20MHz channel spacing
+   * \return MCS 4 from HT MCS values
    */
-  static WifiMode GetOfdmRate39MbpsBW20MHz ();
+  static WifiMode GetHtMcs4 ();
   /**
-   * Return a WifiMode for OFDM at 52Mbps with 20MHz channel spacing.
+   * Return MCS 5 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 52Mbps with 20MHz channel spacing
+   * \return MCS 5 from HT MCS values
    */
-  static WifiMode GetOfdmRate52MbpsBW20MHz ();
+  static WifiMode GetHtMcs5 ();
   /**
-   * Return a WifiMode for OFDM at 58.5Mbps with 20MHz channel spacing.
+   * Return MCS 6 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 58.5Mbps with 20MHz channel spacing
+   * \return MCS 6 from HT MCS values
    */
-  static WifiMode GetOfdmRate58_5MbpsBW20MHz ();
+  static WifiMode GetHtMcs6 ();
   /**
-   * Return a WifiMode for OFDM at 65Mbps with 20MHz channel spacing.
+   * Return MCS 7 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 65Mbps with 20MHz channel spacing
+   * \return MCS 7 from HT MCS values
    */
-  static WifiMode GetOfdmRate65MbpsBW20MHz ();
+  static WifiMode GetHtMcs7 ();
   /**
-   * Return a WifiMode for OFDM at 13.5Mbps with 40MHz channel spacing.
+   * Return MCS 8 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 13.5Mbps with 40MHz channel spacing
+   * \return MCS 8 from HT MCS values
    */
-  static WifiMode GetOfdmRate13_5MbpsBW40MHz ();
+  static WifiMode GetHtMcs8 ();
   /**
-   * Return a WifiMode for OFDM at 27Mbps with 40MHz channel spacing.
+   * Return MCS 9 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 27Mbps with 40MHz channel spacing
+   * \return MCS 9 from HT MCS values
    */
-  static WifiMode GetOfdmRate27MbpsBW40MHz ();
+  static WifiMode GetHtMcs9 ();
   /**
-   * Return a WifiMode for OFDM at 40.5Mbps with 40MHz channel spacing.
+   * Return MCS 10 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 40.5Mbps with 40MHz channel spacing
+   * \return MCS 10 from HT MCS values
    */
-  static WifiMode GetOfdmRate40_5MbpsBW40MHz ();
+  static WifiMode GetHtMcs10 ();
   /**
-   * Return a WifiMode for OFDM at 54Mbps with 40MHz channel spacing.
+   * Return MCS 11 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 54Mbps with 40MHz channel spacing
+   * \return MCS 11 from HT MCS values
    */
-  static WifiMode GetOfdmRate54MbpsBW40MHz ();
+  static WifiMode GetHtMcs11 ();
   /**
-   * Return a WifiMode for OFDM at 81Mbps with 40MHz channel spacing.
+   * Return MCS 12 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 81Mbps with 40MHz channel spacing
+   * \return MCS 12 from HT MCS values
    */
-  static WifiMode GetOfdmRate81MbpsBW40MHz ();
+  static WifiMode GetHtMcs12 ();
   /**
-   * Return a WifiMode for OFDM at 108Mbps with 40MHz channel spacing.
+   * Return MCS 13 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 108Mbps with 40MHz channel spacing
+   * \return MCS 13 from HT MCS values
    */
-  static WifiMode GetOfdmRate108MbpsBW40MHz ();
+  static WifiMode GetHtMcs13 ();
   /**
-   * Return a WifiMode for OFDM at 121.5Mbps with 40MHz channel spacing.
+   * Return MCS 14 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 121.5Mbps with 40MHz channel spacing
+   * \return MCS 14 from HT MCS values
    */
-  static WifiMode GetOfdmRate121_5MbpsBW40MHz ();
+  static WifiMode GetHtMcs14 ();
   /**
-   * Return a WifiMode for OFDM at 135Mbps with 40MHz channel spacing.
+   * Return MCS 15 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 135Mbps with 40MHz channel spacing
+   * \return MCS 15 from HT MCS values
    */
-  static WifiMode GetOfdmRate135MbpsBW40MHz ();
-  //Rates for clause 20 with short guard interval
+  static WifiMode GetHtMcs15 ();
   /**
-   * Return a WifiMode for OFDM at 7.2Mbps with 20MHz channel spacing.
+   * Return MCS 16 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 7.2Mbps with 20MHz channel spacing
+   * \return MCS 16 from HT MCS values
    */
-  static WifiMode GetOfdmRate7_2MbpsBW20MHz ();
+  static WifiMode GetHtMcs16 ();
   /**
-   * Return a WifiMode for OFDM at 14.4Mbps with 20MHz channel spacing.
+   * Return MCS 17 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 14.4Mbps with 20MHz channel spacing
+   * \return MCS 17 from HT MCS values
    */
-  static WifiMode GetOfdmRate14_4MbpsBW20MHz ();
+  static WifiMode GetHtMcs17 ();
   /**
-   * Return a WifiMode for OFDM at 21.7Mbps with 20MHz channel spacing.
+   * Return MCS 18 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 21.7Mbps with 20MHz channel spacing
+   * \return MCS 18 from HT MCS values
    */
-  static WifiMode GetOfdmRate21_7MbpsBW20MHz ();
+  static WifiMode GetHtMcs18 ();
   /**
-   * Return a WifiMode for OFDM at 28.9Mbps with 20MHz channel spacing.
+   * Return MCS 19 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 28.9Mbps with 20MHz channel spacing
+   * \return MCS 19 from HT MCS values
    */
-  static WifiMode GetOfdmRate28_9MbpsBW20MHz ();
+  static WifiMode GetHtMcs19 ();
   /**
-   * Return a WifiMode for OFDM at 43.3Mbps with 20MHz channel spacing.
+   * Return MCS 20 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 43.3Mbps with 20MHz channel spacing
+   * \return MCS 20 from HT MCS values
    */
-  static WifiMode GetOfdmRate43_3MbpsBW20MHz ();
+  static WifiMode GetHtMcs20 ();
   /**
-   * Return a WifiMode for OFDM at 57.8Mbps with 20MHz channel spacing.
+   * Return MCS 21 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 57.8Mbps with 20MHz channel spacing
+   * \return MCS 21 from HT MCS values
    */
-  static WifiMode GetOfdmRate57_8MbpsBW20MHz ();
+  static WifiMode GetHtMcs21 ();
   /**
-   * Return a WifiMode for OFDM at 65Mbps with 20MHz channel spacing.
-   * The rate supports short guard interval.
+   * Return MCS 22 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 65Mbps with 20MHz channel spacing
+   * \return MCS 22 from HT MCS values
    */
-  static WifiMode GetOfdmRate65MbpsBW20MHzShGi ();
+  static WifiMode GetHtMcs22 ();
   /**
-   * Return a WifiMode for OFDM at 72.2Mbps with 20MHz channel spacing.
+   * Return MCS 23 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 72.2Mbps with 20MHz channel spacing
+   * \return MCS 23 from HT MCS values
    */
-  static WifiMode GetOfdmRate72_2MbpsBW20MHz ();
+  static WifiMode GetHtMcs23 ();
   /**
-   * Return a WifiMode for OFDM at 15Mbps with 40MHz channel spacing.
+   * Return MCS 24 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 15Mbps with 40MHz channel spacing
+   * \return MCS 24 from HT MCS values
    */
-  static WifiMode GetOfdmRate15MbpsBW40MHz ();
+  static WifiMode GetHtMcs24 ();
   /**
-   * Return a WifiMode for OFDM at 30Mbps with 40MHz channel spacing.
+   * Return MCS 25 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 30Mbps with 40MHz channel spacing
+   * \return MCS 25 from HT MCS values
    */
-  static WifiMode GetOfdmRate30MbpsBW40MHz (); 
+  static WifiMode GetHtMcs25 ();
   /**
-   * Return a WifiMode for OFDM at 45Mbps with 40MHz channel spacing.
+   * Return MCS 26 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 45Mbps with 40MHz channel spacing
+   * \return MCS 26 from HT MCS values
    */
-  static WifiMode GetOfdmRate45MbpsBW40MHz ();
+  static WifiMode GetHtMcs26 ();
   /**
-   * Return a WifiMode for OFDM at 60Mbps with 40MHz channel spacing.
+   * Return MCS 27 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 60Mbps with 40MHz channel spacing
+   * \return MCS 27 from HT MCS values
    */
-  static WifiMode GetOfdmRate60MbpsBW40MHz ();
+  static WifiMode GetHtMcs27 ();
   /**
-   * Return a WifiMode for OFDM at 90Mbps with 40MHz channel spacing.
+   * Return MCS 28 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 90Mbps with 40MHz channel spacing
+   * \return MCS 28 from HT MCS values
    */
-  static WifiMode GetOfdmRate90MbpsBW40MHz ();
+  static WifiMode GetHtMcs28 ();
   /**
-   * Return a WifiMode for OFDM at 120Mbps with 40MHz channel spacing.
+   * Return MCS 29 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 120Mbps with 40MHz channel spacing
+   * \return MCS 29 from HT MCS values
    */
-  static WifiMode GetOfdmRate120MbpsBW40MHz ();
+  static WifiMode GetHtMcs29 ();
   /**
-   * Return a WifiMode for OFDM at 135Mbps with 40MHz channel spacing.
-   * The rate supports short guard interval.
+   * Return MCS 30 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 135Mbps with 40MHz channel spacing
+   * \return MCS 30 from HT MCS values
    */
-  static WifiMode GetOfdmRate135MbpsBW40MHzShGi ();
+  static WifiMode GetHtMcs30 ();
   /**
-   * Return a WifiMode for OFDM at 150Mbps with 40MHz channel spacing.
+   * Return MCS 31 from HT MCS values.
    *
-   * \return a WifiMode for OFDM at 150Mbps with 40MHz channel spacing
+   * \return MCS 31 from HT MCS values
    */
-  static WifiMode GetOfdmRate150MbpsBW40MHz ();
+  static WifiMode GetHtMcs31 ();
 
+  /**
+   * Return MCS 0 from VHT MCS values.
+   *
+   * \return MCS 0 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs0 ();
+  /**
+   * Return MCS 1 from VHT MCS values.
+   *
+   * \return MCS 1 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs1 ();
+  /**
+   * Return MCS 2 from VHT MCS values.
+   *
+   * \return MCS 2 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs2 ();
+  /**
+   * Return MCS 3 from VHT MCS values.
+   *
+   * \return MCS 3 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs3 ();
+  /**
+   * Return MCS 4 from VHT MCS values.
+   *
+   * \return MCS 4 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs4 ();
+  /**
+   * Return MCS 5 from VHT MCS values.
+   *
+   * \return MCS 5 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs5 ();
+  /**
+   * Return MCS 6 from VHT MCS values.
+   *
+   * \return MCS 6 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs6 ();
+  /**
+   * Return MCS 7 from VHT MCS values.
+   *
+   * \return MCS 7 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs7 ();
+  /**
+   * Return MCS 8 from VHT MCS values.
+   *
+   * \return MCS 8 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs8 ();
+  /**
+   * Return MCS 9 from VHT MCS values.
+   *
+   * \return MCS 9 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs9 ();
 
   /**
-   * Public method used to fire a PhyTxBegin trace.  Implemented for encapsulation
-   * purposes.
+   * Public method used to fire a PhyTxBegin trace.
+   * Implemented for encapsulation purposes.
    *
    * \param packet the packet being transmitted
    */
   void NotifyTxBegin (Ptr<const Packet> packet);
-
   /**
-   * Public method used to fire a PhyTxEnd trace.  Implemented for encapsulation
-   * purposes.
+   * Public method used to fire a PhyTxEnd trace.
+   * Implemented for encapsulation purposes.
    *
    * \param packet the packet that was transmitted
    */
   void NotifyTxEnd (Ptr<const Packet> packet);
-
   /**
-   * Public method used to fire a PhyTxDrop trace.  Implemented for encapsulation
-   * purposes.
+   * Public method used to fire a PhyTxDrop trace.
+   * Implemented for encapsulation purposes.
    *
    * \param packet the packet that was failed to transmitted
    */
   void NotifyTxDrop (Ptr<const Packet> packet);
-
   /**
-   * Public method used to fire a PhyRxBegin trace.  Implemented for encapsulation
-   * purposes.
+   * Public method used to fire a PhyRxBegin trace.
+   * Implemented for encapsulation purposes.
    *
    * \param packet the packet being received
    */
   void NotifyRxBegin (Ptr<const Packet> packet);
-
   /**
-   * Public method used to fire a PhyRxEnd trace.  Implemented for encapsulation
-   * purposes.
+   * Public method used to fire a PhyRxEnd trace.
+   * Implemented for encapsulation purposes.
    *
    * \param packet the packet received
    */
   void NotifyRxEnd (Ptr<const Packet> packet);
-
   /**
-   * Public method used to fire a PhyRxDrop trace.  Implemented for encapsulation
-   * purposes.
+   * Public method used to fire a PhyRxDrop trace.
+   * Implemented for encapsulation purposes.
    *
    * \param packet the packet that was not successfully received
    */
   void NotifyRxDrop (Ptr<const Packet> packet);
 
   /**
-   * Public method used to fire a MonitorSniffer trace for a wifi packet
-   * being received.  Implemented for encapsulation purposes.
+   * Public method used to fire a MonitorSniffer trace for a wifi packet being received.
+   * Implemented for encapsulation purposes.
    *
    * \param packet the packet being received
    * \param channelFreqMhz the frequency in MHz at which the packet is
@@ -1010,14 +1076,15 @@
    * \param channelNumber the channel on which the packet is received
    * \param rate the PHY data rate in units of 500kbps (i.e., the same
    *        units used both for the radiotap and for the prism header)
-   * \param isShortPreamble true if short preamble is used, false otherwise
-   * \param signalDbm signal power in dBm
-   * \param noiseDbm  noise power in dBm
+   * \param preamble the preamble of the packet
+   * \param txVector the TXVECTOR that holds rx parameters
+   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
+   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
+   * \param signalNoise signal power and noise power in dBm
    */
   void NotifyMonitorSniffRx (Ptr<const Packet> packet, uint16_t channelFreqMhz,
-                             uint16_t channelNumber, uint32_t rate,
-                             bool isShortPreamble, double signalDbm,
-                             double noiseDbm);
+                             uint16_t channelNumber, uint32_t rate, WifiPreamble preamble,
+                             WifiTxVector txVector, struct mpduInfo aMpdu, struct signalNoiseDbm signalNoise);
 
   /**
    * TracedCallback signature for monitor mode receive events.
@@ -1034,19 +1101,22 @@
    * \param channelNumber the channel on which the packet is received
    * \param rate the PHY data rate in units of 500kbps (i.e., the same
    *        units used both for the radiotap and for the prism header)
-   * \param isShortPreamble true if short preamble is used, false otherwise
-   * \param signalDbm signal power in dBm
-   * \param noiseDbm  noise power in dBm
-   */
-  typedef void (* MonitorSnifferRxCallback)
-    (Ptr<const Packet> packet, uint16_t channelFreqMhz,
-     uint16_t channelNumber, uint32_t rate,
-     bool isShortPreamble, double signalDbm,
-     double noiseDbm);
+   * \param preamble the preamble of the packet
+   * \param txVector the TXVECTOR that holds rx parameters
+   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
+   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
+   * \param signalNoise signal power and noise power in dBm
+   * \todo WifiTxVector should be passed by const reference because
+   * of its size.
+   */
+  typedef void (* MonitorSnifferRxCallback)(Ptr<const Packet> packet, uint16_t channelFreqMhz,
+                                            uint16_t channelNumber, uint32_t rate, WifiPreamble preamble,
+                                            WifiTxVector txVector, struct mpduInfo aMpdu,
+                                            struct signalNoiseDbm signalNoise);
 
   /**
-   * Public method used to fire a MonitorSniffer trace for a wifi packet
-   * being transmitted.  Implemented for encapsulation purposes.
+   * Public method used to fire a MonitorSniffer trace for a wifi packet being transmitted.
+   * Implemented for encapsulation purposes.
    *
    * \param packet the packet being transmitted
    * \param channelFreqMhz the frequency in MHz at which the packet is
@@ -1054,12 +1124,14 @@
    * \param channelNumber the channel on which the packet is transmitted
    * \param rate the PHY data rate in units of 500kbps (i.e., the same
    *        units used both for the radiotap and for the prism header)
-   * \param isShortPreamble true if short preamble is used, false otherwise
-   * \param txPower the transmission power in dBm
+   * \param preamble the preamble of the packet
+   * \param txVector the TXVECTOR that holds tx parameters
+   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
+   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
    */
   void NotifyMonitorSniffTx (Ptr<const Packet> packet, uint16_t channelFreqMhz,
-                             uint16_t channelNumber, uint32_t rate,
-                             bool isShortPreamble, uint8_t txPower);
+                             uint16_t channelNumber, uint32_t rate, WifiPreamble preamble,
+                             WifiTxVector txVector, struct mpduInfo aMpdu);
 
   /**
    * TracedCallback signature for monitor mode transmit events.
@@ -1070,91 +1142,92 @@
    * \param channelNumber the channel on which the packet is transmitted
    * \param rate the PHY data rate in units of 500kbps (i.e., the same
    *        units used both for the radiotap and for the prism header)
-   * \param isShortPreamble true if short preamble is used, false otherwise
-   * \param txPower the transmission power in dBm
+   * \param preamble the preamble of the packet
+   * \param txVector the TXVECTOR that holds tx parameters
+   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
+   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
+   * \todo WifiTxVector should be passed by const reference because
+   * of its size.
+   */
+  typedef void (* MonitorSnifferTxCallback)(const Ptr<const Packet> packet, uint16_t channelFreqMhz,
+                                            uint16_t channelNumber, uint32_t rate, WifiPreamble preamble,
+                                            WifiTxVector txVector, struct mpduInfo aMpdu);
+
+  /**
+   * 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
    */
-  typedef void (* MonitorSnifferTxCallback)
-    (const Ptr<const Packet> packet, uint16_t channelFreqMhz,
-     uint16_t channelNumber, uint32_t rate,
-     bool isShortPreamble, uint8_t txPower);
-
-
- /**
-  * 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
-  */
   virtual int64_t AssignStreams (int64_t stream) = 0;
 
   /**
    * \param freq the operating frequency on this node.
    */
-  virtual void SetFrequency (uint32_t freq)=0;
+  virtual void SetFrequency (uint32_t freq) = 0;
   /**
    * \return the operating frequency on this node
    */
-  virtual uint32_t GetFrequency (void) const=0;
+  virtual uint32_t GetFrequency (void) const = 0;
   /**
    * \param tx the number of transmitters on this node.
    */
-  virtual void SetNumberOfTransmitAntennas (uint32_t tx)=0;
-
+  virtual void SetNumberOfTransmitAntennas (uint32_t tx) = 0;
   /**
    * \return the number of transmit antenna on this device
    */
-  virtual uint32_t GetNumberOfTransmitAntennas (void) const=0;
-   /**
-   * \param rx the number of receivers on this node.
-   */
-  virtual void SetNumberOfReceiveAntennas (uint32_t rx)=0 ;
+  virtual uint32_t GetNumberOfTransmitAntennas (void) const = 0;
+  /**
+  * \param rx the number of receivers on this node.
+  */
+  virtual void SetNumberOfReceiveAntennas (uint32_t rx) = 0;
   /**
    * \return the number of receivers on this node.
    */
-  virtual uint32_t GetNumberOfReceiveAntennas (void) const=0;
+  virtual uint32_t GetNumberOfReceiveAntennas (void) const = 0;
   /**
    * \param guardInterval Enable or disable short guard interval
    */
-   virtual void SetGuardInterval (bool guardInterval)=0;
-   /**
-   *  \return true if short guard interval is supported, false otherwise
+  virtual void SetGuardInterval (bool guardInterval) = 0;
+  /**
+   * \return true if short guard interval is supported, false otherwise
    */
   virtual bool GetGuardInterval (void) const = 0;
   /**
    * \param ldpc Enable or disable LDPC
    */
-  virtual void SetLdpc (bool ldpc)=0;
+  virtual void SetLdpc (bool ldpc) = 0;
   /**
    * \return true if LDPC is supported, false otherwise
    */
-  virtual bool GetLdpc (void) const=0;
+  virtual bool GetLdpc (void) const = 0;
   /**
    * \param stbc Enable or disable STBC is supported
    */
-  virtual void SetStbc (bool stbc)=0;
+  virtual void SetStbc (bool stbc) = 0;
   /**
    *  \return true if STBC is supported, false otherwise
    */
-  virtual bool GetStbc (void) const=0;
-   
+  virtual bool GetStbc (void) const = 0;
   /**
    * \param greenfield Enable or disable GreenField
    */
-  virtual void SetGreenfield (bool greenfield)=0;
+  virtual void SetGreenfield (bool greenfield) = 0;
   /**
    * \return true if Greenfield is supported, false otherwise
    */
-  virtual bool GetGreenfield (void) const=0;
+  virtual bool GetGreenfield (void) const = 0;
   /**
-   * \return true if channel bonding 40 MHz is supported, false otherwise
+   * \return the channel width
    */
-  virtual bool GetChannelBonding (void) const = 0;
+  virtual uint32_t GetChannelWidth (void) const = 0;
   /**
-   *  \param channelbonding Enable or disable channel bonding
+   * \param channelwidth channel width
    */
-  virtual void SetChannelBonding (bool channelbonding) = 0 ;
+  virtual void SetChannelWidth (uint32_t channelwidth) = 0;
+
 
 private:
   /**
@@ -1213,8 +1286,12 @@
    * ieee80211_input_monitor()
    *
    * \see class CallBackTraceSource
+   * \todo WifiTxVector and signalNoiseDbm should be be passed as
+   * const  references because of their sizes.
    */
-  TracedCallback<Ptr<const Packet>, uint16_t, uint16_t, uint32_t, bool, double, double> m_phyMonitorSniffRxTrace;
+  TracedCallback<Ptr<const Packet>, uint16_t, uint16_t, uint32_t,
+                 WifiPreamble, WifiTxVector,
+                 struct mpduInfo, struct signalNoiseDbm> m_phyMonitorSniffRxTrace;
 
   /**
    * A trace source that emulates a wifi device in monitor mode
@@ -1225,9 +1302,13 @@
    * ieee80211_input_monitor()
    *
    * \see class CallBackTraceSource
+   * \todo WifiTxVector should be passed by const reference because
+   * of its size.
    */
-  TracedCallback<Ptr<const Packet>, uint16_t, uint16_t, uint32_t, bool,uint8_t> m_phyMonitorSniffTxTrace;
-    
+  TracedCallback<Ptr<const Packet>, uint16_t, uint16_t, uint32_t,
+                 WifiPreamble, WifiTxVector,
+                 struct mpduInfo> m_phyMonitorSniffTxTrace;
+
   uint32_t m_totalAmpduNumSymbols; //!< Number of symbols previously transmitted for the MPDUs in an A-MPDU, used for the computation of the number of symbols needed for the last MPDU in the A-MPDU
   uint32_t m_totalAmpduSize;       //!< Total size of the previously transmitted MPDUs in an A-MPDU, used for the computation of the number of symbols needed for the last MPDU in the A-MPDU
 };
@@ -1239,6 +1320,6 @@
  */
 std::ostream& operator<< (std::ostream& os, enum WifiPhy::State state);
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* WIFI_PHY_H */
diff -Naur ns-3.23/src/wifi/model/wifi-phy-standard.h ns-3.24/src/wifi/model/wifi-phy-standard.h
--- ns-3.23/src/wifi/model/wifi-phy-standard.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-phy-standard.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,12 +17,12 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef WIFI_PHY_STANDARD_H
 #define WIFI_PHY_STANDARD_H
 
 namespace ns3 {
 
-
 /**
  * \ingroup wifi
  * Identifies the PHY specification that a Wifi device is configured to use.
@@ -45,12 +45,14 @@
    *  ACM MOBICOM, 2001.
    */
   WIFI_PHY_STANDARD_holland,
-  // 11n support
+  /** HT OFDM PHY for the 2.4 GHz band (clause 20) */
   WIFI_PHY_STANDARD_80211n_2_4GHZ,
-  // needed for different mac parameters
-  WIFI_PHY_STANDARD_80211n_5GHZ
+  /** HT OFDM PHY for the 5 GHz band (clause 20) */
+  WIFI_PHY_STANDARD_80211n_5GHZ,
+  /** VHT OFDM PHY (clause 22) */
+  WIFI_PHY_STANDARD_80211ac
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* WIFI_PHY_STANDARD_H */
diff -Naur ns-3.23/src/wifi/model/wifi-phy-state-helper.cc ns-3.24/src/wifi/model/wifi-phy-state-helper.cc
--- ns-3.23/src/wifi/model/wifi-phy-state-helper.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-phy-state-helper.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "wifi-phy-state-helper.h"
 #include "ns3/log.h"
 #include "ns3/simulator.h"
@@ -47,7 +48,7 @@
     .AddTraceSource ("RxError",
                      "A packet has been received unsuccessfully.",
                      MakeTraceSourceAccessor (&WifiPhyStateHelper::m_rxErrorTrace),
-                     "ns3::WifiPhyStateHelper::RxErrorTracedCallback")
+                     "ns3::WifiPhyStateHelper::RxEndErrorTracedCallback")
     .AddTraceSource ("Tx", "Packet transmission is starting.",
                      MakeTraceSourceAccessor (&WifiPhyStateHelper::m_txTrace),
                      "ns3::WifiPhyStateHelper::TxTracedCallback")
@@ -77,23 +78,26 @@
 {
   m_rxOkCallback = callback;
 }
+
 void
 WifiPhyStateHelper::SetReceiveErrorCallback (WifiPhy::RxErrorCallback callback)
 {
   m_rxErrorCallback = callback;
 }
+
 void
 WifiPhyStateHelper::RegisterListener (WifiPhyListener *listener)
 {
   m_listeners.push_back (listener);
 }
+
 void
 WifiPhyStateHelper::UnregisterListener (WifiPhyListener *listener)
 {
-  ListenersI i = find (m_listeners.begin(), m_listeners.end(), listener);
-  if (i != m_listeners.end())
+  ListenersI i = find (m_listeners.begin (), m_listeners.end (), listener);
+  if (i != m_listeners.end ())
     {
-      m_listeners.erase(i);
+      m_listeners.erase (i);
     }
 }
 
@@ -102,39 +106,43 @@
 {
   return (GetState () == WifiPhy::IDLE);
 }
+
 bool
 WifiPhyStateHelper::IsStateBusy (void)
 {
   return (GetState () != WifiPhy::IDLE);
 }
+
 bool
 WifiPhyStateHelper::IsStateCcaBusy (void)
 {
   return (GetState () == WifiPhy::CCA_BUSY);
 }
+
 bool
 WifiPhyStateHelper::IsStateRx (void)
 {
   return (GetState () == WifiPhy::RX);
 }
+
 bool
 WifiPhyStateHelper::IsStateTx (void)
 {
   return (GetState () == WifiPhy::TX);
 }
+
 bool
 WifiPhyStateHelper::IsStateSwitching (void)
 {
   return (GetState () == WifiPhy::SWITCHING);
 }
+
 bool
 WifiPhyStateHelper::IsStateSleep (void)
 {
   return (GetState () == WifiPhy::SLEEP);
 }
 
-
-
 Time
 WifiPhyStateHelper::GetStateDuration (void)
 {
@@ -211,7 +219,6 @@
     }
 }
 
-
 void
 WifiPhyStateHelper::NotifyTxStart (Time duration, double txPowerDbm)
 {
@@ -220,6 +227,7 @@
       (*i)->NotifyTxStart (duration, txPowerDbm);
     }
 }
+
 void
 WifiPhyStateHelper::NotifyRxStart (Time duration)
 {
@@ -228,6 +236,7 @@
       (*i)->NotifyRxStart (duration);
     }
 }
+
 void
 WifiPhyStateHelper::NotifyRxEndOk (void)
 {
@@ -236,6 +245,7 @@
       (*i)->NotifyRxEndOk ();
     }
 }
+
 void
 WifiPhyStateHelper::NotifyRxEndError (void)
 {
@@ -244,6 +254,7 @@
       (*i)->NotifyRxEndError ();
     }
 }
+
 void
 WifiPhyStateHelper::NotifyMaybeCcaBusyStart (Time duration)
 {
@@ -252,6 +263,7 @@
       (*i)->NotifyMaybeCcaBusyStart (duration);
     }
 }
+
 void
 WifiPhyStateHelper::NotifySwitchingStart (Time duration)
 {
@@ -260,6 +272,7 @@
       (*i)->NotifySwitchingStart (duration);
     }
 }
+
 void
 WifiPhyStateHelper::NotifySleep (void)
 {
@@ -268,6 +281,7 @@
       (*i)->NotifySleep ();
     }
 }
+
 void
 WifiPhyStateHelper::NotifyWakeup (void)
 {
@@ -277,7 +291,6 @@
     }
 }
 
-
 void
 WifiPhyStateHelper::LogPreviousIdleAndCcaBusyStates (void)
 {
@@ -302,7 +315,7 @@
 WifiPhyStateHelper::SwitchToTx (Time txDuration, Ptr<const Packet> packet, double txPowerDbm,
                                 WifiTxVector txVector, WifiPreamble preamble)
 {
-  m_txTrace (packet, txVector.GetMode(), preamble, txVector.GetTxPowerLevel());
+  m_txTrace (packet, txVector.GetMode (), preamble, txVector.GetTxPowerLevel ());
   Time now = Simulator::Now ();
   switch (GetState ())
     {
@@ -336,6 +349,7 @@
   m_startTx = now;
   NotifyTxStart (txDuration, txPowerDbm);
 }
+
 void
 WifiPhyStateHelper::SwitchToRx (Time rxDuration)
 {
@@ -417,7 +431,7 @@
 void
 WifiPhyStateHelper::SwitchFromRxEndOk (Ptr<Packet> packet, double snr, WifiTxVector txVector, enum WifiPreamble preamble)
 {
-  m_rxOkTrace (packet, snr, txVector.GetMode(), preamble);
+  m_rxOkTrace (packet, snr, txVector.GetMode (), preamble);
   NotifyRxEndOk ();
   DoSwitchFromRx ();
   if (!m_rxOkCallback.IsNull ())
@@ -426,6 +440,7 @@
     }
 
 }
+
 void
 WifiPhyStateHelper::SwitchFromRxEndError (Ptr<const Packet> packet, double snr)
 {
@@ -451,6 +466,7 @@
 
   NS_ASSERT (IsStateIdle () || IsStateCcaBusy ());
 }
+
 void
 WifiPhyStateHelper::SwitchMaybeToCcaBusy (Time duration)
 {
@@ -478,6 +494,7 @@
     }
   m_endCcaBusy = std::max (m_endCcaBusy, now + duration);
 }
+
 void
 WifiPhyStateHelper::SwitchToSleep (void)
 {
@@ -507,6 +524,7 @@
   NotifySleep ();
   NS_ASSERT (IsStateSleep ());
 }
+
 void
 WifiPhyStateHelper::SwitchFromSleep (Time duration)
 {
@@ -516,10 +534,12 @@
   m_previousStateChangeTime = now;
   m_sleeping = false;
   NotifyWakeup ();
-  // update m_endCcaBusy after the sleep period
+  //update m_endCcaBusy after the sleep period
   m_endCcaBusy = std::max (m_endCcaBusy, now + duration);
   if (m_endCcaBusy > now)
-    NotifyMaybeCcaBusyStart (m_endCcaBusy - now);
+    {
+      NotifyMaybeCcaBusyStart (m_endCcaBusy - now);
+    }
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-phy-state-helper.h ns-3.24/src/wifi/model/wifi-phy-state-helper.h
--- ns-3.23/src/wifi/model/wifi-phy-state-helper.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-phy-state-helper.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef WIFI_PHY_STATE_HELPER_H
 #define WIFI_PHY_STATE_HELPER_H
 
@@ -186,7 +187,7 @@
   void SwitchFromSleep (Time duration);
 
   /** \todo Why is this public? */
-  TracedCallback<Time,Time,enum WifiPhy::State> m_stateLogger;
+  TracedCallback<Time, Time, enum WifiPhy::State> m_stateLogger;
 
   /**
    * TracedCallback signature for state changes.
@@ -197,19 +198,18 @@
    * \param [in] state The state.
    */
   typedef void (* StateTracedCallback)
-    (const Time start, const Time duration, const WifiPhy::State state);
+    (Time start, Time duration, WifiPhy::State state);
 
   /**
    * TracedCallback signature for receive end ok event.
    *
    * \param [in] packet The received packet.
    * \param [in] snr    The SNR of the received packet.
-   * \param [in] mode   The transmission mode of the packet.   
+   * \param [in] mode   The transmission mode of the packet.
    * \param [in] preamble The preamble of the packet.
    */
   typedef void (* RxOkTracedCallback)
-    (const Ptr<const Packet> packet, const double snr,
-     const WifiMode mode, const WifiPreamble preamble);
+    (Ptr<const Packet> packet, double snr, WifiMode mode, WifiPreamble preamble);
 
   /**
    * TracedCallback signature for receive end error event.
@@ -218,21 +218,21 @@
    * \param [in] snr    The SNR of the received packet.
    */
   typedef void (* RxEndErrorTracedCallback)
-    (const Ptr<const Packet> packet, const double snr);
+    (Ptr<const Packet> packet, double snr);
 
   /**
    * TracedCallback signature for transmit event.
    *
    * \param [in] packet The received packet.
-   * \param [in] mode   The transmission mode of the packet.   
+   * \param [in] mode   The transmission mode of the packet.
    * \param [in] preamble The preamble of the packet.
    * \param [in] power  The transmit power level.
    */
   typedef void (* TxTracedCallback)
-    (const Ptr<const Packet> packet, const WifiMode mode,
-     const WifiPreamble preamble, const uint8_t power);
-     
-                
+    (Ptr<const Packet> packet, WifiMode mode,
+     WifiPreamble preamble, uint8_t power);
+
+
 private:
   /**
    * typedef for a list of WifiPhyListeners
@@ -313,6 +313,6 @@
   WifiPhy::RxErrorCallback m_rxErrorCallback;
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* WIFI_PHY_STATE_HELPER_H */
diff -Naur ns-3.23/src/wifi/model/wifi-preamble.h ns-3.24/src/wifi/model/wifi-preamble.h
--- ns-3.23/src/wifi/model/wifi-preamble.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-preamble.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef WIFI_PREAMBLE_H
 #define WIFI_PREAMBLE_H
 
@@ -32,9 +33,10 @@
   WIFI_PREAMBLE_SHORT,
   WIFI_PREAMBLE_HT_MF,
   WIFI_PREAMBLE_HT_GF,
+  WIFI_PREAMBLE_VHT,
   WIFI_PREAMBLE_NONE
 };
 
-} // namespace ns3
+} //namespace ns3
 
 #endif /* WIFI_PREAMBLE_H */
diff -Naur ns-3.23/src/wifi/model/wifi-radio-energy-model.cc ns-3.24/src/wifi/model/wifi-radio-energy-model.cc
--- ns-3.23/src/wifi/model/wifi-radio-energy-model.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/model/wifi-radio-energy-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,572 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
+ *
+ * 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: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
+ */
+
+#include "ns3/log.h"
+#include "ns3/double.h"
+#include "ns3/simulator.h"
+#include "ns3/trace-source-accessor.h"
+#include "ns3/pointer.h"
+#include "ns3/energy-source.h"
+#include "wifi-radio-energy-model.h"
+#include "wifi-tx-current-model.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("WifiRadioEnergyModel");
+
+NS_OBJECT_ENSURE_REGISTERED (WifiRadioEnergyModel);
+
+TypeId
+WifiRadioEnergyModel::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::WifiRadioEnergyModel")
+    .SetParent<DeviceEnergyModel> ()
+    .SetGroupName ("Energy")
+    .AddConstructor<WifiRadioEnergyModel> ()
+    .AddAttribute ("IdleCurrentA",
+                   "The default radio Idle current in Ampere.",
+                   DoubleValue (0.273),  // idle mode = 273mA
+                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetIdleCurrentA,
+                                       &WifiRadioEnergyModel::GetIdleCurrentA),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("CcaBusyCurrentA",
+                   "The default radio CCA Busy State current in Ampere.",
+                   DoubleValue (0.273),  // default to be the same as idle mode
+                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetCcaBusyCurrentA,
+                                       &WifiRadioEnergyModel::GetCcaBusyCurrentA),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("TxCurrentA",
+                   "The radio Tx current in Ampere.",
+                   DoubleValue (0.380),    // transmit at 0dBm = 380mA
+                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetTxCurrentA,
+                                       &WifiRadioEnergyModel::GetTxCurrentA),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("RxCurrentA",
+                   "The radio Rx current in Ampere.",
+                   DoubleValue (0.313),    // receive mode = 313mA
+                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetRxCurrentA,
+                                       &WifiRadioEnergyModel::GetRxCurrentA),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("SwitchingCurrentA",
+                   "The default radio Channel Switch current in Ampere.",
+                   DoubleValue (0.273),  // default to be the same as idle mode
+                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetSwitchingCurrentA,
+                                       &WifiRadioEnergyModel::GetSwitchingCurrentA),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("SleepCurrentA",
+                   "The radio Sleep current in Ampere.",
+                   DoubleValue (0.033),  // sleep mode = 33mA
+                   MakeDoubleAccessor (&WifiRadioEnergyModel::SetSleepCurrentA,
+                                       &WifiRadioEnergyModel::GetSleepCurrentA),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("TxCurrentModel", "A pointer to the attached tx current model.",
+                   PointerValue (),
+                   MakePointerAccessor (&WifiRadioEnergyModel::m_txCurrentModel),
+                   MakePointerChecker<WifiTxCurrentModel> ())
+    .AddTraceSource ("TotalEnergyConsumption",
+                     "Total energy consumption of the radio device.",
+                     MakeTraceSourceAccessor (&WifiRadioEnergyModel::m_totalEnergyConsumption),
+                     "ns3::TracedValueCallback::Double")
+  ; 
+  return tid;
+}
+
+WifiRadioEnergyModel::WifiRadioEnergyModel ()
+{
+  NS_LOG_FUNCTION (this);
+  m_currentState = WifiPhy::IDLE;  // initially IDLE
+  m_lastUpdateTime = Seconds (0.0);
+  m_nPendingChangeState = 0;
+  m_isSupersededChangeState = false;
+  m_energyDepletionCallback.Nullify ();
+  m_source = NULL;
+  // set callback for WifiPhy listener
+  m_listener = new WifiRadioEnergyModelPhyListener;
+  m_listener->SetChangeStateCallback (MakeCallback (&DeviceEnergyModel::ChangeState, this));
+  // set callback for updating the tx current
+  m_listener->SetUpdateTxCurrentCallback (MakeCallback (&WifiRadioEnergyModel::SetTxCurrentFromModel, this));
+}
+
+WifiRadioEnergyModel::~WifiRadioEnergyModel ()
+{
+  NS_LOG_FUNCTION (this);
+  delete m_listener;
+}
+
+void
+WifiRadioEnergyModel::SetEnergySource (Ptr<EnergySource> source)
+{
+  NS_LOG_FUNCTION (this << source);
+  NS_ASSERT (source != NULL);
+  m_source = source;
+}
+
+double
+WifiRadioEnergyModel::GetTotalEnergyConsumption (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_totalEnergyConsumption;
+}
+
+double
+WifiRadioEnergyModel::GetIdleCurrentA (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_idleCurrentA;
+}
+
+void
+WifiRadioEnergyModel::SetIdleCurrentA (double idleCurrentA)
+{
+  NS_LOG_FUNCTION (this << idleCurrentA);
+  m_idleCurrentA = idleCurrentA;
+}
+
+double
+WifiRadioEnergyModel::GetCcaBusyCurrentA (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_ccaBusyCurrentA;
+}
+
+void
+WifiRadioEnergyModel::SetCcaBusyCurrentA (double CcaBusyCurrentA)
+{
+  NS_LOG_FUNCTION (this << CcaBusyCurrentA);
+  m_ccaBusyCurrentA = CcaBusyCurrentA;
+}
+
+double
+WifiRadioEnergyModel::GetTxCurrentA (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_txCurrentA;
+}
+
+void
+WifiRadioEnergyModel::SetTxCurrentA (double txCurrentA)
+{
+  NS_LOG_FUNCTION (this << txCurrentA);
+  m_txCurrentA = txCurrentA;
+}
+
+double
+WifiRadioEnergyModel::GetRxCurrentA (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_rxCurrentA;
+}
+
+void
+WifiRadioEnergyModel::SetRxCurrentA (double rxCurrentA)
+{
+  NS_LOG_FUNCTION (this << rxCurrentA);
+  m_rxCurrentA = rxCurrentA;
+}
+
+double
+WifiRadioEnergyModel::GetSwitchingCurrentA (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_switchingCurrentA;
+}
+
+void
+WifiRadioEnergyModel::SetSwitchingCurrentA (double switchingCurrentA)
+{
+  NS_LOG_FUNCTION (this << switchingCurrentA);
+  m_switchingCurrentA = switchingCurrentA;
+}
+
+double
+WifiRadioEnergyModel::GetSleepCurrentA (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_sleepCurrentA;
+}
+
+void
+WifiRadioEnergyModel::SetSleepCurrentA (double sleepCurrentA)
+{
+  NS_LOG_FUNCTION (this << sleepCurrentA);
+  m_sleepCurrentA = sleepCurrentA;
+}
+
+WifiPhy::State
+WifiRadioEnergyModel::GetCurrentState (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_currentState;
+}
+
+void
+WifiRadioEnergyModel::SetEnergyDepletionCallback (
+  WifiRadioEnergyDepletionCallback callback)
+{
+  NS_LOG_FUNCTION (this);
+  if (callback.IsNull ())
+    {
+      NS_LOG_DEBUG ("WifiRadioEnergyModel:Setting NULL energy depletion callback!");
+    }
+  m_energyDepletionCallback = callback;
+}
+
+void
+WifiRadioEnergyModel::SetEnergyRechargedCallback (
+  WifiRadioEnergyRechargedCallback callback)
+{
+  NS_LOG_FUNCTION (this);
+  if (callback.IsNull ())
+    {
+      NS_LOG_DEBUG ("WifiRadioEnergyModel:Setting NULL energy recharged callback!");
+    }
+  m_energyRechargedCallback = callback;
+}
+
+void
+WifiRadioEnergyModel::SetTxCurrentModel (Ptr<WifiTxCurrentModel> model)
+{
+  m_txCurrentModel = model;
+}
+
+void
+WifiRadioEnergyModel::SetTxCurrentFromModel (double txPowerDbm)
+{
+  if (m_txCurrentModel)
+    {
+      m_txCurrentA = m_txCurrentModel->CalcTxCurrent (txPowerDbm);
+    }
+}
+
+void
+WifiRadioEnergyModel::ChangeState (int newState)
+{
+  NS_LOG_FUNCTION (this << newState);
+
+  Time duration = Simulator::Now () - m_lastUpdateTime;
+  NS_ASSERT (duration.GetNanoSeconds () >= 0); // check if duration is valid
+
+  // energy to decrease = current * voltage * time
+  double energyToDecrease = 0.0;
+  double supplyVoltage = m_source->GetSupplyVoltage ();
+  switch (m_currentState)
+    {
+    case WifiPhy::IDLE:
+      energyToDecrease = duration.GetSeconds () * m_idleCurrentA * supplyVoltage;
+      break;
+    case WifiPhy::CCA_BUSY:
+      energyToDecrease = duration.GetSeconds () * m_ccaBusyCurrentA * supplyVoltage;
+      break;
+    case WifiPhy::TX:
+      energyToDecrease = duration.GetSeconds () * m_txCurrentA * supplyVoltage;
+      break;
+    case WifiPhy::RX:
+      energyToDecrease = duration.GetSeconds () * m_rxCurrentA * supplyVoltage;
+      break;
+    case WifiPhy::SWITCHING:
+      energyToDecrease = duration.GetSeconds () * m_switchingCurrentA * supplyVoltage;
+      break;
+    case WifiPhy::SLEEP:
+      energyToDecrease = duration.GetSeconds () * m_sleepCurrentA * supplyVoltage;
+      break;
+    default:
+      NS_FATAL_ERROR ("WifiRadioEnergyModel:Undefined radio state: " << m_currentState);
+    }
+
+  // update total energy consumption
+  m_totalEnergyConsumption += energyToDecrease;
+
+  // update last update time stamp
+  m_lastUpdateTime = Simulator::Now ();
+
+  m_nPendingChangeState++;
+
+  // notify energy source
+  m_source->UpdateEnergySource ();
+
+  // in case the energy source is found to be depleted during the last update, a callback might be
+  // invoked that might cause a change in the Wifi PHY state (e.g., the PHY is put into SLEEP mode).
+  // This in turn causes a new call to this member function, with the consequence that the previous
+  // instance is resumed after the termination of the new instance. In particular, the state set
+  // by the previous instance is erroneously the final state stored in m_currentState. The check below
+  // ensures that previous instances do not change m_currentState.
+
+  if (!m_isSupersededChangeState)
+    {
+      // update current state & last update time stamp
+      SetWifiRadioState ((WifiPhy::State) newState);
+
+      // some debug message
+      NS_LOG_DEBUG ("WifiRadioEnergyModel:Total energy consumption is " <<
+                    m_totalEnergyConsumption << "J");
+    }
+
+  m_isSupersededChangeState = (m_nPendingChangeState > 1);
+
+  m_nPendingChangeState--;
+}
+
+void
+WifiRadioEnergyModel::HandleEnergyDepletion (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_DEBUG ("WifiRadioEnergyModel:Energy is depleted!");
+  // invoke energy depletion callback, if set.
+  if (!m_energyDepletionCallback.IsNull ())
+    {
+      m_energyDepletionCallback ();
+    }
+}
+
+void
+WifiRadioEnergyModel::HandleEnergyRecharged (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_DEBUG ("WifiRadioEnergyModel:Energy is recharged!");
+  // invoke energy recharged callback, if set.
+  if (!m_energyRechargedCallback.IsNull ())
+    {
+      m_energyRechargedCallback ();
+    }
+}
+
+WifiRadioEnergyModelPhyListener *
+WifiRadioEnergyModel::GetPhyListener (void)
+{
+  NS_LOG_FUNCTION (this);
+  return m_listener;
+}
+
+/*
+ * Private functions start here.
+ */
+
+void
+WifiRadioEnergyModel::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_source = NULL;
+  m_energyDepletionCallback.Nullify ();
+}
+
+double
+WifiRadioEnergyModel::DoGetCurrentA (void) const
+{
+  NS_LOG_FUNCTION (this);
+  switch (m_currentState)
+    {
+    case WifiPhy::IDLE:
+      return m_idleCurrentA;
+    case WifiPhy::CCA_BUSY:
+      return m_ccaBusyCurrentA;
+    case WifiPhy::TX:
+      return m_txCurrentA;
+    case WifiPhy::RX:
+      return m_rxCurrentA;
+    case WifiPhy::SWITCHING:
+      return m_switchingCurrentA;
+    case WifiPhy::SLEEP:
+      return m_sleepCurrentA;
+    default:
+      NS_FATAL_ERROR ("WifiRadioEnergyModel:Undefined radio state:" << m_currentState);
+    }
+}
+
+void
+WifiRadioEnergyModel::SetWifiRadioState (const WifiPhy::State state)
+{
+  NS_LOG_FUNCTION (this << state);
+  m_currentState = state;
+  std::string stateName;
+  switch (state)
+    {
+    case WifiPhy::IDLE:
+      stateName = "IDLE";
+      break;
+    case WifiPhy::CCA_BUSY:
+      stateName = "CCA_BUSY";
+      break;
+    case WifiPhy::TX:
+      stateName = "TX";
+      break;
+    case WifiPhy::RX:
+      stateName = "RX";
+      break;
+    case WifiPhy::SWITCHING:
+      stateName = "SWITCHING";
+      break;
+    case WifiPhy::SLEEP:
+      stateName = "SLEEP";
+      break;
+    }
+  NS_LOG_DEBUG ("WifiRadioEnergyModel:Switching to state: " << stateName <<
+                " at time = " << Simulator::Now ());
+}
+
+// -------------------------------------------------------------------------- //
+
+WifiRadioEnergyModelPhyListener::WifiRadioEnergyModelPhyListener ()
+{
+  NS_LOG_FUNCTION (this);
+  m_changeStateCallback.Nullify ();
+  m_updateTxCurrentCallback.Nullify ();
+}
+
+WifiRadioEnergyModelPhyListener::~WifiRadioEnergyModelPhyListener ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+WifiRadioEnergyModelPhyListener::SetChangeStateCallback (DeviceEnergyModel::ChangeStateCallback callback)
+{
+  NS_LOG_FUNCTION (this << &callback);
+  NS_ASSERT (!callback.IsNull ());
+  m_changeStateCallback = callback;
+}
+
+void
+WifiRadioEnergyModelPhyListener::SetUpdateTxCurrentCallback (UpdateTxCurrentCallback callback)
+{
+  NS_LOG_FUNCTION (this << &callback);
+  NS_ASSERT (!callback.IsNull ());
+  m_updateTxCurrentCallback = callback;
+}
+
+void
+WifiRadioEnergyModelPhyListener::NotifyRxStart (Time duration)
+{
+  NS_LOG_FUNCTION (this << duration);
+  if (m_changeStateCallback.IsNull ())
+    {
+      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
+    }
+  m_changeStateCallback (WifiPhy::RX);
+  m_switchToIdleEvent.Cancel ();
+}
+
+void
+WifiRadioEnergyModelPhyListener::NotifyRxEndOk (void)
+{
+  NS_LOG_FUNCTION (this);
+  if (m_changeStateCallback.IsNull ())
+    {
+      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
+    }
+  m_changeStateCallback (WifiPhy::IDLE);
+}
+
+void
+WifiRadioEnergyModelPhyListener::NotifyRxEndError (void)
+{
+  NS_LOG_FUNCTION (this);
+  if (m_changeStateCallback.IsNull ())
+    {
+      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
+    }
+  m_changeStateCallback (WifiPhy::IDLE);
+}
+
+void
+WifiRadioEnergyModelPhyListener::NotifyTxStart (Time duration, double txPowerDbm)
+{
+  NS_LOG_FUNCTION (this << duration << txPowerDbm);
+  if (m_updateTxCurrentCallback.IsNull ())
+    {
+      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Update tx current callback not set!");
+    }
+  m_updateTxCurrentCallback (txPowerDbm);
+  if (m_changeStateCallback.IsNull ())
+    {
+      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
+    }
+  m_changeStateCallback (WifiPhy::TX);
+  // schedule changing state back to IDLE after TX duration
+  m_switchToIdleEvent.Cancel ();
+  m_switchToIdleEvent = Simulator::Schedule (duration, &WifiRadioEnergyModelPhyListener::SwitchToIdle, this);
+}
+
+void
+WifiRadioEnergyModelPhyListener::NotifyMaybeCcaBusyStart (Time duration)
+{
+  NS_LOG_FUNCTION (this << duration);
+  if (m_changeStateCallback.IsNull ())
+    {
+      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
+    }
+  m_changeStateCallback (WifiPhy::CCA_BUSY);
+  // schedule changing state back to IDLE after CCA_BUSY duration
+  m_switchToIdleEvent.Cancel ();
+  m_switchToIdleEvent = Simulator::Schedule (duration, &WifiRadioEnergyModelPhyListener::SwitchToIdle, this);
+}
+
+void
+WifiRadioEnergyModelPhyListener::NotifySwitchingStart (Time duration)
+{
+  NS_LOG_FUNCTION (this << duration);
+  if (m_changeStateCallback.IsNull ())
+    {
+      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
+    }
+  m_changeStateCallback (WifiPhy::SWITCHING);
+  // schedule changing state back to IDLE after CCA_BUSY duration
+  m_switchToIdleEvent.Cancel ();
+  m_switchToIdleEvent = Simulator::Schedule (duration, &WifiRadioEnergyModelPhyListener::SwitchToIdle, this);
+}
+
+void
+WifiRadioEnergyModelPhyListener::NotifySleep (void)
+{
+  NS_LOG_FUNCTION (this);
+  if (m_changeStateCallback.IsNull ())
+    {
+      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
+    }
+  m_changeStateCallback (WifiPhy::SLEEP);
+  m_switchToIdleEvent.Cancel ();
+}
+
+void
+WifiRadioEnergyModelPhyListener::NotifyWakeup(void)
+{
+  NS_LOG_FUNCTION (this);
+  if (m_changeStateCallback.IsNull ())
+    {
+      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
+    }
+  m_changeStateCallback (WifiPhy::IDLE);
+}
+
+/*
+ * Private function state here.
+ */
+
+void
+WifiRadioEnergyModelPhyListener::SwitchToIdle (void)
+{
+  NS_LOG_FUNCTION (this);
+  if (m_changeStateCallback.IsNull ())
+    {
+      NS_FATAL_ERROR ("WifiRadioEnergyModelPhyListener:Change state callback not set!");
+    }
+  m_changeStateCallback (WifiPhy::IDLE);
+}
+
+} // namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-radio-energy-model.h ns-3.24/src/wifi/model/wifi-radio-energy-model.h
--- ns-3.23/src/wifi/model/wifi-radio-energy-model.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/model/wifi-radio-energy-model.h	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,363 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 Network Security Lab, University of Washington, Seattle.
+ *
+ * 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: Sidharth Nabar <snabar@uw.edu>, He Wu <mdzz@u.washington.edu>
+ */
+
+#ifndef WIFI_RADIO_ENERGY_MODEL_H
+#define WIFI_RADIO_ENERGY_MODEL_H
+
+#include "ns3/device-energy-model.h"
+#include "ns3/nstime.h"
+#include "ns3/event-id.h"
+#include "ns3/traced-value.h"
+#include "ns3/wifi-phy.h"
+
+namespace ns3 {
+
+class WifiTxCurrentModel;
+
+/**
+ * \ingroup energy
+ * A WifiPhy listener class for notifying the WifiRadioEnergyModel of Wifi radio
+ * state change.
+ *
+ */
+class WifiRadioEnergyModelPhyListener : public WifiPhyListener
+{
+public:
+  /**
+   * Callback type for updating the transmit current based on the nominal tx power.
+   */
+  typedef Callback<void, double> UpdateTxCurrentCallback;
+
+  WifiRadioEnergyModelPhyListener ();
+  virtual ~WifiRadioEnergyModelPhyListener ();
+
+  /**
+   * \brief Sets the change state callback. Used by helper class.
+   *
+   * \param callback Change state callback.
+   */
+  void SetChangeStateCallback (DeviceEnergyModel::ChangeStateCallback callback);
+
+  /**
+   * \brief Sets the update tx current callback.
+   *
+   * \param callback Update tx current callback.
+   */
+  void SetUpdateTxCurrentCallback (UpdateTxCurrentCallback callback);
+
+  /**
+   * \brief Switches the WifiRadioEnergyModel to RX state.
+   *
+   * \param duration the expected duration of the packet reception.
+   *
+   * Defined in ns3::WifiPhyListener
+   */
+  virtual void NotifyRxStart (Time duration);
+
+  /**
+   * \brief Switches the WifiRadioEnergyModel back to IDLE state.
+   *
+   * Defined in ns3::WifiPhyListener
+   *
+   * Note that for the WifiRadioEnergyModel, the behavior of the function is the
+   * same as NotifyRxEndError.
+   */
+  virtual void NotifyRxEndOk (void);
+
+  /**
+   * \brief Switches the WifiRadioEnergyModel back to IDLE state.
+   *
+   * Defined in ns3::WifiPhyListener
+   *
+   * Note that for the WifiRadioEnergyModel, the behavior of the function is the
+   * same as NotifyRxEndOk.
+   */
+  virtual void NotifyRxEndError (void);
+
+  /**
+   * \brief Switches the WifiRadioEnergyModel to TX state and switches back to
+   * IDLE after TX duration.
+   *
+   * \param duration the expected transmission duration.
+   * \param txPowerDbm the nominal tx power in dBm
+   *
+   * Defined in ns3::WifiPhyListener
+   */
+  virtual void NotifyTxStart (Time duration, double txPowerDbm);
+
+  /**
+   * \param duration the expected busy duration.
+   *
+   * Defined in ns3::WifiPhyListener
+   */
+  virtual void NotifyMaybeCcaBusyStart (Time duration);
+
+  /**
+   * \param duration the expected channel switching duration.
+   *
+   * Defined in ns3::WifiPhyListener
+   */
+  virtual void NotifySwitchingStart (Time duration);
+
+  /**
+   * Defined in ns3::WifiPhyListener
+   */
+  virtual void NotifySleep (void);
+
+  /**
+   * Defined in ns3::WifiPhyListener
+   */
+  virtual void NotifyWakeup (void);
+
+private:
+  /**
+   * A helper function that makes scheduling m_changeStateCallback possible.
+   */
+  void SwitchToIdle (void);
+
+private:
+  /**
+   * Change state callback used to notify the WifiRadioEnergyModel of a state
+   * change.
+   */
+  DeviceEnergyModel::ChangeStateCallback m_changeStateCallback;
+
+  /**
+   * Callback used to update the tx current stored in WifiRadioEnergyModel based on 
+   * the nominal tx power used to transmit the current frame.
+   */
+  UpdateTxCurrentCallback m_updateTxCurrentCallback;
+
+  EventId m_switchToIdleEvent;
+};
+
+// -------------------------------------------------------------------------- //
+
+/**
+ * \ingroup energy
+ * \brief A WiFi radio energy model.
+ * 
+ * 4 states are defined for the radio: TX, RX, IDLE, SLEEP. Default state is
+ * IDLE.
+ * The different types of transactions that are defined are: 
+ *  1. Tx: State goes from IDLE to TX, radio is in TX state for TX_duration,
+ *     then state goes from TX to IDLE.
+ *  2. Rx: State goes from IDLE to RX, radio is in RX state for RX_duration,
+ *     then state goes from RX to IDLE.
+ *  3. Go_to_Sleep: State goes from IDLE to SLEEP.
+ *  4. End_of_Sleep: State goes from SLEEP to IDLE.
+ * The class keeps track of what state the radio is currently in.
+ *
+ * Energy calculation: For each transaction, this model notifies EnergySource
+ * object. The EnergySource object will query this model for the total current.
+ * Then the EnergySource object uses the total current to calculate energy.
+ *
+ * Default values for power consumption are based on measurements reported in:
+ * 
+ * Daniel Halperin, Ben Greenstein, Anmol Sheth, David Wetherall,
+ * "Demystifying 802.11n power consumption", Proceedings of HotPower'10 
+ * 
+ * Power consumption in Watts (single antenna):
+ * 
+ * \f$ P_{tx} = 1.14 \f$ (transmit at 0dBm)
+ * 
+ * \f$ P_{rx} = 0.94 \f$
+ * 
+ * \f$ P_{idle} = 0.82 \f$
+ * 
+ * \f$ P_{sleep} = 0.10 \f$
+ * 
+ * Hence, considering the default supply voltage of 3.0 V for the basic energy
+ * source, the default current values in Ampere are:
+ * 
+ * \f$ I_{tx} = 0.380 \f$
+ * 
+ * \f$ I_{rx} = 0.313 \f$
+ * 
+ * \f$ I_{idle} = 0.273 \f$
+ * 
+ * \f$ I_{sleep} = 0.033 \f$
+ * 
+ * The dependence of the power consumption in transmission mode on the nominal
+ * transmit power can also be achieved through a wifi tx current model.
+ *
+ */
+class WifiRadioEnergyModel : public DeviceEnergyModel
+{
+public:
+  /**
+   * Callback type for energy depletion handling.
+   */
+  typedef Callback<void> WifiRadioEnergyDepletionCallback;
+
+  /**
+   * Callback type for energy recharged handling.
+   */
+  typedef Callback<void> WifiRadioEnergyRechargedCallback;
+
+public:
+  static TypeId GetTypeId (void);
+  WifiRadioEnergyModel ();
+  virtual ~WifiRadioEnergyModel ();
+
+  /**
+   * \brief Sets pointer to EnergySouce installed on node.
+   *
+   * \param source Pointer to EnergySource installed on node.
+   *
+   * Implements DeviceEnergyModel::SetEnergySource.
+   */
+  virtual void SetEnergySource (Ptr<EnergySource> source);
+
+  /**
+   * \returns Total energy consumption of the wifi device.
+   *
+   * Implements DeviceEnergyModel::GetTotalEnergyConsumption.
+   */
+  virtual double GetTotalEnergyConsumption (void) const;
+
+  // Setter & getters for state power consumption.
+  double GetIdleCurrentA (void) const;
+  void SetIdleCurrentA (double idleCurrentA);
+  double GetCcaBusyCurrentA (void) const;
+  void SetCcaBusyCurrentA (double ccaBusyCurrentA);
+  double GetTxCurrentA (void) const;
+  void SetTxCurrentA (double txCurrentA);
+  double GetRxCurrentA (void) const;
+  void SetRxCurrentA (double rxCurrentA);
+  double GetSwitchingCurrentA (void) const;
+  void SetSwitchingCurrentA (double switchingCurrentA);
+  double GetSleepCurrentA (void) const;
+  void SetSleepCurrentA (double sleepCurrentA);
+
+  /**
+   * \returns Current state.
+   */
+  WifiPhy::State GetCurrentState (void) const;
+
+  /**
+   * \param callback Callback function.
+   *
+   * Sets callback for energy depletion handling.
+   */
+  void SetEnergyDepletionCallback (WifiRadioEnergyDepletionCallback callback);
+
+  /**
+   * \param callback Callback function.
+   *
+   * Sets callback for energy recharged handling.
+   */
+  void SetEnergyRechargedCallback (WifiRadioEnergyRechargedCallback callback);
+
+  /**
+   * \param model the model used to compute the wifi tx current.
+   */
+  void SetTxCurrentModel (Ptr<WifiTxCurrentModel> model);
+
+  /**
+   * \brief Calls the CalcTxCurrent method of the tx current model to
+   *        compute the tx current based on such model
+   * 
+   * \param txPowerDbm the nominal tx power in dBm
+   */
+  void SetTxCurrentFromModel (double txPowerDbm);
+
+  /**
+   * \brief Changes state of the WifiRadioEnergyMode.
+   *
+   * \param newState New state the wifi radio is in.
+   *
+   * Implements DeviceEnergyModel::ChangeState.
+   */
+  virtual void ChangeState (int newState);
+
+  /**
+   * \brief Handles energy depletion.
+   *
+   * Implements DeviceEnergyModel::HandleEnergyDepletion
+   */
+  virtual void HandleEnergyDepletion (void);
+
+  /**
+   * \brief Handles energy recharged.
+   *
+   * Implements DeviceEnergyModel::HandleEnergyRecharged
+   */
+  virtual void HandleEnergyRecharged (void);
+
+  /**
+   * \returns Pointer to the PHY listener.
+   */
+  WifiRadioEnergyModelPhyListener * GetPhyListener (void);
+
+
+private:
+  void DoDispose (void);
+
+  /**
+   * \returns Current draw of device, at current state.
+   *
+   * Implements DeviceEnergyModel::GetCurrentA.
+   */
+  virtual double DoGetCurrentA (void) const;
+
+  /**
+   * \param state New state the radio device is currently in.
+   *
+   * Sets current state. This function is private so that only the energy model
+   * can change its own state.
+   */
+  void SetWifiRadioState (const WifiPhy::State state);
+
+private:
+  Ptr<EnergySource> m_source;
+
+  // Member variables for current draw in different radio modes.
+  double m_txCurrentA;
+  double m_rxCurrentA;
+  double m_idleCurrentA;
+  double m_ccaBusyCurrentA;
+  double m_switchingCurrentA;
+  double m_sleepCurrentA;
+  Ptr<WifiTxCurrentModel> m_txCurrentModel;
+
+  // This variable keeps track of the total energy consumed by this model.
+  TracedValue<double> m_totalEnergyConsumption;
+
+  // State variables.
+  WifiPhy::State m_currentState;  // current state the radio is in
+  Time m_lastUpdateTime;          // time stamp of previous energy update
+
+  uint8_t m_nPendingChangeState;
+  bool m_isSupersededChangeState;
+
+  // Energy depletion callback
+  WifiRadioEnergyDepletionCallback m_energyDepletionCallback;
+
+  // Energy recharged callback
+  WifiRadioEnergyRechargedCallback m_energyRechargedCallback;
+
+  // WifiPhy listener
+  WifiRadioEnergyModelPhyListener *m_listener;
+};
+
+} // namespace ns3
+
+#endif /* WIFI_RADIO_ENERGY_MODEL_H */
diff -Naur ns-3.23/src/wifi/model/wifi-remote-station-manager.cc ns-3.24/src/wifi/model/wifi-remote-station-manager.cc
--- ns-3.23/src/wifi/model/wifi-remote-station-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-remote-station-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -64,46 +64,53 @@
 HighLatencyDataTxVectorTag::HighLatencyDataTxVectorTag ()
 {
 }
-HighLatencyDataTxVectorTag::HighLatencyDataTxVectorTag ( WifiTxVector dataTxVector)
+
+HighLatencyDataTxVectorTag::HighLatencyDataTxVectorTag (WifiTxVector dataTxVector)
   : m_dataTxVector (dataTxVector)
 {
 }
 
-WifiTxVector 
+WifiTxVector
 HighLatencyDataTxVectorTag::GetDataTxVector (void) const
 {
   return m_dataTxVector;
 }
+
 TypeId
 HighLatencyDataTxVectorTag::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::HighLatencyDataTxVectorTag")
     .SetParent<Tag> ()
     .SetGroupName ("Wifi")
-    .AddConstructor<HighLatencyDataTxVectorTag> ()  
-    ;
+    .AddConstructor<HighLatencyDataTxVectorTag> ()
+  ;
   return tid;
 }
+
 TypeId
 HighLatencyDataTxVectorTag::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
+
 uint32_t
 HighLatencyDataTxVectorTag::GetSerializedSize (void) const
 {
   return sizeof (WifiTxVector);
 }
+
 void
 HighLatencyDataTxVectorTag::Serialize (TagBuffer i) const
 {
   i.Write ((uint8_t *)&m_dataTxVector, sizeof (WifiTxVector));
 }
+
 void
 HighLatencyDataTxVectorTag::Deserialize (TagBuffer i)
 {
   i.Read ((uint8_t *)&m_dataTxVector, sizeof (WifiTxVector));
 }
+
 void
 HighLatencyDataTxVectorTag::Print (std::ostream &os) const
 {
@@ -134,46 +141,53 @@
 HighLatencyRtsTxVectorTag::HighLatencyRtsTxVectorTag ()
 {
 }
-HighLatencyRtsTxVectorTag::HighLatencyRtsTxVectorTag ( WifiTxVector rtsTxVector)
+
+HighLatencyRtsTxVectorTag::HighLatencyRtsTxVectorTag (WifiTxVector rtsTxVector)
   : m_rtsTxVector (rtsTxVector)
 {
 }
 
-WifiTxVector 
+WifiTxVector
 HighLatencyRtsTxVectorTag::GetRtsTxVector (void) const
 {
   return m_rtsTxVector;
 }
+
 TypeId
 HighLatencyRtsTxVectorTag::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::HighLatencyRtsTxVectorTag")
     .SetParent<Tag> ()
     .SetGroupName ("Wifi")
-    .AddConstructor<HighLatencyRtsTxVectorTag> ()  
-    ;
+    .AddConstructor<HighLatencyRtsTxVectorTag> ()
+  ;
   return tid;
 }
+
 TypeId
 HighLatencyRtsTxVectorTag::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
+
 uint32_t
 HighLatencyRtsTxVectorTag::GetSerializedSize (void) const
 {
   return sizeof (WifiTxVector);
 }
+
 void
 HighLatencyRtsTxVectorTag::Serialize (TagBuffer i) const
 {
   i.Write ((uint8_t *)&m_rtsTxVector, sizeof (WifiTxVector));
 }
+
 void
 HighLatencyRtsTxVectorTag::Deserialize (TagBuffer i)
 {
   i.Read ((uint8_t *)&m_rtsTxVector, sizeof (WifiTxVector));
 }
+
 void
 HighLatencyRtsTxVectorTag::Print (std::ostream &os) const
 {
@@ -203,53 +217,60 @@
 HighLatencyCtsToSelfTxVectorTag::HighLatencyCtsToSelfTxVectorTag ()
 {
 }
-HighLatencyCtsToSelfTxVectorTag::HighLatencyCtsToSelfTxVectorTag ( WifiTxVector ctsToSelfTxVector)
+
+HighLatencyCtsToSelfTxVectorTag::HighLatencyCtsToSelfTxVectorTag (WifiTxVector ctsToSelfTxVector)
   : m_ctsToSelfTxVector (ctsToSelfTxVector)
 {
 }
 
-WifiTxVector 
+WifiTxVector
 HighLatencyCtsToSelfTxVectorTag::GetCtsToSelfTxVector (void) const
 {
   return m_ctsToSelfTxVector;
 }
+
 TypeId
 HighLatencyCtsToSelfTxVectorTag::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::HighLatencyCtsToSelfTxVectorTag")
     .SetParent<Tag> ()
     .SetGroupName ("Wifi")
-    .AddConstructor<HighLatencyCtsToSelfTxVectorTag> ()  
-    ;
+    .AddConstructor<HighLatencyCtsToSelfTxVectorTag> ()
+  ;
   return tid;
 }
+
 TypeId
 HighLatencyCtsToSelfTxVectorTag::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
+
 uint32_t
 HighLatencyCtsToSelfTxVectorTag::GetSerializedSize (void) const
 {
   return sizeof (WifiTxVector);
 }
+
 void
 HighLatencyCtsToSelfTxVectorTag::Serialize (TagBuffer i) const
 {
   i.Write ((uint8_t *)&m_ctsToSelfTxVector, sizeof (WifiTxVector));
 }
+
 void
 HighLatencyCtsToSelfTxVectorTag::Deserialize (TagBuffer i)
 {
   i.Read ((uint8_t *)&m_ctsToSelfTxVector, sizeof (WifiTxVector));
 }
+
 void
 HighLatencyCtsToSelfTxVectorTag::Print (std::ostream &os) const
 {
   os << "Cts To Self=" << m_ctsToSelfTxVector;
 }
 
-} // namespace ns3
+} //namespace ns3
 
 namespace ns3 {
 
@@ -266,7 +287,7 @@
                    " transmission of each packet is obtained before sending the next. Otherwise, we modelize a "
                    " high-latency device, that is a device where we cannot update our decision about tx parameters"
                    " after every packet transmission.",
-                   BooleanValue (true), // this value is ignored because there is no setter
+                   BooleanValue (true), //this value is ignored because there is no setter
                    MakeBooleanAccessor (&WifiRemoteStationManager::IsLowLatency),
                    MakeBooleanChecker ())
     .AddAttribute ("MaxSsrc", "The maximum number of retransmission attempts for an RTS. This value"
@@ -324,13 +345,15 @@
 }
 
 WifiRemoteStationManager::WifiRemoteStationManager ()
- : m_htSupported (false)
+  : m_htSupported (false),
+    m_vhtSupported (false)
 {
 }
 
 WifiRemoteStationManager::~WifiRemoteStationManager ()
 {
 }
+
 void
 WifiRemoteStationManager::DoDispose (void)
 {
@@ -345,38 +368,61 @@
     }
   m_stations.clear ();
 }
+
 void
 WifiRemoteStationManager::SetupPhy (Ptr<WifiPhy> phy)
 {
-  // We need to track our PHY because it is the object that knows the
-  // full set of transmit rates that are supported. We need to know
-  // this in order to find the relevant mandatory rates when chosing a
-  // transmit rate for automatic control responses like
-  // acknowledgements.
+  //We need to track our PHY because it is the object that knows the
+  //full set of transmit rates that are supported. We need to know
+  //this in order to find the relevant mandatory rates when chosing a
+  //transmit rate for automatic control responses like
+  //acknowledgements.
   m_wifiPhy = phy;
   m_defaultTxMode = phy->GetMode (0);
-  if(HasHtSupported())
+  if (HasHtSupported () || HasVhtSupported ())
     {
-       m_defaultTxMcs = phy->GetMcs (0);
-    }
-  else
-    {
-      m_defaultTxMcs = 0;
+      m_defaultTxMcs = phy->GetMcs (0);
     }
   Reset ();
 }
+
 void
 WifiRemoteStationManager::SetupMac (Ptr<WifiMac> mac)
 {
-  // We need to track our MAC because it is the object that knows the
-  // full set of interframe spaces.
+  //We need to track our MAC because it is the object that knows the
+  //full set of interframe spaces.
   m_wifiMac = mac;
   Reset ();
 }
+
 void
 WifiRemoteStationManager::SetHtSupported (bool enable)
 {
-  m_htSupported=enable;
+  m_htSupported = enable;
+}
+
+void
+WifiRemoteStationManager::SetMaxSsrc (uint32_t maxSsrc)
+{
+  m_maxSsrc = maxSsrc;
+}
+
+void
+WifiRemoteStationManager::SetMaxSlrc (uint32_t maxSlrc)
+{
+  m_maxSlrc = maxSlrc;
+}
+
+void
+WifiRemoteStationManager::SetRtsCtsThreshold (uint32_t threshold)
+{
+  m_rtsCtsThreshold = threshold;
+}
+
+void
+WifiRemoteStationManager::SetFragmentationThreshold (uint32_t threshold)
+{
+  DoSetFragmentationThreshold (threshold);
 }
 
 bool
@@ -384,46 +430,42 @@
 {
   return m_htSupported;
 }
+
+void
+WifiRemoteStationManager::SetVhtSupported (bool enable)
+{
+  m_vhtSupported = enable;
+}
+
+bool
+WifiRemoteStationManager::HasVhtSupported (void) const
+{
+  return m_vhtSupported;
+}
+
 uint32_t
 WifiRemoteStationManager::GetMaxSsrc (void) const
 {
   return m_maxSsrc;
 }
+
 uint32_t
 WifiRemoteStationManager::GetMaxSlrc (void) const
 {
   return m_maxSlrc;
 }
+
 uint32_t
 WifiRemoteStationManager::GetRtsCtsThreshold (void) const
 {
   return m_rtsCtsThreshold;
 }
+
 uint32_t
 WifiRemoteStationManager::GetFragmentationThreshold (void) const
 {
   return DoGetFragmentationThreshold ();
 }
-void
-WifiRemoteStationManager::SetMaxSsrc (uint32_t maxSsrc)
-{
-  m_maxSsrc = maxSsrc;
-}
-void
-WifiRemoteStationManager::SetMaxSlrc (uint32_t maxSlrc)
-{
-  m_maxSlrc = maxSlrc;
-}
-void
-WifiRemoteStationManager::SetRtsCtsThreshold (uint32_t threshold)
-{
-  m_rtsCtsThreshold = threshold;
-}
-void
-WifiRemoteStationManager::SetFragmentationThreshold (uint32_t threshold)
-{
-  DoSetFragmentationThreshold (threshold);
-}
 
 void
 WifiRemoteStationManager::Reset (Mac48Address address)
@@ -434,8 +476,9 @@
   state->m_operationalRateSet.clear ();
   state->m_operationalMcsSet.clear ();
   AddSupportedMode (address, GetDefaultMode ());
-  AddSupportedMcs(address,GetDefaultMcs());
+  AddSupportedMcs (address, GetDefaultMcs ());
 }
+
 void
 WifiRemoteStationManager::AddSupportedMode (Mac48Address address, WifiMode mode)
 {
@@ -446,12 +489,13 @@
     {
       if ((*i) == mode)
         {
-          // already in.
+          //already in.
           return;
         }
     }
   state->m_operationalRateSet.push_back (mode);
 }
+
 void
 WifiRemoteStationManager::AddAllSupportedModes (Mac48Address address)
 {
@@ -460,47 +504,27 @@
   state->m_operationalRateSet.clear ();
   for (uint32_t i = 0; i < m_wifiPhy->GetNModes (); i++)
     {
-      state->m_operationalRateSet.push_back ( m_wifiPhy->GetMode (i));
+      state->m_operationalRateSet.push_back (m_wifiPhy->GetMode (i));
     }
 }
 
-/*void
-WifiRemoteStationManager::AddBssMembershipParameters(Mac48Address address, uint32_t selector)
-{
-  NS_ASSERT (!address.IsGroup ());
-  WifiRemoteStationState *state = LookupState (address);
-  WifiMode mode;
-  WifiModeList membershipselectormodes = m_wifiPhy->GetMembershipSelectorModes(selector);
-  for (WifiModeListIterator j = membershipselectormodes.begin (); j != membershipselectormodes.end (); j++)
-    {
-      mode=(*j);
-     for (WifiModeListIterator i = state->m_operationalRateSet.begin (); i != state->m_operationalRateSet.end (); i++)
-      {
-        if ((*i) == mode)
-          {
-            // already in.
-            break;
-          }
-      }
-    state->m_operationalRateSet.push_back (mode);
-  }
-}*/
-void 
-WifiRemoteStationManager::AddSupportedMcs (Mac48Address address, uint8_t mcs)
+void
+WifiRemoteStationManager::AddSupportedMcs (Mac48Address address, WifiMode mcs)
 {
-  NS_LOG_FUNCTION (this << address << (uint16_t) mcs);
+  NS_LOG_FUNCTION (this << address << mcs);
   NS_ASSERT (!address.IsGroup ());
   WifiRemoteStationState *state = LookupState (address);
-  for (WifiMcsListIterator i = state->m_operationalMcsSet.begin (); i != state->m_operationalMcsSet.end (); i++)
+  for (WifiModeListIterator i = state->m_operationalMcsSet.begin (); i != state->m_operationalMcsSet.end (); i++)
     {
       if ((*i) == mcs)
         {
-          // already in.
+          //already in.
           return;
         }
     }
   state->m_operationalMcsSet.push_back (mcs);
 }
+
 bool
 WifiRemoteStationManager::IsBrandNew (Mac48Address address) const
 {
@@ -510,6 +534,7 @@
     }
   return LookupState (address)->m_state == WifiRemoteStationState::BRAND_NEW;
 }
+
 bool
 WifiRemoteStationManager::IsAssociated (Mac48Address address) const
 {
@@ -519,6 +544,7 @@
     }
   return LookupState (address)->m_state == WifiRemoteStationState::GOT_ASSOC_TX_OK;
 }
+
 bool
 WifiRemoteStationManager::IsWaitAssocTxOk (Mac48Address address) const
 {
@@ -528,30 +554,35 @@
     }
   return LookupState (address)->m_state == WifiRemoteStationState::WAIT_ASSOC_TX_OK;
 }
+
 void
 WifiRemoteStationManager::RecordWaitAssocTxOk (Mac48Address address)
 {
   NS_ASSERT (!address.IsGroup ());
   LookupState (address)->m_state = WifiRemoteStationState::WAIT_ASSOC_TX_OK;
 }
+
 void
 WifiRemoteStationManager::RecordGotAssocTxOk (Mac48Address address)
 {
   NS_ASSERT (!address.IsGroup ());
   LookupState (address)->m_state = WifiRemoteStationState::GOT_ASSOC_TX_OK;
 }
+
 void
 WifiRemoteStationManager::RecordGotAssocTxFailed (Mac48Address address)
 {
   NS_ASSERT (!address.IsGroup ());
   LookupState (address)->m_state = WifiRemoteStationState::DISASSOC;
 }
+
 void
 WifiRemoteStationManager::RecordDisassociated (Mac48Address address)
 {
   NS_ASSERT (!address.IsGroup ());
   LookupState (address)->m_state = WifiRemoteStationState::DISASSOC;
 }
+
 void
 WifiRemoteStationManager::PrepareForQueue (Mac48Address address, const WifiMacHeader *header,
                                            Ptr<const Packet> packet, uint32_t fullPacketSize)
@@ -563,26 +594,27 @@
     }
   WifiRemoteStation *station = Lookup (address, header);
   WifiTxVector rts = DoGetRtsTxVector (station);
-  WifiTxVector data = DoGetDataTxVector (station, fullPacketSize); 
-  WifiTxVector ctstoself = DoGetCtsToSelfTxVector (); 
+  WifiTxVector data = DoGetDataTxVector (station, fullPacketSize);
+  WifiTxVector ctstoself = DoGetCtsToSelfTxVector ();
   HighLatencyDataTxVectorTag datatag;
   HighLatencyRtsTxVectorTag rtstag;
   HighLatencyCtsToSelfTxVectorTag ctstoselftag;
-  // first, make sure that the tag is not here anymore.
+  //first, make sure that the tag is not here anymore.
   ConstCast<Packet> (packet)->RemovePacketTag (datatag);
   ConstCast<Packet> (packet)->RemovePacketTag (rtstag);
   ConstCast<Packet> (packet)->RemovePacketTag (ctstoselftag);
   datatag = HighLatencyDataTxVectorTag (data);
   rtstag = HighLatencyRtsTxVectorTag (rts);
   ctstoselftag = HighLatencyCtsToSelfTxVectorTag (ctstoself);
-  // and then, add it back
+  //and then, add it back
   packet->AddPacketTag (datatag);
   packet->AddPacketTag (rtstag);
   packet->AddPacketTag (ctstoselftag);
 }
+
 WifiTxVector
 WifiRemoteStationManager::GetDataTxVector (Mac48Address address, const WifiMacHeader *header,
-                                       Ptr<const Packet> packet, uint32_t fullPacketSize)
+                                           Ptr<const Packet> packet, uint32_t fullPacketSize)
 {
   NS_LOG_FUNCTION (this << address << *header << packet << fullPacketSize);
   if (address.IsGroup ())
@@ -590,7 +622,8 @@
       WifiTxVector v;
       v.SetMode (GetNonUnicastMode ());
       v.SetTxPowerLevel (m_defaultTxPowerLevel);
-      v.SetShortGuardInterval (false);
+      v.SetChannelWidth (m_wifiPhy->GetChannelWidth ());
+      v.SetShortGuardInterval (m_wifiPhy->GetGuardInterval ());
       v.SetNss (1);
       v.SetNess (0);
       v.SetStbc (false);
@@ -602,16 +635,17 @@
       bool found;
       found = ConstCast<Packet> (packet)->PeekPacketTag (datatag);
       NS_ASSERT (found);
-      // cast found to void, to suppress 'found' set but not used
-      // compiler warning
+      //cast found to void, to suppress 'found' set but not used
+      //compiler warning
       (void) found;
       return datatag.GetDataTxVector ();
     }
   return DoGetDataTxVector (Lookup (address, header), fullPacketSize);
 }
+
 WifiTxVector
-WifiRemoteStationManager::GetCtsToSelfTxVector(const WifiMacHeader *header,
-                                      Ptr<const Packet> packet)
+WifiRemoteStationManager::GetCtsToSelfTxVector (const WifiMacHeader *header,
+                                                Ptr<const Packet> packet)
 {
   NS_LOG_FUNCTION (this << *header << packet);
   if (!IsLowLatency ())
@@ -620,8 +654,8 @@
       bool found;
       found = ConstCast<Packet> (packet)->PeekPacketTag (ctstoselftag);
       NS_ASSERT (found);
-      // cast found to void, to suppress 'found' set but not used
-      // compiler warning
+      //cast found to void, to suppress 'found' set but not used
+      //compiler warning
       (void) found;
       return ctstoselftag.GetCtsToSelfTxVector ();
     }
@@ -631,12 +665,20 @@
 WifiTxVector
 WifiRemoteStationManager::DoGetCtsToSelfTxVector (void)
 {
-  return WifiTxVector (GetDefaultMode(), GetDefaultTxPowerLevel (),0,m_wifiPhy->GetGuardInterval(),GetNumberOfTransmitAntennas(), GetNumberOfTransmitAntennas(), false);
+  return WifiTxVector (GetDefaultMode (),
+                       GetDefaultTxPowerLevel (),
+                       0,
+                       m_wifiPhy->GetChannelWidth (),
+                       m_wifiPhy->GetGuardInterval (),
+                       GetNumberOfTransmitAntennas (),
+                       GetNumberOfTransmitAntennas (),
+                       false,
+                       false);
 }
 
 WifiTxVector
 WifiRemoteStationManager::GetRtsTxVector (Mac48Address address, const WifiMacHeader *header,
-                                      Ptr<const Packet> packet)
+                                          Ptr<const Packet> packet)
 {
   NS_LOG_FUNCTION (this << address << *header << packet);
   NS_ASSERT (!address.IsGroup ());
@@ -646,13 +688,14 @@
       bool found;
       found = ConstCast<Packet> (packet)->PeekPacketTag (rtstag);
       NS_ASSERT (found);
-      // cast found to void, to suppress 'found' set but not used
-      // compiler warning
+      //cast found to void, to suppress 'found' set but not used
+      //compiler warning
       (void) found;
       return rtstag.GetRtsTxVector ();
     }
   return DoGetRtsTxVector (Lookup (address, header));
 }
+
 void
 WifiRemoteStationManager::ReportRtsFailed (Mac48Address address, const WifiMacHeader *header)
 {
@@ -663,6 +706,7 @@
   m_macTxRtsFailed (address);
   DoReportRtsFailed (station);
 }
+
 void
 WifiRemoteStationManager::ReportDataFailed (Mac48Address address, const WifiMacHeader *header)
 {
@@ -673,6 +717,7 @@
   m_macTxDataFailed (address);
   DoReportDataFailed (station);
 }
+
 void
 WifiRemoteStationManager::ReportRtsOk (Mac48Address address, const WifiMacHeader *header,
                                        double ctsSnr, WifiMode ctsMode, double rtsSnr)
@@ -684,6 +729,7 @@
   station->m_ssrc = 0;
   DoReportRtsOk (station, ctsSnr, ctsMode, rtsSnr);
 }
+
 void
 WifiRemoteStationManager::ReportDataOk (Mac48Address address, const WifiMacHeader *header,
                                         double ackSnr, WifiMode ackMode, double dataSnr)
@@ -695,6 +741,7 @@
   station->m_slrc = 0;
   DoReportDataOk (station, ackSnr, ackMode, dataSnr);
 }
+
 void
 WifiRemoteStationManager::ReportFinalRtsFailed (Mac48Address address, const WifiMacHeader *header)
 {
@@ -706,6 +753,7 @@
   m_macTxFinalRtsFailed (address);
   DoReportFinalRtsFailed (station);
 }
+
 void
 WifiRemoteStationManager::ReportFinalDataFailed (Mac48Address address, const WifiMacHeader *header)
 {
@@ -717,6 +765,7 @@
   m_macTxFinalDataFailed (address);
   DoReportFinalDataFailed (station);
 }
+
 void
 WifiRemoteStationManager::ReportRxOk (Mac48Address address, const WifiMacHeader *header,
                                       double rxSnr, WifiMode txMode)
@@ -729,6 +778,7 @@
   WifiRemoteStation *station = Lookup (address, header);
   DoReportRxOk (station, rxSnr, txMode);
 }
+
 bool
 WifiRemoteStationManager::NeedRts (Mac48Address address, const WifiMacHeader *header,
                                    Ptr<const Packet> packet)
@@ -741,15 +791,14 @@
   bool normally = (packet->GetSize () + header->GetSize () + WIFI_MAC_FCS_LENGTH) > GetRtsCtsThreshold ();
   return DoNeedRts (Lookup (address, header), packet, normally);
 }
+
 bool
 WifiRemoteStationManager::NeedCtsToSelf (WifiTxVector txVector)
 {
   NS_LOG_FUNCTION (this << txVector);
-  WifiMode mode = txVector.GetMode();
- 
-  // search the BSS Basic Rate set if the used mode in the basic set then no need for Cts to self
-  for (WifiModeListIterator i = m_bssBasicRateSet.begin ();
-       i != m_bssBasicRateSet.end (); i++)
+  WifiMode mode = txVector.GetMode ();
+  //search for the BSS Basic Rate set, if the used mode is in the basic set then there is no need for Cts To Self
+  for (WifiModeListIterator i = m_bssBasicRateSet.begin (); i != m_bssBasicRateSet.end (); i++)
     {
       if (mode == *i)
         {
@@ -757,13 +806,12 @@
           return false;
         }
     }
-  if (HasHtSupported())
+  if (HasHtSupported ())
     {
-      uint8_t mcs = m_wifiPhy->WifiModeToMcs (mode);
-      for (WifiMcsListIterator i = m_bssBasicMcsSet.begin ();
-           i != m_bssBasicMcsSet.end (); i++)
+      //search for the BSS Basic MCS set, if the used mode is in the basic set then there is no need for Cts To Self
+      for (WifiModeListIterator i = m_bssBasicMcsSet.begin (); i != m_bssBasicMcsSet.end (); i++)
         {
-          if (mcs == *i)
+          if (mode == *i)
             {
               NS_LOG_DEBUG ("WifiRemoteStationManager::NeedCtsToSelf returning false");
               return false;
@@ -773,6 +821,7 @@
   NS_LOG_DEBUG ("WifiRemoteStationManager::NeedCtsToSelf returning true");
   return true;
 }
+
 bool
 WifiRemoteStationManager::NeedRtsRetransmission (Mac48Address address, const WifiMacHeader *header,
                                                  Ptr<const Packet> packet)
@@ -784,6 +833,7 @@
   NS_LOG_DEBUG ("WifiRemoteStationManager::NeedDataRetransmission count: " << station->m_ssrc << " result: " << std::boolalpha << normally);
   return DoNeedRtsRetransmission (station, packet, normally);
 }
+
 bool
 WifiRemoteStationManager::NeedDataRetransmission (Mac48Address address, const WifiMacHeader *header,
                                                   Ptr<const Packet> packet)
@@ -795,6 +845,7 @@
   NS_LOG_DEBUG ("WifiRemoteStationManager::NeedDataRetransmission count: " << station->m_slrc << " result: " << std::boolalpha << normally);
   return DoNeedDataRetransmission (station, packet, normally);
 }
+
 bool
 WifiRemoteStationManager::NeedFragmentation (Mac48Address address, const WifiMacHeader *header,
                                              Ptr<const Packet> packet)
@@ -820,7 +871,7 @@
        * ASN.1 encoding of the MAC and PHY MIB (256 ... 8000)
        */
       NS_LOG_WARN ("Fragmentation threshold should be larger than 256. Setting to 256.");
-      m_fragmentationThreshold = 256;
+      m_nextFragmentationThreshold = 256;
     }
   else
     {
@@ -831,15 +882,21 @@
       if (threshold % 2 != 0)
         {
           NS_LOG_WARN ("Fragmentation threshold should be an even number. Setting to " << threshold - 1);
-          m_fragmentationThreshold = threshold - 1; 
+          m_nextFragmentationThreshold = threshold - 1;
         }
       else
         {
-          m_fragmentationThreshold = threshold;
+          m_nextFragmentationThreshold = threshold;
         }
     }
 }
 
+void
+WifiRemoteStationManager::UpdateFragmentationThreshold (void)
+{
+  m_fragmentationThreshold = m_nextFragmentationThreshold;
+}
+
 uint32_t
 WifiRemoteStationManager::DoGetFragmentationThreshold (void) const
 {
@@ -889,6 +946,7 @@
       return fragmentSize;
     }
 }
+
 uint32_t
 WifiRemoteStationManager::GetFragmentOffset (Mac48Address address, const WifiMacHeader *header,
                                              Ptr<const Packet> packet, uint32_t fragmentNumber)
@@ -900,6 +958,7 @@
   NS_LOG_DEBUG ("WifiRemoteStationManager::GetFragmentOffset returning " << fragmentOffset);
   return fragmentOffset;
 }
+
 bool
 WifiRemoteStationManager::IsLastFragment (Mac48Address address, const WifiMacHeader *header,
                                           Ptr<const Packet> packet, uint32_t fragmentNumber)
@@ -910,6 +969,7 @@
   NS_LOG_DEBUG ("WifiRemoteStationManager::IsLastFragment returning " << std::boolalpha << isLast);
   return isLast;
 }
+
 WifiMode
 WifiRemoteStationManager::GetControlAnswerMode (Mac48Address address, WifiMode reqMode)
 {
@@ -918,61 +978,57 @@
    * control response rate (the below is quoted from IEEE 802.11-2012,
    * Section 9.7):
    *
-   *   To allow the transmitting STA to calculate the contents of the
-   *   Duration/ID field, a STA responding to a received frame shall
-   *   transmit its Control Response frame (either CTS or ACK), other
-   *   than the BlockAck control frame, at the highest rate in the
-   *   BSSBasicRateSet parameter that is less than or equal to the
-   *   rate of the immediately previous frame in the frame exchange
-   *   sequence (as defined in Annex G) and that is of the same
-   *   modulation class (see Section 9.7.8) as the received frame...
+   * To allow the transmitting STA to calculate the contents of the
+   * Duration/ID field, a STA responding to a received frame shall
+   * transmit its Control Response frame (either CTS or ACK), other
+   * than the BlockAck control frame, at the highest rate in the
+   * BSSBasicRateSet parameter that is less than or equal to the
+   * rate of the immediately previous frame in the frame exchange
+   * sequence (as defined in Annex G) and that is of the same
+   * modulation class (see Section 9.7.8) as the received frame...
    */
   NS_LOG_FUNCTION (this << address << reqMode);
   WifiMode mode = GetDefaultMode ();
   bool found = false;
-
-  // First, search the BSS Basic Rate set
-  for (WifiModeListIterator i = m_bssBasicRateSet.begin ();
-       i != m_bssBasicRateSet.end (); i++)
+  //First, search the BSS Basic Rate set
+  for (WifiModeListIterator i = m_bssBasicRateSet.begin (); i != m_bssBasicRateSet.end (); i++)
     {
-      if ((!found || i->GetPhyRate () > mode.GetPhyRate ())
-          && (i->GetPhyRate () <= reqMode.GetPhyRate ())
+      if ((!found || i->GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
+          && (i->GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
           && ((i->GetModulationClass () == reqMode.GetModulationClass ())
-              || (reqMode.GetModulationClass () == WIFI_MOD_CLASS_HT)))
+              || (reqMode.GetModulationClass () == WIFI_MOD_CLASS_HT)
+              || (reqMode.GetModulationClass () == WIFI_MOD_CLASS_VHT)))
+
         {
           mode = *i;
-          // We've found a potentially-suitable transmit rate, but we
-          // need to continue and consider all the basic rates before
-          // we can be sure we've got the right one.
+          //We've found a potentially-suitable transmit rate, but we
+          //need to continue and consider all the basic rates before
+          //we can be sure we've got the right one.
           found = true;
         }
     }
-  if(HasHtSupported())
+  if (HasHtSupported () || HasVhtSupported ())
     {
       if (!found)
         {
-          uint8_t mcs = GetDefaultMcs ();
-          mode = m_wifiPhy->McsToWifiMode (mcs);
-            
-          for (WifiMcsListIterator i = m_bssBasicMcsSet.begin ();
-             i != m_bssBasicMcsSet.end (); i++)
-          {
-            WifiMode thismode=  m_wifiPhy->McsToWifiMode (*i); 
-            if ((!found || thismode.GetPhyRate () > mode.GetPhyRate ())
-                && thismode.GetPhyRate () <= reqMode.GetPhyRate ()
-                && thismode.GetModulationClass () == reqMode.GetModulationClass ())
-              {
-                mode = thismode;
-                // We've found a potentially-suitable transmit rate, but we
-                // need to continue and consider all the basic rates before
-                // we can be sure we've got the right one.
-                found = true;
-              }
-          }
+          mode = GetDefaultMcs ();
+          for (WifiModeListIterator i = m_bssBasicMcsSet.begin (); i != m_bssBasicMcsSet.end (); i++)
+            {
+              if ((!found || i->GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
+                  && i->GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
+              //&& thismode.GetModulationClass () == reqMode.GetModulationClass ()) //TODO: check standard
+                {
+                  mode = *i;
+                  //We've found a potentially-suitable transmit rate, but we
+                  //need to continue and consider all the basic rates before
+                  //we can be sure we've got the right one.
+                  found = true;
+                }
+            }
         }
-      }
-  // If we found a suitable rate in the BSSBasicRateSet, then we are
-  // done and can return that mode.
+    }
+  //If we found a suitable rate in the BSSBasicRateSet, then we are
+  //done and can return that mode.
   if (found)
     {
       NS_LOG_DEBUG ("WifiRemoteStationManager::GetControlAnswerMode returning " << mode);
@@ -1010,38 +1066,37 @@
        * ...then it's our best choice so far.
        */
       if (thismode.IsMandatory ()
-          && (!found || thismode.GetPhyRate () > mode.GetPhyRate ())
-          && (thismode.GetPhyRate () <= reqMode.GetPhyRate ())
-          && ((thismode.GetModulationClass () == reqMode.GetModulationClass ()) ||
-             (reqMode.GetModulationClass () == WIFI_MOD_CLASS_HT)))
+          && (!found || thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
+          && (thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
+          && ((thismode.GetModulationClass () == reqMode.GetModulationClass ())
+              || (reqMode.GetModulationClass () == WIFI_MOD_CLASS_HT)
+              || (reqMode.GetModulationClass () == WIFI_MOD_CLASS_HT)))
+
         {
           mode = thismode;
-          // As above; we've found a potentially-suitable transmit
-          // rate, but we need to continue and consider all the
-          // mandatory rates before we can be sure we've got the right
-          // one.
+          //As above; we've found a potentially-suitable transmit
+          //rate, but we need to continue and consider all the
+          //mandatory rates before we can be sure we've got the right one.
           found = true;
         }
     }
-  if(HasHtSupported())
+  if (HasHtSupported () || HasVhtSupported ())
     {
       for (uint32_t idx = 0; idx < m_wifiPhy->GetNMcs (); idx++)
         {
-          uint8_t thismcs = m_wifiPhy->GetMcs (idx);
-          WifiMode thismode=  m_wifiPhy->McsToWifiMode (thismcs);
+          WifiMode thismode = m_wifiPhy->GetMcs (idx);
           if (thismode.IsMandatory ()
-              && (!found || thismode.GetPhyRate () > mode.GetPhyRate ())
-              && thismode.GetPhyRate () <= reqMode.GetPhyRate ()
+              && (!found || thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
+              && thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1)
               && thismode.GetModulationClass () == reqMode.GetModulationClass ())
             {
               mode = thismode;
-              // As above; we've found a potentially-suitable transmit
-              // rate, but we need to continue and consider all the
-              // mandatory rates before we can be sure we've got the right
-              // one.
+              //As above; we've found a potentially-suitable transmit
+              //rate, but we need to continue and consider all the
+              //mandatory rates before we can be sure we've got the right one.
               found = true;
             }
-            
+
         }
     }
 
@@ -1057,8 +1112,7 @@
    */
   if (!found)
     {
-      NS_FATAL_ERROR ("Can't find response rate for " << reqMode
-                      << ". Check standard and selected rates match.");
+      NS_FATAL_ERROR ("Can't find response rate for " << reqMode);
     }
 
   NS_LOG_DEBUG ("WifiRemoteStationManager::GetControlAnswerMode returning " << mode);
@@ -1071,132 +1125,159 @@
   NS_ASSERT (!address.IsGroup ());
   WifiTxVector v;
   v.SetMode (GetControlAnswerMode (address, rtsMode));
-  v.SetTxPowerLevel (DoGetCtsTxPowerLevel (address, v.GetMode()));
-  v.SetShortGuardInterval (DoGetCtsTxGuardInterval(address, v.GetMode()));
-  v.SetNss (DoGetCtsTxNss(address, v.GetMode()));
-  v.SetNess (DoGetCtsTxNess(address, v.GetMode()));
-  v.SetStbc (DoGetCtsTxStbc(address, v.GetMode()));
+  v.SetTxPowerLevel (DoGetCtsTxPowerLevel (address, v.GetMode ()));
+  v.SetChannelWidth (DoGetCtsTxChannelWidth (address, v.GetMode ()));
+  v.SetShortGuardInterval (DoGetCtsTxGuardInterval (address, v.GetMode ()));
+  v.SetNss (DoGetCtsTxNss (address, v.GetMode ()));
+  v.SetNess (DoGetCtsTxNess (address, v.GetMode ()));
+  v.SetStbc (DoGetCtsTxStbc (address, v.GetMode ()));
   return v;
 }
+
 WifiTxVector
 WifiRemoteStationManager::GetAckTxVector (Mac48Address address, WifiMode dataMode)
 {
   NS_ASSERT (!address.IsGroup ());
   WifiTxVector v;
   v.SetMode (GetControlAnswerMode (address, dataMode));
-  v.SetTxPowerLevel (DoGetAckTxPowerLevel (address, v.GetMode()));
-  v.SetShortGuardInterval(DoGetAckTxGuardInterval(address, v.GetMode()));
-  v.SetNss(DoGetAckTxNss(address, v.GetMode()));
-  v.SetNess(DoGetAckTxNess(address, v.GetMode()));
-  v.SetStbc(DoGetAckTxStbc(address, v.GetMode()));
+  v.SetTxPowerLevel (DoGetAckTxPowerLevel (address, v.GetMode ()));
+  v.SetChannelWidth (DoGetAckTxChannelWidth (address, v.GetMode ()));
+  v.SetShortGuardInterval (DoGetAckTxGuardInterval (address, v.GetMode ()));
+  v.SetNss (DoGetAckTxNss (address, v.GetMode ()));
+  v.SetNess (DoGetAckTxNess (address, v.GetMode ()));
+  v.SetStbc (DoGetAckTxStbc (address, v.GetMode ()));
   return v;
 }
+
 WifiTxVector
 WifiRemoteStationManager::GetBlockAckTxVector (Mac48Address address, WifiMode blockAckReqMode)
 {
   NS_ASSERT (!address.IsGroup ());
   WifiTxVector v;
   v.SetMode (GetControlAnswerMode (address, blockAckReqMode));
-  v.SetTxPowerLevel (DoGetBlockAckTxPowerLevel (address, v.GetMode()));
-  v.SetShortGuardInterval (DoGetBlockAckTxGuardInterval(address, v.GetMode()));
-  v.SetNss (DoGetBlockAckTxNss(address, v.GetMode()));
-  v.SetNess (DoGetBlockAckTxNess(address, v.GetMode()));
-  v.SetStbc (DoGetBlockAckTxStbc(address, v.GetMode()));
+  v.SetTxPowerLevel (DoGetBlockAckTxPowerLevel (address, v.GetMode ()));
+  v.SetChannelWidth (DoGetBlockAckTxChannelWidth (address, v.GetMode ()));
+  v.SetShortGuardInterval (DoGetBlockAckTxGuardInterval (address, v.GetMode ()));
+  v.SetNss (DoGetBlockAckTxNss (address, v.GetMode ()));
+  v.SetNess (DoGetBlockAckTxNess (address, v.GetMode ()));
+  v.SetStbc (DoGetBlockAckTxStbc (address, v.GetMode ()));
   return v;
 }
 
-uint8_t 
+uint8_t
 WifiRemoteStationManager::DoGetCtsTxPowerLevel (Mac48Address address, WifiMode ctsMode)
 {
   return m_defaultTxPowerLevel;
 }
 
-bool 
-WifiRemoteStationManager::DoGetCtsTxGuardInterval(Mac48Address address, WifiMode ctsMode)
+uint32_t
+WifiRemoteStationManager::DoGetCtsTxChannelWidth (Mac48Address address, WifiMode ctsMode)
 {
-  return m_wifiPhy->GetGuardInterval();
+  return m_wifiPhy->GetChannelWidth ();
+}
+
+bool
+WifiRemoteStationManager::DoGetCtsTxGuardInterval (Mac48Address address, WifiMode ctsMode)
+{
+  return m_wifiPhy->GetGuardInterval ();
 }
 
 uint8_t
-WifiRemoteStationManager::DoGetCtsTxNss(Mac48Address address, WifiMode ctsMode)
+WifiRemoteStationManager::DoGetCtsTxNss (Mac48Address address, WifiMode ctsMode)
 {
   return 1;
 }
+
 uint8_t
-WifiRemoteStationManager::DoGetCtsTxNess(Mac48Address address, WifiMode ctsMode)
+WifiRemoteStationManager::DoGetCtsTxNess (Mac48Address address, WifiMode ctsMode)
 {
   return 0;
 }
-bool 
-WifiRemoteStationManager::DoGetCtsTxStbc(Mac48Address address, WifiMode ctsMode)
+
+bool
+WifiRemoteStationManager::DoGetCtsTxStbc (Mac48Address address, WifiMode ctsMode)
 {
-  return m_wifiPhy->GetStbc();
+  return m_wifiPhy->GetStbc ();
 }
 
-uint8_t 
+uint8_t
 WifiRemoteStationManager::DoGetAckTxPowerLevel (Mac48Address address, WifiMode ackMode)
 {
   return m_defaultTxPowerLevel;
 }
 
-bool 
-WifiRemoteStationManager::DoGetAckTxGuardInterval(Mac48Address address, WifiMode ackMode)
+uint32_t
+WifiRemoteStationManager::DoGetAckTxChannelWidth (Mac48Address address, WifiMode ctsMode)
+{
+  return m_wifiPhy->GetChannelWidth ();
+}
+
+bool
+WifiRemoteStationManager::DoGetAckTxGuardInterval (Mac48Address address, WifiMode ackMode)
 {
-  return m_wifiPhy->GetGuardInterval();
+  return m_wifiPhy->GetGuardInterval ();
 }
 
 uint8_t
-WifiRemoteStationManager::DoGetAckTxNss(Mac48Address address, WifiMode ackMode)
+WifiRemoteStationManager::DoGetAckTxNss (Mac48Address address, WifiMode ackMode)
 {
   return 1;
 }
+
 uint8_t
-WifiRemoteStationManager::DoGetAckTxNess(Mac48Address address, WifiMode ackMode)
+WifiRemoteStationManager::DoGetAckTxNess (Mac48Address address, WifiMode ackMode)
 {
   return 0;
 }
-bool 
-WifiRemoteStationManager::DoGetAckTxStbc(Mac48Address address, WifiMode ackMode)
+
+bool
+WifiRemoteStationManager::DoGetAckTxStbc (Mac48Address address, WifiMode ackMode)
 {
-  return m_wifiPhy->GetStbc();
+  return m_wifiPhy->GetStbc ();
 }
 
-uint8_t 
+uint8_t
 WifiRemoteStationManager::DoGetBlockAckTxPowerLevel (Mac48Address address, WifiMode blockAckMode)
 {
   return m_defaultTxPowerLevel;
 }
 
-bool 
-WifiRemoteStationManager::DoGetBlockAckTxGuardInterval(Mac48Address address, WifiMode blockAckMode)
+uint32_t
+WifiRemoteStationManager::DoGetBlockAckTxChannelWidth (Mac48Address address, WifiMode ctsMode)
 {
-  return m_wifiPhy->GetGuardInterval();
+  return m_wifiPhy->GetChannelWidth ();
+}
+
+bool
+WifiRemoteStationManager::DoGetBlockAckTxGuardInterval (Mac48Address address, WifiMode blockAckMode)
+{
+  return m_wifiPhy->GetGuardInterval ();
 }
 
 uint8_t
-WifiRemoteStationManager::DoGetBlockAckTxNss(Mac48Address address, WifiMode blockAckMode)
+WifiRemoteStationManager::DoGetBlockAckTxNss (Mac48Address address, WifiMode blockAckMode)
 {
   return 1;
 }
+
 uint8_t
-WifiRemoteStationManager::DoGetBlockAckTxNess(Mac48Address address, WifiMode blockAckMode)
+WifiRemoteStationManager::DoGetBlockAckTxNess (Mac48Address address, WifiMode blockAckMode)
 {
   return 0;
 }
-bool 
-WifiRemoteStationManager::DoGetBlockAckTxStbc(Mac48Address address, WifiMode blockAckMode)
+
+bool
+WifiRemoteStationManager::DoGetBlockAckTxStbc (Mac48Address address, WifiMode blockAckMode)
 {
-  return m_wifiPhy->GetStbc();
+  return m_wifiPhy->GetStbc ();
 }
 
-
 uint8_t
 WifiRemoteStationManager::GetDefaultTxPowerLevel (void) const
 {
   return m_defaultTxPowerLevel;
 }
 
-
 WifiRemoteStationInfo
 WifiRemoteStationManager::GetInfo (Mac48Address address)
 {
@@ -1220,17 +1301,20 @@
   state->m_state = WifiRemoteStationState::BRAND_NEW;
   state->m_address = address;
   state->m_operationalRateSet.push_back (GetDefaultMode ());
-  state->m_operationalMcsSet.push_back(GetDefaultMcs());
-  state->m_shortGuardInterval=m_wifiPhy->GetGuardInterval();
-  state->m_greenfield=m_wifiPhy->GetGreenfield();
-  state->m_rx=1;
-  state->m_tx=1;
-  state->m_ness=0;
-  state->m_stbc=false;
+  state->m_operationalMcsSet.push_back (GetDefaultMcs ());
+  state->m_channelWidth = m_wifiPhy->GetChannelWidth ();
+  state->m_shortGuardInterval = m_wifiPhy->GetGuardInterval ();
+  state->m_greenfield = m_wifiPhy->GetGreenfield ();
+  state->m_rx = 1;
+  state->m_tx = 1;
+  state->m_ness = 0;
+  state->m_aggregation = false;
+  state->m_stbc = false;
   const_cast<WifiRemoteStationManager *> (this)->m_states.push_back (state);
   NS_LOG_DEBUG ("WifiRemoteStationManager::LookupState returning new state");
   return state;
 }
+
 WifiRemoteStation *
 WifiRemoteStationManager::Lookup (Mac48Address address, const WifiMacHeader *header) const
 {
@@ -1245,10 +1329,11 @@
     }
   return Lookup (address, tid);
 }
+
 WifiRemoteStation *
 WifiRemoteStationManager::Lookup (Mac48Address address, uint8_t tid) const
 {
-  NS_LOG_FUNCTION (this << address << (uint16_t) tid);
+  NS_LOG_FUNCTION (this << address << (uint16_t)tid);
   for (Stations::const_iterator i = m_stations.begin (); i != m_stations.end (); i++)
     {
       if ((*i)->m_tid == tid
@@ -1264,38 +1349,70 @@
   station->m_tid = tid;
   station->m_ssrc = 0;
   station->m_slrc = 0;
-  // XXX
   const_cast<WifiRemoteStationManager *> (this)->m_stations.push_back (station);
   return station;
+}
 
+void
+WifiRemoteStationManager::AddStationHtCapabilities (Mac48Address from, HtCapabilities htCapabilities)
+{
+  //Used by all stations to record HT capabilities of remote stations
+  NS_LOG_FUNCTION (this << from << htCapabilities);
+  WifiRemoteStationState *state;
+  state = LookupState (from);
+  state->m_shortGuardInterval = htCapabilities.GetShortGuardInterval20 ();
+  if (htCapabilities.GetSupportedChannelWidth () == 1)
+    {
+      state->m_channelWidth = 40;
+    }
+  else
+    {
+      state->m_channelWidth = 20;
+    }
+  state->m_greenfield = htCapabilities.GetGreenfield ();
 }
-//Used by all stations to record HT capabilities of remote stations
+
 void
-WifiRemoteStationManager::AddStationHtCapabilities (Mac48Address from, HtCapabilities htcapabilities)
+WifiRemoteStationManager::AddStationVhtCapabilities (Mac48Address from, VhtCapabilities vhtCapabilities)
 {
-  NS_LOG_FUNCTION (this << from << htcapabilities);
+  //Used by all stations to record VHT capabilities of remote stations
+  NS_LOG_FUNCTION (this << from << vhtCapabilities);
   WifiRemoteStationState *state;
-  state=LookupState (from);
-  state->m_shortGuardInterval=htcapabilities.GetShortGuardInterval20();
-  state->m_greenfield=htcapabilities.GetGreenfield();
- 
+  state = LookupState (from);
+  if (vhtCapabilities.GetSupportedChannelWidthSet () == 1)
+    {
+      state->m_channelWidth = 160;
+    }
+  else
+    {
+      state->m_channelWidth = 80;
+    }
+  //This is a workaround to enable users to force a 20 or 40 MHz channel for a VHT-compliant device,
+  //since IEEE 802.11ac standard says that 20, 40 and 80 MHz channels are mandatory.
+  if (m_wifiPhy->GetChannelWidth () < state->m_channelWidth)
+    {
+      state->m_channelWidth = m_wifiPhy->GetChannelWidth ();
+    }
 }
-//Used by mac low to choose format used GF, MF or Non HT
-bool 
+
+bool
 WifiRemoteStationManager::GetGreenfieldSupported (Mac48Address address) const
 {
- return LookupState(address)->m_greenfield;
+  return LookupState (address)->m_greenfield;
 }
+
 WifiMode
 WifiRemoteStationManager::GetDefaultMode (void) const
 {
   return m_defaultTxMode;
 }
-uint8_t
+
+WifiMode
 WifiRemoteStationManager::GetDefaultMcs (void) const
 {
   return m_defaultTxMcs;
 }
+
 void
 WifiRemoteStationManager::Reset (void)
 {
@@ -1307,14 +1424,19 @@
   m_stations.clear ();
   m_bssBasicRateSet.clear ();
   m_bssBasicRateSet.push_back (m_defaultTxMode);
-  m_bssBasicMcsSet.clear();
+  m_bssBasicMcsSet.clear ();
   m_bssBasicMcsSet.push_back (m_defaultTxMcs);
   NS_ASSERT (m_defaultTxMode.IsMandatory ());
 }
+
 void
 WifiRemoteStationManager::AddBasicMode (WifiMode mode)
 {
   NS_LOG_FUNCTION (this << mode);
+  if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT || mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
+    {
+      NS_FATAL_ERROR ("It is not allowed to add a (V)HT rate in the BSSBasicRateSet!");
+    }
   for (uint32_t i = 0; i < GetNBasicModes (); i++)
     {
       if (GetBasicMode (i) == mode)
@@ -1324,11 +1446,13 @@
     }
   m_bssBasicRateSet.push_back (mode);
 }
+
 uint32_t
 WifiRemoteStationManager::GetNBasicModes (void) const
 {
   return m_bssBasicRateSet.size ();
 }
+
 WifiMode
 WifiRemoteStationManager::GetBasicMode (uint32_t i) const
 {
@@ -1336,10 +1460,11 @@
   return m_bssBasicRateSet[i];
 }
 
-void 
-WifiRemoteStationManager::AddBasicMcs (uint8_t mcs)
+void
+WifiRemoteStationManager::AddBasicMcs (WifiMode mcs)
 {
-   for (uint32_t i = 0; i < GetNBasicMcs (); i++)
+  NS_LOG_FUNCTION (this << (uint32_t)mcs.GetMcsValue ());
+  for (uint32_t i = 0; i < GetNBasicMcs (); i++)
     {
       if (GetBasicMcs (i) == mcs)
         {
@@ -1354,10 +1479,11 @@
 {
   return m_bssBasicMcsSet.size ();
 }
-uint8_t 
+
+WifiMode
 WifiRemoteStationManager::GetBasicMcs (uint32_t i) const
 {
-   NS_ASSERT (i < m_bssBasicMcsSet.size ());
+  NS_ASSERT (i < m_bssBasicMcsSet.size ());
   return m_bssBasicMcsSet[i];
 }
 
@@ -1380,18 +1506,21 @@
 {
   return normally;
 }
+
 bool
 WifiRemoteStationManager::DoNeedRtsRetransmission (WifiRemoteStation *station,
                                                    Ptr<const Packet> packet, bool normally)
 {
   return normally;
 }
+
 bool
 WifiRemoteStationManager::DoNeedDataRetransmission (WifiRemoteStation *station,
                                                     Ptr<const Packet> packet, bool normally)
 {
   return normally;
 }
+
 bool
 WifiRemoteStationManager::DoNeedFragmentation (WifiRemoteStation *station,
                                                Ptr<const Packet> packet, bool normally)
@@ -1405,43 +1534,63 @@
   NS_ASSERT (i < GetNSupported (station));
   return station->m_state->m_operationalRateSet[i];
 }
-uint8_t
+
+WifiMode
 WifiRemoteStationManager::GetMcsSupported (const WifiRemoteStation *station, uint32_t i) const
 {
   NS_ASSERT (i < GetNMcsSupported (station));
   return station->m_state->m_operationalMcsSet[i];
 }
-bool 
+
+uint32_t
+WifiRemoteStationManager::GetChannelWidth (const WifiRemoteStation *station) const
+{
+  return station->m_state->m_channelWidth;
+}
+
+bool
 WifiRemoteStationManager::GetShortGuardInterval (const WifiRemoteStation *station) const
 {
   return station->m_state->m_shortGuardInterval;
 }
-bool 
+
+bool
 WifiRemoteStationManager::GetGreenfield (const WifiRemoteStation *station) const
 {
   return station->m_state->m_greenfield;
 }
-bool 
+
+bool
+WifiRemoteStationManager::GetAggregation (const WifiRemoteStation *station) const
+{
+  return station->m_state->m_aggregation;
+}
+
+bool
 WifiRemoteStationManager::GetStbc (const WifiRemoteStation *station) const
 {
   return station->m_state->m_stbc;
 }
-uint32_t 
+
+uint32_t
 WifiRemoteStationManager::GetNumberOfReceiveAntennas (const WifiRemoteStation *station) const
 {
   return station->m_state->m_rx;
 }
-uint32_t 
+
+uint32_t
 WifiRemoteStationManager::GetNumberOfTransmitAntennas (const WifiRemoteStation *station) const
 {
   return station->m_state->m_tx;
 }
-uint32_t 
+
+uint32_t
 WifiRemoteStationManager::GetNess (const WifiRemoteStation *station) const
 {
   return station->m_state->m_ness;
 }
-uint32_t 
+
+uint32_t
 WifiRemoteStationManager::GetShortRetryCount (const WifiRemoteStation *station) const
 {
   return station->m_ssrc;
@@ -1452,40 +1601,43 @@
 {
   return m_wifiPhy;
 }
+
 Ptr<WifiMac>
 WifiRemoteStationManager::GetMac (void) const
 {
   return m_wifiMac;
 }
 
-uint32_t 
+uint32_t
 WifiRemoteStationManager::GetLongRetryCount (const WifiRemoteStation *station) const
 {
   return station->m_slrc;
 }
+
 uint32_t
 WifiRemoteStationManager::GetNSupported (const WifiRemoteStation *station) const
 {
   return station->m_state->m_operationalRateSet.size ();
 }
+
 uint32_t
 WifiRemoteStationManager::GetNMcsSupported (const WifiRemoteStation *station) const
 {
   return station->m_state->m_operationalMcsSet.size ();
 }
+
 void
 WifiRemoteStationManager::SetDefaultTxPowerLevel (uint8_t txPower)
 {
   m_defaultTxPowerLevel = txPower;
 }
 
-//support 11n
 uint32_t
 WifiRemoteStationManager::GetNumberOfTransmitAntennas (void)
 {
-  return m_wifiPhy->GetNumberOfTransmitAntennas();
+  return m_wifiPhy->GetNumberOfTransmitAntennas ();
 }
-//WifiRemoteStationInfo constructor
+
 WifiRemoteStationInfo::WifiRemoteStationInfo ()
   : m_memoryTime (Seconds (1.0)),
     m_lastUpdate (Seconds (0.0)),
@@ -1506,7 +1658,7 @@
 WifiRemoteStationInfo::NotifyTxSuccess (uint32_t retryCounter)
 {
   double coefficient = CalculateAveragingCoefficient ();
-  m_failAvg = (double)retryCounter / (1 + (double) retryCounter) * (1.0 - coefficient) + coefficient * m_failAvg;
+  m_failAvg = (double)retryCounter / (1 + (double)retryCounter) * (1.0 - coefficient) + coefficient * m_failAvg;
 }
 
 void
@@ -1527,4 +1679,4 @@
   NS_LOG_FUNCTION (this);
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-remote-station-manager.h ns-3.24/src/wifi/model/wifi-remote-station-manager.h
--- ns-3.23/src/wifi/model/wifi-remote-station-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-remote-station-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef WIFI_REMOTE_STATION_MANAGER_H
 #define WIFI_REMOTE_STATION_MANAGER_H
 
@@ -30,6 +31,7 @@
 #include "wifi-mode.h"
 #include "wifi-tx-vector.h"
 #include "ht-capabilities.h"
+#include "vht-capabilities.h"
 
 namespace ns3 {
 
@@ -50,10 +52,9 @@
 public:
   WifiRemoteStationInfo ();
   /**
-   * \brief Updates average frame error rate when data or RTS
-   * was transmitted successfully.
-   * \param retryCounter is slrc or ssrc value at the moment of
-   * success transmission.
+   * \brief Updates average frame error rate when data or RTS was transmitted successfully.
+   *
+   * \param retryCounter is slrc or ssrc value at the moment of success transmission.
    */
   void NotifyTxSuccess (uint32_t retryCounter);
   /// Updates average frame error rate when final data or RTS has failed.
@@ -63,6 +64,7 @@
 private:
   /**
    * \brief Calculate averaging coefficient for frame error rate. Depends on time of the last update.
+   *
    * \attention Calling this method twice gives different results,
    * because it resets time of last update.
    *
@@ -156,6 +158,11 @@
    */
   void SetFragmentationThreshold (uint32_t threshold);
   /**
+   * Typically called to update the fragmentation threshold at the start of a new transmission.
+   * This avoid that the fragmentation threshold gets changed during a transmission (see bug 730).
+   */
+  void UpdateFragmentationThreshold (void);
+  /**
    * Records HT capabilities of the remote station.
    *
    * \param from the address of the station being recorded
@@ -163,6 +170,13 @@
    */
   void AddStationHtCapabilities (Mac48Address from, HtCapabilities htcapabilities);
   /**
+   * Records VHT capabilities of the remote station.
+   *
+   * \param from the address of the station being recorded
+   * \param vhtcapabilities the VHT capabilities of the station
+   */
+  void AddStationVhtCapabilities (Mac48Address from,VhtCapabilities vhtcapabilities);
+  /**
    * Enable or disable HT capability support.
    *
    * \param enable enable or disable HT capability support
@@ -174,20 +188,32 @@
    * \return true if HT capability support is enabled, false otherwise
    */
   bool HasHtSupported (void) const;
+  /**
+   * Enable or disable VHT capability support.
+   *
+   * \param enable enable or disable VHT capability support
+   */
+  void SetVhtSupported (bool enable);
+  /**
+   * Return whether the device has VHT capability support enabled.
+   *
+   * \return true if VHT capability support is enabled, false otherwise
+   */
+  bool HasVhtSupported (void) const;
 
   /**
    * Reset the station, invoked in a STA upon dis-association or in an AP upon reboot.
    */
   void Reset (void);
+
   /**
    * Invoked in a STA upon association to store the set of rates which belong to the
    * BSSBasicRateSet of the associated AP and which are supported locally.
    * Invoked in an AP to configure the BSSBasicRateSet.
-   * 
+   *
    * \param mode the WifiMode to be added to the basic mode set
    */
   void AddBasicMode (WifiMode mode);
-
   /**
    * Return the default transmission mode.
    *
@@ -204,6 +230,7 @@
    * Return a basic mode from the set of basic modes.
    *
    * \param i index of the basic mode in the basic mode set
+   *
    * \return the basic mode at the given index
    */
   WifiMode GetBasicMode (uint32_t i) const;
@@ -211,24 +238,24 @@
    * Return whether the station supports Greenfield or not.
    *
    * \param address the address of the station
+   *
    * \return true if Greenfield is supported by the station,
-   *          false otherwise
+   *         false otherwise
    */
   bool GetGreenfieldSupported (Mac48Address address) const;
   /**
    * Add a given Modulation and Coding Scheme (MCS) index to
    * the set of basic MCS.
    *
-   * \param mcs the MCS index
+   * \param mcs the WifiMode to be added to the basic MCS set
    */
-  void AddBasicMcs (uint8_t mcs);
-
+  void AddBasicMcs (WifiMode mcs);
   /**
    * Return the default Modulation and Coding Scheme (MCS) index.
    *
-   * \return the default MCS index
+   * \return the default WifiMode
    */
-  uint8_t GetDefaultMcs (void) const;
+  WifiMode GetDefaultMcs (void) const;
   /**
    * Return the number of basic MCS index.
    *
@@ -239,16 +266,17 @@
    * Return the MCS at the given <i>list</i> index.
    *
    * \param i the position in the list
-   * \return the MCS at the given list index
+   *
+   * \return the basic mcs at the given list index
    */
-  uint8_t GetBasicMcs (uint32_t i) const;
+  WifiMode GetBasicMcs (uint32_t i) const;
   /**
    * Record the MCS index supported by the station.
-   * 
+   *
    * \param address the address of the station
-   * \param mcs the MCS index
+   * \param mcs the WifiMode supported by the station
    */
-  void AddSupportedMcs (Mac48Address address, uint8_t mcs);
+  void AddSupportedMcs (Mac48Address address, WifiMode mcs);
 
   /**
    * Return a mode for non-unicast packets.
@@ -265,6 +293,7 @@
    * \param address the address of the STA
    */
   void Reset (Mac48Address address);
+
   /**
    * Invoked in a STA or AP to store the set of
    * modes supported by a destination which is
@@ -277,29 +306,30 @@
    */
   void AddSupportedMode (Mac48Address address, WifiMode mode);
   /**
-   * Invoked in a STA or AP to store all of the modes supported 
+   * Invoked in a STA or AP to store all of the modes supported
    * by a destination which is also supported locally.
    * The set of supported modes includes the BSSBasicRateSet.
    *
    * \param address the address of the station being recorded
    */
   void AddAllSupportedModes (Mac48Address address);
-  //void  AddBssMembershipParameters(Mac48Address address, uint32_t selector);
 
   /**
    * Return whether the station state is brand new.
    *
    * \param address the address of the station
+   *
    * \return true if the state of the station is brand new,
-   *          false otherwise
+   *         false otherwise
    */
   bool IsBrandNew (Mac48Address address) const;
   /**
    * Return whether the station associated.
    *
    * \param address the address of the station
+   *
    * \return true if the station is associated,
-   *          false otherwise
+   *         false otherwise
    */
   bool IsAssociated (Mac48Address address) const;
   /**
@@ -307,8 +337,9 @@
    * the association response we sent.
    *
    * \param address the address of the station
+   *
    * \return true if the station is associated,
-   *          false otherwise
+   *         false otherwise
    */
   bool IsWaitAssocTxOk (Mac48Address address) const;
   /**
@@ -352,47 +383,45 @@
    */
   void PrepareForQueue (Mac48Address address, const WifiMacHeader *header,
                         Ptr<const Packet> packet, uint32_t fullPacketSize);
-  
+
   /**
    * \param address remote address
    * \param header MAC header
    * \param packet the packet to send
    * \param fullPacketSize the size of the packet after its 802.11 MAC header has been added.
+   *
    * \return the transmission mode to use to send this packet
    */
   WifiTxVector GetDataTxVector (Mac48Address address, const WifiMacHeader *header,
-                        Ptr<const Packet> packet, uint32_t fullPacketSize);
+                                Ptr<const Packet> packet, uint32_t fullPacketSize);
   /**
    * \param address remote address
    * \param header MAC header
    * \param packet the packet to send
    *
    * \return the transmission mode to use to send the RTS prior to the
-   *          transmission of the data packet itself.
+   *         transmission of the data packet itself.
    */
   WifiTxVector GetRtsTxVector (Mac48Address address, const WifiMacHeader *header,
-                       Ptr<const Packet> packet);
-
+                               Ptr<const Packet> packet);
   /**
    * \param header MAC header
    * \param packet the packet to send
    *
    * \return the transmission mode to use to send the CTS-to-self prior to the
-   *          transmission of the data packet itself.
+   *         transmission of the data packet itself.
    */
   WifiTxVector GetCtsToSelfTxVector (const WifiMacHeader *header,
-                       Ptr<const Packet> packet);
-
+                                     Ptr<const Packet> packet);
   /**
    * Since CTS-to-self parameters are not dependent on the station,
    * it is implemented in wifiremote station manager
    *
    * \return the transmission mode to use to send the CTS-to-self prior to the
-   *          transmission of the data packet itself.
+   *         transmission of the data packet itself.
    */
   WifiTxVector DoGetCtsToSelfTxVector (void);
 
-
   /**
    * Should be invoked whenever the RtsTimeout associated to a transmission
    * attempt expires.
@@ -413,7 +442,7 @@
    * Should be invoked whenever we receive the Cts associated to an RTS
    * we just sent. Note that we also get the SNR of the RTS we sent since
    * the receiver put a SnrTag in the CTS.
-   * 
+   *
    * \param address the address of the receiver
    * \param header MAC header of the DATA packet
    * \param ctsSnr the SNR of the CTS we received
@@ -466,8 +495,9 @@
    * \param address remote address
    * \param header MAC header
    * \param packet the packet to send
+   *
    * \return true if we want to use an RTS/CTS handshake for this
-   *          packet before sending it, false otherwise.
+   *         packet before sending it, false otherwise.
    */
   bool NeedRts (Mac48Address address, const WifiMacHeader *header,
                 Ptr<const Packet> packet);
@@ -475,7 +505,9 @@
    * Return if we need to do Cts-to-self before sending a DATA.
    *
    * \param txVector the TXVECTOR of the packet to be sent
-   * \return true if Cts-to-self is needed, false otherwise
+   *
+   * \return true if Cts-to-self is needed,
+   *         false otherwise
    */
   bool NeedCtsToSelf (WifiTxVector txVector);
 
@@ -483,8 +515,9 @@
    * \param address remote address
    * \param header MAC header
    * \param packet the packet to send
-   * \return true if we want to restart a failed RTS/CTS
-   *          handshake, false otherwise.
+   *
+   * \return true if we want to restart a failed RTS/CTS handshake,
+   *         false otherwise.
    */
   bool NeedRtsRetransmission (Mac48Address address, const WifiMacHeader *header,
                               Ptr<const Packet> packet);
@@ -492,17 +525,19 @@
    * \param address remote address
    * \param header MAC header
    * \param packet the packet to send
-   * \return true if we want to resend a packet
-   *          after a failed transmission attempt, false otherwise.
+   *
+   * \return true if we want to resend a packet after a failed transmission attempt,
+   *         false otherwise.
    */
   bool NeedDataRetransmission (Mac48Address address, const WifiMacHeader *header,
                                Ptr<const Packet> packet);
-
   /**
    * \param address remote address
    * \param header MAC header
    * \param packet the packet to send
-   * \return true if this packet should be fragmented, false otherwise.
+   *
+   * \return true if this packet should be fragmented,
+   *         false otherwise.
    */
   bool NeedFragmentation (Mac48Address address, const WifiMacHeader *header,
                           Ptr<const Packet> packet);
@@ -511,6 +546,7 @@
    * \param header MAC header
    * \param packet the packet to send
    * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
+   *
    * \return the size of the corresponding fragment.
    */
   uint32_t GetFragmentSize (Mac48Address address, const WifiMacHeader *header,
@@ -520,6 +556,7 @@
    * \param header MAC header
    * \param packet the packet to send
    * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
+   *
    * \return the offset within the original packet where this fragment starts.
    */
   uint32_t GetFragmentOffset (Mac48Address address, const WifiMacHeader *header,
@@ -529,6 +566,7 @@
    * \param header MAC header
    * \param packet the packet to send
    * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
+   *
    * \return true if this is the last fragment, false otherwise.
    */
   bool IsLastFragment (Mac48Address address, const WifiMacHeader *header,
@@ -537,30 +575,31 @@
   /**
    * \param address remote address
    * \param rtsMode the transmission mode used to send an RTS we just received
-   * \return the transmission mode to use for the CTS to complete the RTS/CTS
-   *          handshake.
+   *
+   * \return the transmission mode to use for the CTS to complete the RTS/CTS handshake.
    */
   WifiTxVector GetCtsTxVector (Mac48Address address, WifiMode rtsMode);
   /**
    * \param address
    * \param dataMode the transmission mode used to send an ACK we just received
-   * \return the transmission mode to use for the ACK to complete the data/ACK
-   *          handshake.
+   *
+   * \return the transmission mode to use for the ACK to complete the data/ACK handshake.
    */
   WifiTxVector GetAckTxVector (Mac48Address address, WifiMode dataMode);
   /**
    * \param address
    * \param dataMode the transmission mode used to send an ACK we just received
-   * \return the transmission mode to use for the ACK to complete the data/ACK
-   *          handshake.
+   *
+   * \return the transmission mode to use for the ACK to complete the data/ACK handshake.
    */
   WifiTxVector GetBlockAckTxVector (Mac48Address address, WifiMode dataMode);
   /**
    * \return the default transmission power
-   */ 
+   */
   uint8_t GetDefaultTxPowerLevel (void) const;
   /**
    * \param address of the remote station
+   *
    * \return information regarding the remote station associated with the given address
    */
   WifiRemoteStationInfo GetInfo (Mac48Address address);
@@ -570,18 +609,37 @@
    * \param txPower the default transmission power level
    */
   void SetDefaultTxPowerLevel (uint8_t txPower);
- /**
-  * \return the number of transmit antennas supported by the phy layer
-  */
- uint32_t GetNumberOfTransmitAntennas (void);
+  /**
+   * \return the number of transmit antennas supported by the phy layer
+   */
+  uint32_t GetNumberOfTransmitAntennas (void);
+
+  /**
+   * TracedCallback signature for power change events.
+   *
+   * \param [in] power The new power.
+   * \param [in] address The remote station MAC address.
+   */
+  typedef void (*PowerChangeTracedCallback)(uint8_t power, Mac48Address remoteAddress);
+
+  /**
+   * TracedCallback signature for rate change events.
+   *
+   * \param [in] rate The new rate.
+   * \param [in] address The remote station MAC address.
+   */
+  typedef void (*RateChangeTracedCallback)(uint32_t rate, Mac48Address remoteAddress);
+
 
- protected:
+
+protected:
   virtual void DoDispose (void);
   /**
    * Return whether mode associated with the specified station at the specified index.
    *
    * \param station the station being queried
    * \param i the index
+   *
    * \return WifiMode at the given index of the specified station
    */
   WifiMode GetSupported (const WifiRemoteStation *station, uint32_t i) const;
@@ -589,66 +647,92 @@
    * Return the number of modes supported by the given station.
    *
    * \param station the station being queried
+   *
    * \return the number of modes supported by the given station
    */
   uint32_t GetNSupported (const WifiRemoteStation *station) const;
   /**
-   * Return the MCS index supported by the specified station at the specified index.
+   * Return the WifiMode supported by the specified station at the specified index.
    *
    * \param station the station being queried
    * \param i the index
-   * \return the MCS index at the given index of the specified station
+   *
+   * \return the WifiMode at the given index of the specified station
    */
-  uint8_t GetMcsSupported (const WifiRemoteStation *station, uint32_t i) const;
+  WifiMode GetMcsSupported (const WifiRemoteStation *station, uint32_t i) const;
   /**
    * Return the number of MCS supported by the given station.
    *
    * \param station the station being queried
+   *
    * \return the number of MCS supported by the given station
    */
   uint32_t GetNMcsSupported (const WifiRemoteStation *station) const;
-
+  /**
+   * Return the channel width supported by the station.
+   *
+   * \param station the station being queried
+   *
+   * \return the channel width (in MHz) supported by the station
+   */
+  uint32_t GetChannelWidth (const WifiRemoteStation *station) const;
   /**
    * Return whether the given station supports short guard interval.
    *
    * \param station the station being queried
+   *
    * \return true if the station supports short guard interval,
-   *          false otherwise
+   *         false otherwise
    */
   bool GetShortGuardInterval (const WifiRemoteStation *station) const;
   /**
+   * Return whether the given station supports A-MPDU.
+   *
+   * \param station the station being queried
+   *
+   * \return true if the station supports MPDU aggregation,
+   *         false otherwise
+   */
+  bool GetAggregation (const WifiRemoteStation *station) const;
+  /**
    * Return whether the given station supports space-time block coding (STBC).
    *
    * \param station the station being queried
-   * \return true if the station supports STBC, false otherwise
+   *
+   * \return true if the station supports STBC,
+   *         false otherwise
    */
   bool GetStbc (const WifiRemoteStation *station) const;
   /**
    * Return whether the station supports Greenfield or not.
    *
    * \param station the station being queried
+   *
    * \return true if Greenfield is supported by the station,
-   *          false otherwise
+   *         false otherwise
    */
   bool GetGreenfield (const WifiRemoteStation *station) const;
   /**
-   * Return the number of receive antenna the station has.
+   * Return the number of receive antennas the station has.
    *
    * \param station the station being queried
-   * \return the number of receive antenna the station has
+   *
+   * \return the number of receive antennas the station has
    */
   uint32_t GetNumberOfReceiveAntennas (const WifiRemoteStation *station) const;
   /**
-   * Return the number of transmit antenna the station has.
+   * Return the number of transmit antennas the station has.
    *
    * \param station the station being queried
-   * \return the number of transmit antenna the station has
+   *
+   * \return the number of transmit antennas the station has
    */
   uint32_t GetNumberOfTransmitAntennas (const WifiRemoteStation *station) const;
   /**
    * \returns the number of Ness the station has.
    *
    * \param station the station being queried
+   *
    * \return the number of Ness the station has
    */
   uint32_t GetNess (const WifiRemoteStation *station) const;
@@ -656,6 +740,7 @@
    * Return the long retry limit of the given station.
    *
    * \param station the station being queried
+   *
    * \return the long retry limit of the the station
    */
   uint32_t GetLongRetryCount (const WifiRemoteStation *station) const;
@@ -663,6 +748,7 @@
    * Return the short retry limit of the given station.
    *
    * \param station the station being queried
+   *
    * \return the short retry limit of the the station
    */
   uint32_t GetShortRetryCount (const WifiRemoteStation *station) const;
@@ -680,14 +766,16 @@
    */
   Ptr<WifiMac> GetMac (void) const;
 
+
 private:
   /**
    * \param station the station that we need to communicate
    * \param packet the packet to send
    * \param normally indicates whether the normal 802.11 rts enable mechanism would
    *        request that the rts is sent or not.
-   * \return true if we want to use an RTS/CTS handshake for this
-   *          packet before sending it, false otherwise.
+   *
+   * \return true if we want to use an RTS/CTS handshake for this packet before sending it,
+   *         false otherwise.
    *
    * Note: This method is called before a unicast packet is sent on the medium.
    */
@@ -698,8 +786,9 @@
    * \param packet the packet to send
    * \param normally indicates whether the normal 802.11 rts enable mechanism would
    *        request that the rts is retransmitted or not.
-   * \return true if we want to restart a failed RTS/CTS
-   *          handshake, false otherwise.
+   *
+   * \return true if we want to restart a failed RTS/CTS handshake,
+   *         false otherwise.
    *
    * Note: This method is called after an rts/cts handshake has been attempted
    *       and has failed.
@@ -711,29 +800,29 @@
    * \param packet the packet to send
    * \param normally indicates whether the normal 802.11 data retransmission mechanism
    *        would request that the data is retransmitted or not.
-   * \return true if we want to resend a packet
-   *          after a failed transmission attempt, false otherwise.
+   * \return true if we want to resend a packet after a failed transmission attempt,
+   *         false otherwise.
    *
    * Note: This method is called after a unicast packet transmission has been attempted
    *       and has failed.
    */
   virtual bool DoNeedDataRetransmission (WifiRemoteStation *station,
                                          Ptr<const Packet> packet, bool normally);
-
   /**
    * \param station the station that we need to communicate
    * \param packet the packet to send
    * \param normally indicates whether the normal 802.11 data fragmentation mechanism
    *        would request that the data packet is fragmented or not.
-   * \return true if this packet should be fragmented, false otherwise.
+   *
+   * \return true if this packet should be fragmented,
+   *         false otherwise.
    *
    * Note: This method is called before sending a unicast packet.
    */
   virtual bool DoNeedFragmentation (WifiRemoteStation *station,
                                     Ptr<const Packet> packet, bool normally);
   /**
-   * \return whether this manager is a manager designed to work in low-latency
-   *          environments.
+   * \return whether this manager is a manager designed to work in low-latency environments.
    *
    * Note: In this context, low vs high latency is defined in <i>IEEE 802.11 Rate Adaptation:
    * A Practical Approach</i>, by M. Lacage, M.H. Manshaei, and T. Turletti.
@@ -743,63 +832,62 @@
    * \return a new station data structure
    */
   virtual WifiRemoteStation* DoCreateStation (void) const = 0;
- /**
-   * \param station the station that we need to communicate
-   * \param size size of the packet or fragment we want to send
-   * \return the transmission mode to use to send a packet to the station
-   *
-   * Note: This method is called before sending a unicast packet or a fragment
-   *       of a unicast packet to decide which transmission mode to use.
-   */
-  virtual WifiTxVector DoGetDataTxVector (WifiRemoteStation *station,
-                                  uint32_t size) = 0;
+  /**
+    * \param station the station that we need to communicate
+    * \param size size of the packet or fragment we want to send
+    *
+    * \return the transmission mode to use to send a packet to the station
+    *
+    * Note: This method is called before sending a unicast packet or a fragment
+    *       of a unicast packet to decide which transmission mode to use.
+    */
+  virtual WifiTxVector DoGetDataTxVector (WifiRemoteStation *station, uint32_t size) = 0;
   /**
    * \param station the station that we need to communicate
+   *
    * \return the transmission mode to use to send an rts to the station
    *
    * Note: This method is called before sending an rts to a station
    *       to decide which transmission mode to use for the rts.
    */
   virtual WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) = 0;
-
-  
-  /** 
+  /**
    * \param address the address of the recipient of the CTS
-   * \param ctsMode the mode to be used for the CTS 
-   * 
+   * \param ctsMode the mode to be used for the CTS
+   *
    * \return the power level to be used to send the CTS
    */
   virtual uint8_t DoGetCtsTxPowerLevel (Mac48Address address, WifiMode ctsMode);
-
-  /** 
+  /**
    * \param address the address of the recipient of the ACK
-   * \param ackMode the mode to be used for the ACK 
-   * 
+   * \param ackMode the mode to be used for the ACK
+   *
    * \return the power level to be used to send the ACK
-   */  
+   */
   virtual uint8_t DoGetAckTxPowerLevel (Mac48Address address, WifiMode ackMode);
-
-  /** 
+  /**
    * \param address the address of the recipient of the Block ACK
-   * \param blockAckMode the mode to be used for the Block ACK 
-   * 
+   * \param blockAckMode the mode to be used for the Block ACK
+   *
    * \return the power level to be used to send the Block ACK
-   */  
+   */
   virtual uint8_t DoGetBlockAckTxPowerLevel (Mac48Address address, WifiMode blockAckMode);
 
+  virtual uint32_t DoGetCtsTxChannelWidth (Mac48Address address, WifiMode ctsMode);
   virtual bool DoGetCtsTxGuardInterval (Mac48Address address, WifiMode ctsMode);
-
-  virtual uint8_t DoGetCtsTxNss(Mac48Address address, WifiMode ctsMode);
-  virtual uint8_t DoGetCtsTxNess(Mac48Address address, WifiMode ctsMode);
-  virtual bool  DoGetCtsTxStbc(Mac48Address address, WifiMode ctsMode);
-  virtual bool DoGetAckTxGuardInterval(Mac48Address address, WifiMode ackMode);
-  virtual uint8_t DoGetAckTxNss(Mac48Address address, WifiMode ackMode);
-  virtual uint8_t DoGetAckTxNess(Mac48Address address, WifiMode ackMode);
-  virtual bool DoGetAckTxStbc(Mac48Address address, WifiMode ackMode);
-  virtual bool DoGetBlockAckTxGuardInterval(Mac48Address address, WifiMode blockAckMode);
-  virtual uint8_t DoGetBlockAckTxNss(Mac48Address address, WifiMode blockAckMode);
-  virtual uint8_t DoGetBlockAckTxNess(Mac48Address address, WifiMode blockAckMode);
-  virtual bool DoGetBlockAckTxStbc(Mac48Address address, WifiMode blockAckMode);
+  virtual uint8_t DoGetCtsTxNss (Mac48Address address, WifiMode ctsMode);
+  virtual uint8_t DoGetCtsTxNess (Mac48Address address, WifiMode ctsMode);
+  virtual bool  DoGetCtsTxStbc (Mac48Address address, WifiMode ctsMode);
+  virtual uint32_t DoGetAckTxChannelWidth (Mac48Address address, WifiMode ctsMode);
+  virtual bool DoGetAckTxGuardInterval (Mac48Address address, WifiMode ackMode);
+  virtual uint8_t DoGetAckTxNss (Mac48Address address, WifiMode ackMode);
+  virtual uint8_t DoGetAckTxNess (Mac48Address address, WifiMode ackMode);
+  virtual bool DoGetAckTxStbc (Mac48Address address, WifiMode ackMode);
+  virtual uint32_t DoGetBlockAckTxChannelWidth (Mac48Address address, WifiMode ctsMode);
+  virtual bool DoGetBlockAckTxGuardInterval (Mac48Address address, WifiMode blockAckMode);
+  virtual uint8_t DoGetBlockAckTxNss (Mac48Address address, WifiMode blockAckMode);
+  virtual uint8_t DoGetBlockAckTxNess (Mac48Address address, WifiMode blockAckMode);
+  virtual bool DoGetBlockAckTxStbc (Mac48Address address, WifiMode blockAckMode);
 
   /**
    * This method is a pure virtual method that must be implemented by the sub-class.
@@ -874,6 +962,7 @@
    *
    * \param address the address of the station
    * \param tid the TID
+   *
    * \return WifiRemoteStation corresponding to the address
    */
   WifiRemoteStation* Lookup (Mac48Address address, uint8_t tid) const;
@@ -884,9 +973,11 @@
    *
    * \param address the address of the station
    * \param header MAC header
+   *
    * \return WifiRemoteStation corresponding to the address
    */
   WifiRemoteStation* Lookup (Mac48Address address, const WifiMacHeader *header) const;
+
   WifiMode GetControlAnswerMode (Mac48Address address, WifiMode reqMode);
 
   /**
@@ -898,7 +989,7 @@
   void DoSetFragmentationThreshold (uint32_t threshold);
   /**
    * Return the current fragmentation threshold
-   * 
+   *
    * \return the fragmentation threshold
    */
   uint32_t DoGetFragmentationThreshold (void) const;
@@ -907,6 +998,7 @@
    *
    * \param header MAC header
    * \param packet the packet to be fragmented
+   *
    * \return the number of fragments needed
    */
   uint32_t GetNFragments (const WifiMacHeader *header, Ptr<const Packet> packet);
@@ -920,8 +1012,6 @@
    */
   typedef std::vector <WifiRemoteStationState *> StationStates;
 
-  StationStates m_states;  //!< States of known stations
-  Stations m_stations;  //!< Information for each known stations
   /**
    * This is a pointer to the WifiPhy associated with this
    * WifiRemoteStationManager that is set on call to
@@ -939,8 +1029,6 @@
    * interframe spaces.
    */
   Ptr<WifiMac> m_wifiMac;
-  WifiMode m_defaultTxMode;  //!< The default transmission mode
-  uint8_t m_defaultTxMcs;  //!< The default transmission modulation-coding scheme (MCS)
 
   /**
    * This member is the list of WifiMode objects that comprise the
@@ -951,13 +1039,21 @@
    * WifiRemoteStationManager::GetBasicMode().
    */
   WifiModeList m_bssBasicRateSet;
-  WifiMcsList m_bssBasicMcsSet;
+  WifiModeList m_bssBasicMcsSet;
+
+  StationStates m_states;  //!< States of known stations
+  Stations m_stations;     //!< Information for each known stations
+
+  WifiMode m_defaultTxMode; //!< The default transmission mode
+  WifiMode m_defaultTxMcs;   //!< The default transmission modulation-coding scheme (MCS)
 
   bool m_htSupported;  //!< Flag if HT capability is supported
+  bool m_vhtSupported; //!< Flag if VHT capability is supported
   uint32_t m_maxSsrc;  //!< Maximum STA short retry count (SSRC)
   uint32_t m_maxSlrc;  //!< Maximum STA long retry count (SLRC)
   uint32_t m_rtsCtsThreshold;  //!< Threshold for RTS/CTS
-  uint32_t m_fragmentationThreshold;  //!< Threshold for fragmentation
+  uint32_t m_fragmentationThreshold;  //!< Current threshold for fragmentation
+  uint32_t m_nextFragmentationThreshold;  //!< Threshold for fragmentation that will be used for the next transmission
   uint8_t m_defaultTxPowerLevel;  //!< Default tranmission power level
   WifiMode m_nonUnicastMode;  //!< Transmission mode for non-unicast DATA frames
 
@@ -979,7 +1075,6 @@
    * exceeded the maximum number of attempts
    */
   TracedCallback<Mac48Address> m_macTxFinalDataFailed;
-
 };
 
 /**
@@ -1008,16 +1103,18 @@
    * WifiRemoteStationManager::GetSupported().
    */
   WifiModeList m_operationalRateSet;
-  WifiMcsList m_operationalMcsSet;
+  WifiModeList m_operationalMcsSet;
   Mac48Address m_address;  //!< Mac48Address of the remote station
   WifiRemoteStationInfo m_info;
-  bool m_shortGuardInterval;  //!< Flag if short guard interval is supported by the remote station
-  uint32_t m_rx;  //!< Number of RX antennas of the remote station
-  uint32_t m_tx;  //!< Number of TX antennas of the remote station
-  uint32_t m_ness;  //!< Number of streams in beamforming of the remote station
-  bool m_stbc;  //!< Flag if STBC is used by the remote station
-  bool m_greenfield;  //!< Flag if green field is used by the remote station
 
+  uint32_t m_channelWidth;    //!< Channel width (in MHz) supported by the remote station
+  bool m_shortGuardInterval;  //!< Flag if short guard interval is supported by the remote station
+  uint32_t m_rx;              //!< Number of RX antennas of the remote station
+  uint32_t m_tx;              //!< Number of TX antennas of the remote station
+  uint32_t m_ness;            //!< Number of streams in beamforming of the remote station
+  bool m_stbc;                //!< Flag if STBC is used by the remote station
+  bool m_aggregation;         //!< Flag if MPDU aggregation is used by the remote station
+  bool m_greenfield;          //!< Flag if green field is used by the remote station
 };
 
 /**
@@ -1028,19 +1125,18 @@
  * network and to perform the selection of tx parameters
  * on a per-packet basis.
  *
- * This class is typically subclassed and extended by 
+ * This class is typically subclassed and extended by
  * rate control implementations
  */
 struct WifiRemoteStation
 {
   virtual ~WifiRemoteStation ();
-  WifiRemoteStationState *m_state; //!< Remote station state
-  uint32_t m_ssrc; //!< STA short retry count
-  uint32_t m_slrc; //!< STA long retry count
-  uint8_t m_tid; //!< traffic ID
+  WifiRemoteStationState *m_state;  //!< Remote station state
+  uint32_t m_ssrc;                  //!< STA short retry count
+  uint32_t m_slrc;                  //!< STA long retry count
+  uint8_t m_tid;                    //!< traffic ID
 };
 
-
-} // namespace ns3
+} //namespace ns3
 
 #endif /* WIFI_REMOTE_STATION_MANAGER_H */
diff -Naur ns-3.23/src/wifi/model/wifi-tx-current-model.cc ns-3.24/src/wifi/model/wifi-tx-current-model.cc
--- ns-3.23/src/wifi/model/wifi-tx-current-model.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/model/wifi-tx-current-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,143 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 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 <stefano.avallone@unina.it>
+ */
+
+#include "wifi-tx-current-model.h"
+#include "ns3/log.h"
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/string.h"
+#include "ns3/pointer.h"
+#include <cmath>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("WifiTxCurrentModel");
+
+// ------------------------------------------------------------------------- //
+
+NS_OBJECT_ENSURE_REGISTERED (WifiTxCurrentModel);
+
+TypeId 
+WifiTxCurrentModel::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::WifiTxCurrentModel")
+    .SetParent<Object> ()
+    .SetGroupName ("Energy")
+  ;
+  return tid;
+}
+
+WifiTxCurrentModel::WifiTxCurrentModel()
+{
+}
+
+WifiTxCurrentModel::~WifiTxCurrentModel()
+{
+}
+
+double
+WifiTxCurrentModel::DbmToW (double dbm)
+{
+  double mW = std::pow (10.0, dbm / 10.0);
+  return mW / 1000.0;
+}
+
+// ------------------------------------------------------------------------- //
+
+NS_OBJECT_ENSURE_REGISTERED (LinearWifiTxCurrentModel);
+
+TypeId 
+LinearWifiTxCurrentModel::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::LinearWifiTxCurrentModel")
+    .SetParent<WifiTxCurrentModel> ()
+    .AddConstructor<LinearWifiTxCurrentModel> ()
+    .AddAttribute ("Eta", "The efficiency of the power amplifier.",
+                   DoubleValue (0.10),
+                   MakeDoubleAccessor (&LinearWifiTxCurrentModel::SetEta,
+                                       &LinearWifiTxCurrentModel::GetEta),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("Voltage", "The supply voltage (in Volts).",
+                   DoubleValue (3.0),
+                   MakeDoubleAccessor (&LinearWifiTxCurrentModel::SetVoltage,
+                                       &LinearWifiTxCurrentModel::GetVoltage),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("IdleCurrent", "The current in the IDLE state (in Watts).",
+                   DoubleValue (0.273333),
+                   MakeDoubleAccessor (&LinearWifiTxCurrentModel::SetIdleCurrent,
+                                       &LinearWifiTxCurrentModel::GetIdleCurrent),
+                   MakeDoubleChecker<double> ())
+  ;
+  return tid;
+}
+
+LinearWifiTxCurrentModel::LinearWifiTxCurrentModel ()
+{
+}
+
+LinearWifiTxCurrentModel::~LinearWifiTxCurrentModel()
+{
+}
+
+void
+LinearWifiTxCurrentModel::SetEta (double eta)
+{
+  m_eta = eta;
+}
+
+void
+LinearWifiTxCurrentModel::SetVoltage (double voltage)
+{
+  m_voltage = voltage;
+}
+
+void
+LinearWifiTxCurrentModel::SetIdleCurrent (double idleCurrent)
+{
+  m_idleCurrent = idleCurrent;
+}
+
+double
+LinearWifiTxCurrentModel::GetEta (void) const
+{
+  return m_eta;
+}
+
+double
+LinearWifiTxCurrentModel::GetVoltage (void) const
+{
+  return m_voltage;
+}
+
+double
+LinearWifiTxCurrentModel::GetIdleCurrent (void) const
+{
+  return m_idleCurrent;
+}
+
+double
+LinearWifiTxCurrentModel::CalcTxCurrent (double txPowerDbm) const
+{
+  return DbmToW (txPowerDbm) / (m_voltage * m_eta) + m_idleCurrent;
+}
+
+// ------------------------------------------------------------------------- //
+
+} // namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-tx-current-model.h ns-3.24/src/wifi/model/wifi-tx-current-model.h
--- ns-3.23/src/wifi/model/wifi-tx-current-model.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/src/wifi/model/wifi-tx-current-model.h	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,142 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 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 <stefano.avallone@unina.it>
+ */
+
+#ifndef WIFI_TX_CURRENT_MODEL_H
+#define WIFI_TX_CURRENT_MODEL_H
+
+#include "ns3/object.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup energy
+ * 
+ * \brief Modelize the transmit current as a function of the transmit power and mode
+ *
+ */
+class WifiTxCurrentModel : public Object
+{
+public:
+  static TypeId GetTypeId (void);
+
+  WifiTxCurrentModel ();
+  virtual ~WifiTxCurrentModel ();
+
+  /**
+   * \param txPowerDbm the nominal tx power in dBm
+   * \returns the transmit current (in Ampere)
+   */
+  virtual double CalcTxCurrent (double txPowerDbm) const = 0;
+
+  /**
+   * Convert from dBm to Watts.
+   *
+   * \param dbm the power in dBm
+   * \return the equivalent Watts for the given dBm
+   */
+  static double DbmToW (double dbm);
+};
+
+/**
+ * \ingroup energy
+ *
+ * \brief a linear model of the Wifi transmit current
+ *
+ * This model assumes that the transmit current is a linear function
+ * of the nominal transmit power used to send the frame.
+ * In particular, the power absorbed during the transmission of a frame \f$ W_{tx} \f$
+ * is given by the power absorbed by the power amplifier \f$ W_{pa} \f$ plus the power
+ * absorbed by the RF subsystem. The latter is assumed to be the same as the power
+ * absorbed in the IDLE state \f$ W_{idle} \f$.
+ * 
+ * The efficiency \f$ \eta \f$ of the power amplifier is given by 
+ * \f$ \eta = \frac{P_{tx}}{W_{pa}} \f$, where \f$ P_{tx} \f$ is the output power, i.e.,
+ * the nominal transmit power. Hence, \f$ W_{pa} = \frac{P_{tx}}{\eta} \f$
+ * 
+ * It turns out that \f$ W_{tx} = \frac{P_{tx}}{\eta} + W_{idle} \f$. By dividing both
+ * sides by the supply voltage \f$ V \f$: \f$ I_{tx} = \frac{P_{tx}}{V \cdot \eta} + I_{idle} \f$,
+ * where \f$ I_{tx} \f$ and \f$ I_{idle} \f$ are, respectively, the transmit current and
+ * the idle current.
+ * 
+ * For more information, refer to:
+ * Francesco Ivan Di Piazza, Stefano Mangione, and Ilenia Tinnirello.
+ * "On the Effects of Transmit Power Control on the Energy Consumption of WiFi Network Cards",
+ * Proceedings of ICST QShine 2009, pp. 463--475
+ * 
+ * If the tx current corresponding to a given nominal transmit power is known, the efficiency
+ * of the power amplifier is given by the above formula:
+ * \f$ \eta = \frac{P_{tx}}{(I_{tx}-I_{idle})\cdot V} \f$
+ * 
+ */
+class LinearWifiTxCurrentModel : public WifiTxCurrentModel
+{
+public:
+  static TypeId GetTypeId (void);
+
+  LinearWifiTxCurrentModel ();
+  virtual ~LinearWifiTxCurrentModel ();
+  
+  /**
+   * \param eta (dimension-less)
+   *
+   * Set the power amplifier efficiency.
+   */
+  void SetEta (double eta);
+
+  /**
+   * \param voltage (Volts)
+   *
+   * Set the supply voltage.
+   */
+  void SetVoltage (double voltage);
+
+  /**
+   * \param idleCurrent (Ampere)
+   *
+   * Set the current in the IDLE state.
+   */
+  void SetIdleCurrent (double idleCurrent);
+
+  /**
+   * \return the power amplifier efficiency.
+   */
+  double GetEta (void) const;
+
+  /**
+   * \return the supply voltage.
+   */
+  double GetVoltage (void) const;
+
+  /**
+   * \return the current in the IDLE state.
+   */
+  double GetIdleCurrent (void) const;
+
+  double CalcTxCurrent (double txPowerDbm) const;
+
+private:
+  double m_eta;
+  double m_voltage;
+  double m_idleCurrent;
+};
+
+} // namespace ns3
+
+#endif /* WIFI_TX_CURRENT_MODEL_H */
diff -Naur ns-3.23/src/wifi/model/wifi-tx-vector.cc ns-3.24/src/wifi/model/wifi-tx-vector.cc
--- ns-3.23/src/wifi/model/wifi-tx-vector.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-tx-vector.cc	2015-09-15 11:18:44.000000000 -0700
@@ -3,7 +3,7 @@
  * Copyright (c) 2010 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 
+ * 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,
@@ -15,8 +15,8 @@
  * 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>
- *       : Ghada Badawy <gbadawy@gmail.com>
+ * Authors: Nicola Baldo <nbaldo@cttc.es>
+ *          Ghada Badawy <gbadawy@gmail.com>
  */
 
 #include "ns3/wifi-tx-vector.h"
@@ -26,9 +26,11 @@
 
 WifiTxVector::WifiTxVector ()
   : m_retries (0),
+    m_channelWidth (20),
     m_shortGuardInterval (false),
     m_nss (1),
     m_ness (0),
+    m_aggregation (false),
     m_stbc (false),
     m_modeInitialized (false),
     m_txPowerLevelInitialized (false)
@@ -36,14 +38,17 @@
 }
 
 WifiTxVector::WifiTxVector (WifiMode mode, uint8_t powerLevel, uint8_t retries,
-                            bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc)
+                            bool shortGuardInterval, uint8_t nss, uint8_t ness,
+                            uint32_t channelWidth, bool aggregation, bool stbc)
   : m_mode (mode),
     m_txPowerLevel (powerLevel),
     m_retries (retries),
-    m_shortGuardInterval(shortGuardInterval),
-    m_nss(nss),
-    m_ness(ness),
-    m_stbc(stbc),
+    m_channelWidth (channelWidth),
+    m_shortGuardInterval (shortGuardInterval),
+    m_nss (nss),
+    m_ness (ness),
+    m_aggregation (aggregation),
+    m_stbc (stbc),
     m_modeInitialized (true),
     m_txPowerLevelInitialized (true)
 {
@@ -58,7 +63,8 @@
     }
   return m_mode;
 }
-uint8_t 
+
+uint8_t
 WifiTxVector::GetTxPowerLevel (void) const
 {
   if (!m_txPowerLevelInitialized)
@@ -67,80 +73,117 @@
     }
   return m_txPowerLevel;
 }
-uint8_t 
+
+uint8_t
 WifiTxVector::GetRetries (void) const
 {
   return m_retries;
 }
-bool 
+
+uint32_t
+WifiTxVector::GetChannelWidth (void) const
+{
+  return m_channelWidth;
+}
+
+bool
 WifiTxVector::IsShortGuardInterval (void) const
 {
- return m_shortGuardInterval;
+  return m_shortGuardInterval;
 }
-uint8_t 
+
+uint8_t
 WifiTxVector::GetNss (void) const
 {
   return m_nss;
 }
-uint8_t 
+
+uint8_t
 WifiTxVector::GetNess (void) const
 {
   return m_ness;
 }
-bool 
+
+bool
+WifiTxVector::IsAggregation (void) const
+{
+  return m_aggregation;
+}
+
+bool
 WifiTxVector::IsStbc (void) const
 {
   return m_stbc;
 }
 
-void 
+void
 WifiTxVector::SetMode (WifiMode mode)
 {
-  m_mode=mode;
+  m_mode = mode;
   m_modeInitialized = true;
 }
-void 
+
+void
 WifiTxVector::SetTxPowerLevel (uint8_t powerlevel)
 {
-  m_txPowerLevel=powerlevel;
+  m_txPowerLevel = powerlevel;
   m_txPowerLevelInitialized = true;
 }
-void 
+
+void
 WifiTxVector::SetRetries (uint8_t retries)
 {
   m_retries = retries;
 }
-void 
+
+void
+WifiTxVector::SetChannelWidth (uint32_t channelWidth)
+{
+  m_channelWidth = channelWidth;
+}
+
+void
 WifiTxVector::SetShortGuardInterval (bool guardinterval)
 {
-  m_shortGuardInterval=guardinterval;
+  m_shortGuardInterval = guardinterval;
 }
-void 
+
+void
 WifiTxVector::SetNss (uint8_t nss)
 {
-  m_nss= nss;
+  m_nss = nss;
 }
-void 
+
+void
 WifiTxVector::SetNess (uint8_t ness)
 {
-  m_ness=ness;
+  m_ness = ness;
+}
+
+void
+WifiTxVector::SetAggregation (bool aggregation)
+{
+  m_aggregation = aggregation;
 }
-void 
+
+void
 WifiTxVector::SetStbc (bool stbc)
 {
-  m_stbc=stbc;
+  m_stbc = stbc;
 }
 
 std::ostream & operator << ( std::ostream &os, const WifiTxVector &v)
-{ 
-  os << "mode:" << v.GetMode() <<
-    " txpwrlvl:" << (uint32_t)v.GetTxPowerLevel() <<
-    " retries:" << (uint32_t)v.GetRetries() <<
-    " Short GI: " << v.IsShortGuardInterval() <<
-    " Nss: " << (uint32_t)v.GetNss() <<
-    " Ness: " << (uint32_t)v.GetNess() <<
-    " STBC: " << v.IsStbc();
+{
+  os << "mode: " << v.GetMode () <<
+    " txpwrlvl: " << (uint32_t)v.GetTxPowerLevel () <<
+    " retries: " << (uint32_t)v.GetRetries () <<
+    " channel width: " << v.GetChannelWidth () <<
+    " Short GI: " << v.IsShortGuardInterval () <<
+    " Nss: " << (uint32_t)v.GetNss () <<
+    " Ness: " << (uint32_t)v.GetNess () <<
+    " MPDU aggregation: " << v.IsAggregation () <<
+    " STBC: " << v.IsStbc ();
   return os;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/wifi-tx-vector.h ns-3.24/src/wifi/model/wifi-tx-vector.h
--- ns-3.23/src/wifi/model/wifi-tx-vector.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/wifi-tx-vector.h	2015-09-15 11:18:44.000000000 -0700
@@ -3,7 +3,7 @@
  * Copyright (c) 2010 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 
+ * 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,
@@ -15,8 +15,8 @@
  * 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>
- *       : Ghada Badawy <gbadawy@gmail.com>
+ * Authors: Nicola Baldo <nbaldo@cttc.es>
+ *          Ghada Badawy <gbadawy@gmail.com>
  */
 
 #ifndef WIFI_TX_VECTOR_H
@@ -36,17 +36,17 @@
  * parameters".
  *
  * If this class is constructed with the constructor that takes no
- * arguments, then the client must explicitly set the mode and 
+ * arguments, then the client must explicitly set the mode and
  * transmit power level parameters before using them.  Default
  * member initializers are provided for the other parameters, to
  * conform to a non-MIMO/long guard configuration, although these
  * may also be explicitly set after object construction.
  *
- * When used in a infrastructure context, WifiTxVector values should be 
- * drawn from WifiRemoteStationManager parameters since rate adaptation 
- * is responsible for picking the mode, number of streams, etc., but in 
- * the case in which there is no such manager (e.g. mesh), the client 
- * still needs to initialize at least the mode and transmit power level 
+ * When used in a infrastructure context, WifiTxVector values should be
+ * drawn from WifiRemoteStationManager parameters since rate adaptation
+ * is responsible for picking the mode, number of streams, etc., but in
+ * the case in which there is no such manager (e.g. mesh), the client
+ * still needs to initialize at least the mode and transmit power level
  * appropriately.
  *
  * \note the above reference is valid for the DSSS PHY only (clause
@@ -71,11 +71,21 @@
    * \param shortGuardInterval enable or disable short guard interval
    * \param nss the number of spatial STBC streams (NSS)
    * \param ness the number of extension spatial streams (NESS)
+   * \param channelWidth the channel width in MHz
+   * \param aggregation enable or disable MPDU aggregation
    * \param stbc enable or disable STBC
    */
-  WifiTxVector (WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc);
+  WifiTxVector (WifiMode mode,
+                uint8_t powerLevel,
+                uint8_t retries,
+                bool shortGuardInterval,
+                uint8_t nss,
+                uint8_t ness,
+                uint32_t channelWidth,
+                bool aggregation,
+                bool stbc);
   /**
-   *  \returns the txvector payload mode
+   * \returns the selected payload transmission mode
    */
   WifiMode GetMode (void) const;
   /**
@@ -85,7 +95,7 @@
   */
   void SetMode (WifiMode mode);
   /**
-   *  \returns the transmission power level
+   * \returns the transmission power level
    */
   uint8_t GetTxPowerLevel (void) const;
   /**
@@ -95,7 +105,7 @@
    */
   void SetTxPowerLevel (uint8_t powerlevel);
   /**
-   *  \returns the number of retries
+   * \returns the number of retries
    */
   uint8_t GetRetries (void) const;
   /**
@@ -105,17 +115,27 @@
    */
   void SetRetries (uint8_t retries);
   /**
-   *  \returns if ShortGuardInterval is used or not
+   * \returns the channel width (in MHz)
    */
-  bool IsShortGuardInterval (void) const;
-   /**
-   * Sets if short gurad interval is being used
+  uint32_t GetChannelWidth (void) const;
+  /**
+   * Sets the selected channelWidth (in MHz)
    *
-   * \param guardinterval enable or disable short guard interval
+   * \param channelWidth
    */
+  void SetChannelWidth (uint32_t channelWidth);
+  /**
+   * \returns if ShortGuardInterval is used or not
+   */
+  bool IsShortGuardInterval (void) const;
+  /**
+  * Sets if short gurad interval is being used
+  *
+  * \param guardinterval enable or disable short guard interval
+  */
   void SetShortGuardInterval (bool guardinterval);
   /**
-   *  \returns the number of Nss
+   * \returns the number of Nss
    */
   uint8_t GetNss (void) const;
   /**
@@ -125,7 +145,7 @@
    */
   void SetNss (uint8_t nss);
   /**
-   *  \returns the number of Ness  
+   * \returns the number of Ness
    */
   uint8_t GetNess (void) const;
   /**
@@ -135,8 +155,21 @@
    */
   void SetNess (uint8_t ness);
   /**
+   * Checks whether the PSDU contains A-MPDU.
+   *  \returns true if this PSDU has A-MPDU aggregation,
+   *           false otherwise.
+   */
+  bool IsAggregation (void) const;
+  /**
+   * Sets if PSDU contains A-MPDU.
+   *
+   * \param aggregated whether the PSDU contains A-MPDU or not.
+   */
+  void SetAggregation (bool aggregation);
+  /**
    * Check if STBC is used or not
-   *  \returns true if STBC is used,
+   *
+   * \returns true if STBC is used,
    *           false otherwise
    */
   bool IsStbc (void) const;
@@ -147,25 +180,25 @@
    */
   void SetStbc (bool stbc);
 
-  
-private:
 
-  WifiMode m_mode;         /**< The DATARATE parameter in Table 15-4. 
-                           It is the value that will be passed
-                           to PMD_RATE.request */ 
-  uint8_t  m_txPowerLevel;  /**< The TXPWR_LEVEL parameter in Table 15-4. 
-                           It is the value that will be passed
-                           to PMD_TXPWRLVL.request */ 
-  uint8_t  m_retries;      /**< The DATA_RETRIES/RTS_RETRIES parameter
-                           for Click radiotap information */
+private:
+  WifiMode m_mode;               /**< The DATARATE parameter in Table 15-4.
+                                 It is the value that will be passed
+                                 to PMD_RATE.request */
+  uint8_t  m_txPowerLevel;       /**< The TXPWR_LEVEL parameter in Table 15-4.
+                                 It is the value that will be passed
+                                 to PMD_TXPWRLVL.request */
+  uint8_t  m_retries;            /**< The DATA_RETRIES/RTS_RETRIES parameter
+                                 for Click radiotap information */
+  uint32_t m_channelWidth;       /**< channel width in MHz */
   bool     m_shortGuardInterval; /**< true if short GI is going to be used */
-  uint8_t  m_nss; /**< number of streams */
-  uint8_t  m_ness; /**< number of streams in beamforming */
-  bool     m_stbc; /**< STBC used or not */
+  uint8_t  m_nss;                /**< number of streams */
+  uint8_t  m_ness;               /**< number of streams in beamforming */
+  bool     m_aggregation;        /** Flag whether the PSDU contains A-MPDU. */
+  bool     m_stbc;               /**< STBC used or not */
 
-  bool     m_modeInitialized; //*< Internal initialization flag */
+  bool     m_modeInitialized;         //*< Internal initialization flag */
   bool     m_txPowerLevelInitialized; //*< Internal initialization flag */
-
 };
 
 /**
@@ -173,10 +206,11 @@
  *
  * \param os
  * \param v
+ *
  * \return ostream
  */
-std::ostream & operator << (std::ostream & os,const WifiTxVector &v); 
+std::ostream & operator << (std::ostream & os,const WifiTxVector &v);
 
-} // namespace ns3
+} //namespace ns3
 
-#endif // WIFI_TX_VECTOR_H
+#endif /* WIFI_TX_VECTOR_H */
diff -Naur ns-3.23/src/wifi/model/yans-error-rate-model.cc ns-3.24/src/wifi/model/yans-error-rate-model.cc
--- ns-3.23/src/wifi/model/yans-error-rate-model.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/yans-error-rate-model.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,12 +15,11 @@
  * 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>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
 #include <cmath>
-
 #include "yans-error-rate-model.h"
 #include "wifi-phy.h"
 #include "ns3/log.h"
@@ -51,6 +50,7 @@
 {
   return std::log (val) / std::log (2.0);
 }
+
 double
 YansErrorRateModel::GetBpskBer (double snr, uint32_t signalSpread, uint32_t phyRate) const
 {
@@ -60,6 +60,7 @@
   NS_LOG_INFO ("bpsk snr=" << snr << " ber=" << ber);
   return ber;
 }
+
 double
 YansErrorRateModel::GetQamBer (double snr, unsigned int m, uint32_t signalSpread, uint32_t phyRate) const
 {
@@ -71,6 +72,7 @@
   NS_LOG_INFO ("Qam m=" << m << " rate=" << phyRate << " snr=" << snr << " ber=" << ber);
   return ber;
 }
+
 uint32_t
 YansErrorRateModel::Factorial (uint32_t k) const
 {
@@ -82,12 +84,14 @@
     }
   return fact;
 }
+
 double
 YansErrorRateModel::Binomial (uint32_t k, double p, uint32_t n) const
 {
   double retval = Factorial (n) / (Factorial (k) * Factorial (n - k)) * std::pow (p, static_cast<double> (k)) * std::pow (1 - p, static_cast<double> (n - k));
   return retval;
 }
+
 double
 YansErrorRateModel::CalculatePdOdd (double ber, unsigned int d) const
 {
@@ -102,6 +106,7 @@
     }
   return pd;
 }
+
 double
 YansErrorRateModel::CalculatePdEven (double ber, unsigned int d) const
 {
@@ -175,111 +180,130 @@
 }
 
 double
-YansErrorRateModel::GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const
+YansErrorRateModel::GetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint32_t nbits) const
 {
   if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM
       || mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM
-      || mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
+      || mode.GetModulationClass () == WIFI_MOD_CLASS_HT
+      || mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
     {
-      if (mode.GetConstellationSize () == 2)
+      if (mode.GetConstellationSize (1) == 2)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_1_2)
             {
               return GetFecBpskBer (snr,
                                     nbits,
-                                    mode.GetBandwidth (), // signal spread
-                                    mode.GetPhyRate (), // phy rate
-                                    10, // dFree
-                                    11 // adFree
-                                    );
+                                    txVector.GetChannelWidth () * 1000000, //signal spread
+                                    mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), //phy rate
+                                    10, //dFree
+                                    11); //adFree
             }
           else
             {
               return GetFecBpskBer (snr,
                                     nbits,
-                                    mode.GetBandwidth (), // signal spread
-                                    mode.GetPhyRate (), // phy rate
-                                    5, // dFree
-                                    8 // adFree
-                                    );
+                                    txVector.GetChannelWidth () * 1000000, //signal spread
+                                    mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), //phy rate
+                                    5, //dFree
+                                    8); //adFree
             }
         }
-      else if (mode.GetConstellationSize () == 4)
+      else if (mode.GetConstellationSize (1) == 4)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_1_2)
             {
               return GetFecQamBer (snr,
                                    nbits,
-                                   mode.GetBandwidth (), // signal spread
-                                   mode.GetPhyRate (), // phy rate
-                                   4,  // m
-                                   10, // dFree
-                                   11, // adFree
-                                   0   // adFreePlusOne
-                                   );
+                                   txVector.GetChannelWidth () * 1000000, //signal spread
+                                   mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), //phy rate
+                                   4, //m
+                                   10, //dFree
+                                   11, //adFree
+                                   0); //adFreePlusOne
             }
           else
             {
               return GetFecQamBer (snr,
                                    nbits,
-                                   mode.GetBandwidth (), // signal spread
-                                   mode.GetPhyRate (), // phy rate
-                                   4, // m
-                                   5, // dFree
-                                   8, // adFree
-                                   31 // adFreePlusOne
-                                   );
+                                   txVector.GetChannelWidth () * 1000000, //signal spread
+                                   mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), //phy rate
+                                   4, //m
+                                   5, //dFree
+                                   8, //adFree
+                                   31); //adFreePlusOne
             }
         }
-      else if (mode.GetConstellationSize () == 16)
+      else if (mode.GetConstellationSize (1) == 16)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_1_2)
             {
               return GetFecQamBer (snr,
                                    nbits,
-                                   mode.GetBandwidth (), // signal spread
-                                   mode.GetPhyRate (), // phy rate
-                                   16, // m
-                                   10, // dFree
-                                   11, // adFree
-                                   0   // adFreePlusOne
-                                   );
+                                   txVector.GetChannelWidth () * 1000000, //signal spread
+                                   mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), //phy rate
+                                   16, //m
+                                   10, //dFree
+                                   11, //adFree
+                                   0); //adFreePlusOne
             }
           else
             {
               return GetFecQamBer (snr,
                                    nbits,
-                                   mode.GetBandwidth (), // signal spread
-                                   mode.GetPhyRate (), // phy rate
-                                   16, // m
-                                   5,  // dFree
-                                   8,  // adFree
-                                   31  // adFreePlusOne
-                                   );
+                                   txVector.GetChannelWidth () * 1000000, //signal spread
+                                   mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), //phy rate
+                                   16, //m
+                                   5, //dFree
+                                   8, //adFree
+                                   31); //adFreePlusOne
             }
         }
-      else if (mode.GetConstellationSize () == 64)
+      else if (mode.GetConstellationSize (1) == 64)
         {
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_2_3)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_2_3)
             {
               return GetFecQamBer (snr,
                                    nbits,
-                                   mode.GetBandwidth (), // signal spread
-                                   mode.GetPhyRate (), // phy rate
-                                   64, // m
-                                   6,  // dFree
-                                   1,  // adFree
-                                   16  // adFreePlusOne
-                                   );
+                                   txVector.GetChannelWidth () * 1000000, //signal spread
+                                   mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), //phy rate
+                                   64, //m
+                                   6, //dFree
+                                   1, //adFree
+                                   16); //adFreePlusOne
             }
-          if (mode.GetCodeRate () == WIFI_CODE_RATE_5_6)
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_5_6)
             {
               //Table B.32  in Pâl Frenger et al., "Multi-rate Convolutional Codes".
               return GetFecQamBer (snr,
                                    nbits,
-                                   mode.GetBandwidth (), // signal spread
-                                   mode.GetPhyRate (), // phy rate
-                                   64, // m
+                                   txVector.GetChannelWidth () * 1000000, //signal spread
+                                   mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), //phy rate
+                                   64, //m
+                                   4, //dFree
+                                   14, //adFree
+                                   69); //adFreePlusOne
+            }
+          else
+            {
+              return GetFecQamBer (snr,
+                                   nbits,
+                                   txVector.GetChannelWidth () * 1000000, //signal spread
+                                   mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), //phy rate
+                                   64, //m
+                                   5, //dFree
+                                   8, //adFree
+                                   31); //adFreePlusOne
+            }
+        }
+      else if (mode.GetConstellationSize (1) == 256)
+        {
+          if (mode.GetCodeRate (1) == WIFI_CODE_RATE_5_6)
+            {
+              return GetFecQamBer (snr,
+                                   nbits,
+                                   txVector.GetChannelWidth () * 1000000, // signal spread
+                                   mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), // phy rate
+                                   256, // m
                                    4,  // dFree
                                    14,  // adFree
                                    69  // adFreePlusOne
@@ -289,9 +313,9 @@
             {
               return GetFecQamBer (snr,
                                    nbits,
-                                   mode.GetBandwidth (), // signal spread
-                                   mode.GetPhyRate (), // phy rate
-                                   64, // m
+                                   txVector.GetChannelWidth () * 1000000, // signal spread
+                                   mode.GetPhyRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), // phy rate
+                                   256, // m
                                    5,  // dFree
                                    8,  // adFree
                                    31  // adFreePlusOne
@@ -299,9 +323,9 @@
             }
         }
     }
-  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS)
+  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS || mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS)
     {
-      switch (mode.GetDataRate ())
+      switch (mode.GetDataRate (20, 0, 1))
         {
         case 1000000:
           return DsssErrorRateModel::GetDsssDbpskSuccessRate (snr, nbits);
@@ -311,9 +335,11 @@
           return DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (snr, nbits);
         case 11000000:
           return DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (snr, nbits);
+        default:
+          NS_ASSERT ("undefined DSSS/HR-DSSS datarate");
         }
     }
   return 0;
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/yans-error-rate-model.h ns-3.24/src/wifi/model/yans-error-rate-model.h
--- ns-3.23/src/wifi/model/yans-error-rate-model.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/yans-error-rate-model.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef YANS_ERROR_RATE_MODEL_H
 #define YANS_ERROR_RATE_MODEL_H
 
@@ -59,13 +60,15 @@
 
   YansErrorRateModel ();
 
-  virtual double GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const;
+  virtual double GetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint32_t nbits) const;
+
 
 private:
   /**
    * Return the logarithm of the given value to base 2.
    *
    * \param val
+   *
    * \return the logarithm of val to base 2.
    */
   double Log2 (double val) const;
@@ -75,6 +78,7 @@
    * \param snr snr value
    * \param signalSpread
    * \param phyRate
+   *
    * \return BER of BPSK at the given SNR
    */
   double GetBpskBer (double snr, uint32_t signalSpread, uint32_t phyRate) const;
@@ -85,6 +89,7 @@
    * \param m
    * \param signalSpread
    * \param phyRate
+   *
    * \return BER of BPSK at the given SNR
    */
   double GetQamBer (double snr, unsigned int m, uint32_t signalSpread, uint32_t phyRate) const;
@@ -92,33 +97,38 @@
    * Return k!
    *
    * \param k
+   *
    * \return k!
    */
   uint32_t Factorial (uint32_t k) const;
   /**
    * Return Binomial distribution for a given k, p, and n
-   * 
+   *
    * \param k
    * \param p
    * \param n
+   *
    * \return a Binomial distribution
    */
   double Binomial (uint32_t k, double p, uint32_t n) const;
   /**
    * \param ber
    * \param d
+   *
    * \return double
    */
   double CalculatePdOdd (double ber, unsigned int d) const;
   /**
    * \param ber
    * \param d
+   *
    * \return double
    */
   double CalculatePdEven (double ber, unsigned int d) const;
   /**
    * \param ber
    * \param d
+   *
    * \return double
    */
   double CalculatePd (double ber, unsigned int d) const;
@@ -129,6 +139,7 @@
    * \param phyRate
    * \param dFree
    * \param adFree
+   *
    * \return double
    */
   double GetFecBpskBer (double snr, double nbits,
@@ -143,6 +154,7 @@
    * \param dfree
    * \param adFree
    * \param adFreePlusOne
+   *
    * \return double
    */
   double GetFecQamBer (double snr, uint32_t nbits,
@@ -152,7 +164,6 @@
                        uint32_t adFree, uint32_t adFreePlusOne) const;
 };
 
-
-} // namespace ns3
+} //namespace ns3
 
 #endif /* YANS_ERROR_RATE_MODEL_H */
diff -Naur ns-3.23/src/wifi/model/yans-wifi-channel.cc ns-3.24/src/wifi/model/yans-wifi-channel.cc
--- ns-3.23/src/wifi/model/yans-wifi-channel.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/yans-wifi-channel.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage, <mathieu.lacage@sophia.inria.fr>
  */
+
 #include "ns3/packet.h"
 #include "ns3/simulator.h"
 #include "ns3/mobility-model.h"
@@ -26,7 +27,6 @@
 #include "ns3/pointer.h"
 #include "ns3/object-factory.h"
 #include "yans-wifi-channel.h"
-#include "yans-wifi-phy.h"
 #include "ns3/propagation-loss-model.h"
 #include "ns3/propagation-delay-model.h"
 
@@ -58,6 +58,7 @@
 YansWifiChannel::YansWifiChannel ()
 {
 }
+
 YansWifiChannel::~YansWifiChannel ()
 {
   NS_LOG_FUNCTION_NOARGS ();
@@ -69,6 +70,7 @@
 {
   m_loss = loss;
 }
+
 void
 YansWifiChannel::SetPropagationDelayModel (Ptr<PropagationDelayModel> delay)
 {
@@ -77,7 +79,7 @@
 
 void
 YansWifiChannel::Send (Ptr<YansWifiPhy> sender, Ptr<const Packet> packet, double txPowerDbm,
-                       WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType, Time duration) const
+                       WifiTxVector txVector, WifiPreamble preamble, struct mpduInfo aMpdu, Time duration) const
 {
   Ptr<MobilityModel> senderMobility = sender->GetMobility ()->GetObject<MobilityModel> ();
   NS_ASSERT (senderMobility != 0);
@@ -86,7 +88,7 @@
     {
       if (sender != (*i))
         {
-          // For now don't account for inter channel interference
+          //For now don't account for inter channel interference
           if ((*i)->GetChannelNumber () != sender->GetChannelNumber ())
             {
               continue;
@@ -109,24 +111,24 @@
               dstNode = dstNetDevice->GetObject<NetDevice> ()->GetNode ()->GetId ();
             }
 
-          double *atts = new double[3];
-          *atts = rxPowerDbm;
-          *(atts+1)= packetType;
-          *(atts+2)= duration.GetNanoSeconds();
+          struct Parameters parameters;
+          parameters.rxPowerDbm = rxPowerDbm;
+          parameters.aMpdu = aMpdu;
+          parameters.duration = duration;
+          parameters.txVector = txVector;
+          parameters.preamble = preamble;
 
           Simulator::ScheduleWithContext (dstNode,
                                           delay, &YansWifiChannel::Receive, this,
-                                          j, copy, atts, txVector, preamble);
+                                          j, copy, parameters);
         }
     }
 }
 
 void
-YansWifiChannel::Receive (uint32_t i, Ptr<Packet> packet, double *atts,
-                          WifiTxVector txVector, WifiPreamble preamble) const
+YansWifiChannel::Receive (uint32_t i, Ptr<Packet> packet, struct Parameters parameters) const
 {
-  m_phyList[i]->StartReceivePlcp (packet, *atts, txVector, preamble,*(atts+1), NanoSeconds(*(atts+2)));
-  delete[] atts;
+  m_phyList[i]->StartReceivePreambleAndHeader (packet, parameters.rxPowerDbm, parameters.txVector, parameters.preamble, parameters.aMpdu, parameters.duration);
 }
 
 uint32_t
@@ -134,6 +136,7 @@
 {
   return m_phyList.size ();
 }
+
 Ptr<NetDevice>
 YansWifiChannel::GetDevice (uint32_t i) const
 {
@@ -154,4 +157,4 @@
   return (currentStream - stream);
 }
 
-} // namespace ns3
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/yans-wifi-channel.h ns-3.24/src/wifi/model/yans-wifi-channel.h
--- ns-3.23/src/wifi/model/yans-wifi-channel.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/yans-wifi-channel.h	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage, <mathieu.lacage@sophia.inria.fr>
  */
+
 #ifndef YANS_WIFI_CHANNEL_H
 #define YANS_WIFI_CHANNEL_H
 
@@ -27,6 +28,7 @@
 #include "wifi-mode.h"
 #include "wifi-preamble.h"
 #include "wifi-tx-vector.h"
+#include "yans-wifi-phy.h"
 #include "ns3/nstime.h"
 
 namespace ns3 {
@@ -34,7 +36,15 @@
 class NetDevice;
 class PropagationLossModel;
 class PropagationDelayModel;
-class YansWifiPhy;
+
+struct Parameters
+{
+  double rxPowerDbm;
+  struct mpduInfo aMpdu;
+  Time duration;
+  WifiTxVector txVector;
+  WifiPreamble preamble;
+};
 
 /**
  * \brief A Yans wifi channel
@@ -56,7 +66,7 @@
   YansWifiChannel ();
   virtual ~YansWifiChannel ();
 
-  // inherited from Channel.
+  //inherited from Channel.
   virtual uint32_t GetNDevices (void) const;
   virtual Ptr<NetDevice> GetDevice (uint32_t i) const;
 
@@ -82,7 +92,8 @@
    * \param txPowerDbm the tx power associated to the packet
    * \param txVector the TXVECTOR associated to the packet
    * \param preamble the preamble associated to the packet
-   * \param packetType the type of packet, used for A-MPDU to say whether it's the last MPDU or not
+   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
+   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
    * \param duration the transmission duration associated to the packet
    *
    * This method should not be invoked by normal users. It is
@@ -91,26 +102,26 @@
    * e.g. PHYs that are operating on the same channel.
    */
   void Send (Ptr<YansWifiPhy> sender, Ptr<const Packet> packet, double txPowerDbm,
-             WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType, Time duration) const;
+             WifiTxVector txVector, WifiPreamble preamble, struct mpduInfo aMpdu, Time duration) const;
 
- /**
-  * 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
-  */
+  /**
+   * 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);
 
-private:
-  //YansWifiChannel& operator = (const YansWifiChannel &);
-  //YansWifiChannel (const YansWifiChannel &);
 
+private:
   /**
    * A vector of pointers to YansWifiPhy.
    */
   typedef std::vector<Ptr<YansWifiPhy> > PhyList;
+
   /**
    * This method is scheduled by Send for each associated YansWifiPhy.
    * The method then calls the corresponding YansWifiPhy that the first
@@ -122,16 +133,13 @@
    * \param txVector the TXVECTOR of the packet
    * \param preamble the type of preamble being used to send the packet
    */
-  void Receive (uint32_t i, Ptr<Packet> packet, double *atts,
-                WifiTxVector txVector, WifiPreamble preamble) const;
-
+  void Receive (uint32_t i, Ptr<Packet> packet, struct Parameters parameters) const;
 
-  PhyList m_phyList; //!< List of YansWifiPhys connected to this YansWifiChannel
-  Ptr<PropagationLossModel> m_loss; //!< Propagation loss model
-  Ptr<PropagationDelayModel> m_delay; //!< Propagation delay model
+  PhyList m_phyList;                   //!< List of YansWifiPhys connected to this YansWifiChannel
+  Ptr<PropagationLossModel> m_loss;    //!< Propagation loss model
+  Ptr<PropagationDelayModel> m_delay;  //!< Propagation delay model
 };
 
-} // namespace ns3
-
+} //namespace ns3
 
 #endif /* YANS_WIFI_CHANNEL_H */
diff -Naur ns-3.23/src/wifi/model/yans-wifi-phy.cc ns-3.24/src/wifi/model/yans-wifi-phy.cc
--- ns-3.23/src/wifi/model/yans-wifi-phy.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/yans-wifi-phy.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,8 +15,9 @@
  * 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>
- * Author: Ghada Badawy <gbadawy@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Ghada Badawy <gbadawy@gmail.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
 #include "yans-wifi-phy.h"
@@ -36,6 +37,7 @@
 #include "ns3/net-device.h"
 #include "ns3/trace-source-accessor.h"
 #include "ns3/boolean.h"
+#include "ns3/node.h"
 #include "ampdu-tag.h"
 #include <cmath>
 
@@ -61,7 +63,7 @@
                    MakeDoubleChecker<double> ())
     .AddAttribute ("CcaMode1Threshold",
                    "The energy of a received signal should be higher than "
-                   "this threshold (dbm) to allow the PHY layer to declare CCA BUSY state",
+                   "this threshold (dbm) to allow the PHY layer to declare CCA BUSY state.",
                    DoubleValue (-99.0),
                    MakeDoubleAccessor (&YansWifiPhy::SetCcaMode1Threshold,
                                        &YansWifiPhy::GetCcaMode1Threshold),
@@ -102,13 +104,13 @@
                    "\"the difference in decibels (dB) between"
                    " the noise output of the actual receiver to the noise output of an "
                    " ideal receiver with the same overall gain and bandwidth when the receivers "
-                   " are connected to sources at the standard noise temperature T0 (usually 290 K)\"."
-                   " For",
+                   " are connected to sources at the standard noise temperature T0 (usually 290 K)\".",
                    DoubleValue (7),
                    MakeDoubleAccessor (&YansWifiPhy::SetRxNoiseFigure,
                                        &YansWifiPhy::GetRxNoiseFigure),
                    MakeDoubleChecker<double> ())
-    .AddAttribute ("State", "The state of the PHY layer",
+    .AddAttribute ("State",
+                   "The state of the PHY layer.",
                    PointerValue (),
                    MakePointerAccessor (&YansWifiPhy::m_state),
                    MakePointerChecker<WifiPhyStateHelper> ())
@@ -118,64 +120,70 @@
                    MakeTimeAccessor (&YansWifiPhy::m_channelSwitchDelay),
                    MakeTimeChecker ())
     .AddAttribute ("ChannelNumber",
-                   "Channel center frequency = Channel starting frequency + 5 MHz * nch",
+                   "Channel center frequency = Channel starting frequency + 5 MHz * nch.",
                    UintegerValue (1),
                    MakeUintegerAccessor (&YansWifiPhy::SetChannelNumber,
                                          &YansWifiPhy::GetChannelNumber),
                    MakeUintegerChecker<uint16_t> ())
-    .AddAttribute ("Frequency", "The operating frequency.",
+    .AddAttribute ("Frequency",
+                   "The operating frequency.",
                    UintegerValue (2407),
                    MakeUintegerAccessor (&YansWifiPhy::GetFrequency,
-                                        &YansWifiPhy::SetFrequency),
+                                         &YansWifiPhy::SetFrequency),
                    MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("Transmitters", "The number of transmitters.",
+    .AddAttribute ("Transmitters",
+                   "The number of transmitters.",
                    UintegerValue (1),
                    MakeUintegerAccessor (&YansWifiPhy::GetNumberOfTransmitAntennas,
-                                        &YansWifiPhy::SetNumberOfTransmitAntennas),
+                                         &YansWifiPhy::SetNumberOfTransmitAntennas),
                    MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("Receivers", "The number of receivers.",
+    .AddAttribute ("Receivers",
+                   "The number of receivers.",
                    UintegerValue (1),
                    MakeUintegerAccessor (&YansWifiPhy::GetNumberOfReceiveAntennas,
-                                        &YansWifiPhy::SetNumberOfReceiveAntennas),
+                                         &YansWifiPhy::SetNumberOfReceiveAntennas),
                    MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("ShortGuardEnabled", "Whether or not short guard interval is enabled.",
+    .AddAttribute ("ShortGuardEnabled",
+                   "Whether or not short guard interval is enabled.",
                    BooleanValue (false),
                    MakeBooleanAccessor (&YansWifiPhy::GetGuardInterval,
                                         &YansWifiPhy::SetGuardInterval),
                    MakeBooleanChecker ())
-    .AddAttribute ("LdpcEnabled", "Whether or not LDPC is enabled.",
+    .AddAttribute ("LdpcEnabled",
+                   "Whether or not LDPC is enabled.",
                    BooleanValue (false),
                    MakeBooleanAccessor (&YansWifiPhy::GetLdpc,
                                         &YansWifiPhy::SetLdpc),
                    MakeBooleanChecker ())
-    .AddAttribute ("STBCEnabled", "Whether or not STBC is enabled.",
+    .AddAttribute ("STBCEnabled",
+                   "Whether or not STBC is enabled.",
                    BooleanValue (false),
                    MakeBooleanAccessor (&YansWifiPhy::GetStbc,
                                         &YansWifiPhy::SetStbc),
                    MakeBooleanChecker ())
-    .AddAttribute ("GreenfieldEnabled", "Whether or not STBC is enabled.",
+    .AddAttribute ("GreenfieldEnabled",
+                   "Whether or not Greenfield is enabled.",
                    BooleanValue (false),
                    MakeBooleanAccessor (&YansWifiPhy::GetGreenfield,
                                         &YansWifiPhy::SetGreenfield),
                    MakeBooleanChecker ())
-    .AddAttribute ("ChannelBonding", "Whether 20MHz or 40MHz.",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&YansWifiPhy::GetChannelBonding,
-                                        &YansWifiPhy::SetChannelBonding),
-                   MakeBooleanChecker ())
-
-
+    .AddAttribute ("ChannelWidth",
+                   "Whether 5MHz, 10MHz, 20MHz, 22MHz, 40MHz, 80 MHz or 160 MHz.",
+                   UintegerValue (20),
+                   MakeUintegerAccessor (&YansWifiPhy::GetChannelWidth,
+                                         &YansWifiPhy::SetChannelWidth),
+                   MakeUintegerChecker<uint32_t> ())
   ;
   return tid;
 }
 
 YansWifiPhy::YansWifiPhy ()
-  :  m_initialized (false),
+  : m_initialized (false),
     m_channelNumber (1),
     m_endRxEvent (),
-    m_endPlcpRxEvent(),
+    m_endPlcpRxEvent (),
     m_channelStartingFrequency (0),
-    m_mpdusNum(0),
+    m_mpdusNum (0),
     m_plcpSuccess (false)
 {
   NS_LOG_FUNCTION (this);
@@ -194,7 +202,7 @@
   NS_LOG_FUNCTION (this);
   m_channel = 0;
   m_deviceRateSet.clear ();
-  m_deviceMcsSet.clear();
+  m_deviceMcsSet.clear ();
   m_device = 0;
   m_mobility = 0;
   m_state = 0;
@@ -232,81 +240,92 @@
       ConfigureHolland ();
       break;
     case WIFI_PHY_STANDARD_80211n_2_4GHZ:
-      m_channelStartingFrequency=2407;
+      m_channelStartingFrequency = 2407;
       Configure80211n ();
       break;
     case WIFI_PHY_STANDARD_80211n_5GHZ:
-      m_channelStartingFrequency=5e3;
+      m_channelStartingFrequency = 5e3;
       Configure80211n ();
       break;
-
+    case WIFI_PHY_STANDARD_80211ac:
+      Configure80211ac ();
+      break;
     default:
       NS_ASSERT (false);
       break;
     }
 }
 
-
 void
 YansWifiPhy::SetRxNoiseFigure (double noiseFigureDb)
 {
   NS_LOG_FUNCTION (this << noiseFigureDb);
   m_interference.SetNoiseFigure (DbToRatio (noiseFigureDb));
 }
+
 void
 YansWifiPhy::SetTxPowerStart (double start)
 {
   NS_LOG_FUNCTION (this << start);
   m_txPowerBaseDbm = start;
 }
+
 void
 YansWifiPhy::SetTxPowerEnd (double end)
 {
   NS_LOG_FUNCTION (this << end);
   m_txPowerEndDbm = end;
 }
+
 void
 YansWifiPhy::SetNTxPower (uint32_t n)
 {
   NS_LOG_FUNCTION (this << n);
   m_nTxPower = n;
 }
+
 void
 YansWifiPhy::SetTxGain (double gain)
 {
   NS_LOG_FUNCTION (this << gain);
   m_txGainDb = gain;
 }
+
 void
 YansWifiPhy::SetRxGain (double gain)
 {
   NS_LOG_FUNCTION (this << gain);
   m_rxGainDb = gain;
 }
+
 void
 YansWifiPhy::SetEdThreshold (double threshold)
 {
   NS_LOG_FUNCTION (this << threshold);
   m_edThresholdW = DbmToW (threshold);
 }
+
 void
 YansWifiPhy::SetCcaMode1Threshold (double threshold)
 {
   NS_LOG_FUNCTION (this << threshold);
   m_ccaMode1ThresholdW = DbmToW (threshold);
 }
+
 void
 YansWifiPhy::SetErrorRateModel (Ptr<ErrorRateModel> rate)
 {
   m_interference.SetErrorRateModel (rate);
 }
+
 void
-YansWifiPhy::SetDevice (Ptr<Object> device)
+YansWifiPhy::SetDevice (Ptr<NetDevice> device)
 {
   m_device = device;
 }
+
 void
-YansWifiPhy::SetMobility (Ptr<Object> mobility)
+YansWifiPhy::SetMobility (Ptr<MobilityModel> mobility)
 {
   m_mobility = mobility;
 }
@@ -316,21 +335,25 @@
 {
   return RatioToDb (m_interference.GetNoiseFigure ());
 }
+
 double
 YansWifiPhy::GetTxPowerStart (void) const
 {
   return m_txPowerBaseDbm;
 }
+
 double
 YansWifiPhy::GetTxPowerEnd (void) const
 {
   return m_txPowerEndDbm;
 }
+
 double
 YansWifiPhy::GetTxGain (void) const
 {
   return m_txGainDb;
 }
+
 double
 YansWifiPhy::GetRxGain (void) const
 {
@@ -354,15 +377,24 @@
 {
   return m_interference.GetErrorRateModel ();
 }
-Ptr<Object>
+
+Ptr<NetDevice>
 YansWifiPhy::GetDevice (void) const
 {
   return m_device;
 }
-Ptr<Object>
+
+Ptr<MobilityModel>
 YansWifiPhy::GetMobility (void)
 {
-  return m_mobility;
+  if (m_mobility != 0)
+    {
+      return m_mobility;
+    }
+  else
+    {
+      return m_device->GetNode ()->GetObject<MobilityModel> ();
+    }
 }
 
 double
@@ -376,6 +408,7 @@
 {
   return m_channel;
 }
+
 void
 YansWifiPhy::SetChannel (Ptr<YansWifiChannel> channel)
 {
@@ -388,7 +421,7 @@
 {
   if (!m_initialized)
     {
-      // this is not channel switch, this is initialization
+      //this is not channel switch, this is initialization
       NS_LOG_DEBUG ("start at channel " << nch);
       m_channelNumber = nch;
       return;
@@ -399,7 +432,7 @@
     {
     case YansWifiPhy::RX:
       NS_LOG_DEBUG ("drop packet because of channel switching while reception");
-      m_endPlcpRxEvent.Cancel();
+      m_endPlcpRxEvent.Cancel ();
       m_endRxEvent.Cancel ();
       goto switchChannel;
       break;
@@ -497,13 +530,22 @@
     case YansWifiPhy::IDLE:
     case YansWifiPhy::CCA_BUSY:
     case YansWifiPhy::SWITCHING:
-      NS_LOG_DEBUG ("not in sleep mode, there is nothing to resume");
-      break;
+      {
+        NS_LOG_DEBUG ("not in sleep mode, there is nothing to resume");
+        break;
+      }
     case YansWifiPhy::SLEEP:
-      NS_LOG_DEBUG ("resuming from sleep mode");
-      Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaMode1ThresholdW);
-      m_state->SwitchFromSleep (delayUntilCcaEnd);
-      break;
+      {
+        NS_LOG_DEBUG ("resuming from sleep mode");
+        Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaMode1ThresholdW);
+        m_state->SwitchFromSleep (delayUntilCcaEnd);
+        break;
+      }
+    default:
+      {
+        NS_ASSERT (false);
+        break;
+      }
     }
 }
 
@@ -512,6 +554,7 @@
 {
   m_state->SetReceiveOkCallback (callback);
 }
+
 void
 YansWifiPhy::SetReceiveErrorCallback (RxErrorCallback callback)
 {
@@ -519,21 +562,20 @@
 }
 
 void
-YansWifiPhy::StartReceivePlcp (Ptr<Packet> packet,
-                               double rxPowerDbm,
-                               WifiTxVector txVector,
-                               enum WifiPreamble preamble,
-                               uint8_t packetType, Time rxDuration)
-{
-  // This function should be later split to check separately wether plcp preamble and plcp header can be successfully received.
-  // Note: plcp preamble reception is not yet modeled.
-  NS_LOG_FUNCTION (this << packet << rxPowerDbm << txVector.GetMode()<< preamble << (uint32_t)packetType);
+YansWifiPhy::StartReceivePreambleAndHeader (Ptr<Packet> packet,
+                                            double rxPowerDbm,
+                                            WifiTxVector txVector,
+                                            enum WifiPreamble preamble,
+                                            struct mpduInfo aMpdu, Time rxDuration)
+{
+  //This function should be later split to check separately whether plcp preamble and plcp header can be successfully received.
+  //Note: plcp preamble reception is not yet modeled.
+  NS_LOG_FUNCTION (this << packet << rxPowerDbm << txVector.GetMode () << preamble << (uint32_t)aMpdu.packetType);
   AmpduTag ampduTag;
-  
   rxPowerDbm += m_rxGainDb;
   double rxPowerW = DbmToW (rxPowerDbm);
   Time endRx = Simulator::Now () + rxDuration;
-  Time plcpDuration = CalculatePlcpDuration (txVector, preamble);
+  Time preambleAndHeaderDuration = CalculatePlcpPreambleAndHeaderDuration (txVector, preamble);
 
   Ptr<InterferenceHelper::Event> event;
   event = m_interference.Add (packet->GetSize (),
@@ -541,7 +583,7 @@
                               preamble,
                               rxDuration,
                               rxPowerW);
-    
+
   switch (m_state->GetState ())
     {
     case YansWifiPhy::SWITCHING:
@@ -558,8 +600,8 @@
        */
       if (endRx > Simulator::Now () + m_state->GetDelayUntilIdle ())
         {
-          // that packet will be noise _after_ the completion of the
-          // channel switching.
+          //that packet will be noise _after_ the completion of the
+          //channel switching.
           goto maybeCcaBusy;
         }
       break;
@@ -569,8 +611,8 @@
       NotifyRxDrop (packet);
       if (endRx > Simulator::Now () + m_state->GetDelayUntilIdle ())
         {
-          // that packet will be noise _after_ the reception of the
-          // currently-received packet.
+          //that packet will be noise _after_ the reception of the
+          //currently-received packet.
           goto maybeCcaBusy;
         }
       break;
@@ -580,8 +622,8 @@
       NotifyRxDrop (packet);
       if (endRx > Simulator::Now () + m_state->GetDelayUntilIdle ())
         {
-          // that packet will be noise _after_ the transmission of the
-          // currently-transmitted packet.
+          //that packet will be noise _after_ the transmission of the
+          //currently-transmitted packet.
           goto maybeCcaBusy;
         }
       break;
@@ -595,51 +637,53 @@
               NotifyRxDrop (packet);
               goto maybeCcaBusy;
             }
-          else if (preamble == WIFI_PREAMBLE_NONE && m_plcpSuccess == false) // A-MPDU reception fails
+          else if (preamble == WIFI_PREAMBLE_NONE && m_plcpSuccess == false) //A-MPDU reception fails
             {
               NS_LOG_DEBUG ("Drop MPDU because no plcp has been received");
               NotifyRxDrop (packet);
               goto maybeCcaBusy;
             }
-           else if (preamble != WIFI_PREAMBLE_NONE && packet->PeekPacketTag (ampduTag) && m_mpdusNum == 0)
+          else if (preamble != WIFI_PREAMBLE_NONE && packet->PeekPacketTag (ampduTag) && m_mpdusNum == 0)
             {
               //received the first MPDU in an MPDU
-              m_mpdusNum = ampduTag.GetNoOfMpdus()-1;
+              m_mpdusNum = ampduTag.GetNoOfMpdus () - 1;
             }
-           else if (preamble == WIFI_PREAMBLE_NONE && packet->PeekPacketTag (ampduTag) && m_mpdusNum > 0)
+          else if (preamble == WIFI_PREAMBLE_NONE && packet->PeekPacketTag (ampduTag) && m_mpdusNum > 0)
             {
               //received the other MPDUs that are part of the A-MPDU
-              if (ampduTag.GetNoOfMpdus() < m_mpdusNum)
+              if (ampduTag.GetNoOfMpdus () < m_mpdusNum)
                 {
-                    NS_LOG_DEBUG ("Missing MPDU from the A-MPDU " << m_mpdusNum - ampduTag.GetNoOfMpdus());
-                    m_mpdusNum = ampduTag.GetNoOfMpdus();
+                  NS_LOG_DEBUG ("Missing MPDU from the A-MPDU " << m_mpdusNum - ampduTag.GetNoOfMpdus ());
+                  m_mpdusNum = ampduTag.GetNoOfMpdus ();
                 }
               else
-                m_mpdusNum--;
+                {
+                  m_mpdusNum--;
+                }
             }
           else if (preamble != WIFI_PREAMBLE_NONE && m_mpdusNum > 0 )
             {
               NS_LOG_DEBUG ("Didn't receive the last MPDUs from an A-MPDU " << m_mpdusNum);
               m_mpdusNum = 0;
             }
-            
+
           NS_LOG_DEBUG ("sync to signal (power=" << rxPowerW << "W)");
-          // sync to signal
+          //sync to signal
           m_state->SwitchToRx (rxDuration);
           NS_ASSERT (m_endPlcpRxEvent.IsExpired ());
           NotifyRxBegin (packet);
           m_interference.NotifyRxStart ();
-            
+
           if (preamble != WIFI_PREAMBLE_NONE)
-          {
-            NS_ASSERT (m_endPlcpRxEvent.IsExpired ());
-            m_endPlcpRxEvent = Simulator::Schedule (plcpDuration, &YansWifiPhy::StartReceivePacket, this,
-                                                    packet, txVector, preamble, packetType, event);
-          }
-            
+            {
+              NS_ASSERT (m_endPlcpRxEvent.IsExpired ());
+              m_endPlcpRxEvent = Simulator::Schedule (preambleAndHeaderDuration, &YansWifiPhy::StartReceivePacket, this,
+                                                      packet, txVector, preamble, aMpdu, event);
+            }
+
           NS_ASSERT (m_endRxEvent.IsExpired ());
           m_endRxEvent = Simulator::Schedule (rxDuration, &YansWifiPhy::EndReceive, this,
-                                              packet, preamble, packetType, event);
+                                              packet, preamble, aMpdu, event);
         }
       else
         {
@@ -658,12 +702,12 @@
     }
 
   return;
-  
-  maybeCcaBusy:
-  // We are here because we have received the first bit of a packet and we are
-  // not going to be able to synchronize on it
-  // In this model, CCA becomes busy when the aggregation of all signals as
-  // tracked by the InterferenceHelper class is higher than the CcaBusyThreshold
+
+maybeCcaBusy:
+  //We are here because we have received the first bit of a packet and we are
+  //not going to be able to synchronize on it
+  //In this model, CCA becomes busy when the aggregation of all signals as
+  //tracked by the InterferenceHelper class is higher than the CcaBusyThreshold
 
   Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaMode1ThresholdW);
   if (!delayUntilCcaEnd.IsZero ())
@@ -671,50 +715,51 @@
       m_state->SwitchMaybeToCcaBusy (delayUntilCcaEnd);
     }
 }
+
 void
 YansWifiPhy::StartReceivePacket (Ptr<Packet> packet,
                                  WifiTxVector txVector,
-                                 enum WifiPreamble preamble, 
-                                 uint8_t packetType,
+                                 enum WifiPreamble preamble,
+                                 struct mpduInfo aMpdu,
                                  Ptr<InterferenceHelper::Event> event)
 {
-  NS_LOG_FUNCTION (this << packet << txVector.GetMode()<< preamble << (uint32_t)packetType);
+  NS_LOG_FUNCTION (this << packet << txVector.GetMode () << preamble << (uint32_t)aMpdu.packetType);
   NS_ASSERT (IsStateRx ());
   NS_ASSERT (m_endPlcpRxEvent.IsExpired ());
   AmpduTag ampduTag;
-  WifiMode txMode = txVector.GetMode();
-  
+  WifiMode txMode = txVector.GetMode ();
+
   struct InterferenceHelper::SnrPer snrPer;
   snrPer = m_interference.CalculatePlcpHeaderSnrPer (event);
-  
-  NS_LOG_DEBUG ("snr=" << snrPer.snr << ", per=" << snrPer.per);
 
-    if (m_random->GetValue () > snrPer.per) //plcp reception succeeded
-      {
-          if (IsModeSupported (txMode) || IsMcsSupported(txMode))
-            {
-              NS_LOG_DEBUG ("receiving plcp payload"); //endReceive is already scheduled
-              m_plcpSuccess = true;
-            }
-          else //mode is not allowed
-            {
-              NS_LOG_DEBUG ("drop packet because it was sent using an unsupported mode (" << txMode << ")");
-              NotifyRxDrop (packet);
-              m_plcpSuccess = false;
-            }
-      }
-    else //plcp reception failed
-      {
-        NS_LOG_DEBUG ("drop packet because plcp reception failed");
-        NotifyRxDrop (packet);
-        m_plcpSuccess = false;
-      }
+  NS_LOG_DEBUG ("snr(dB)=" << RatioToDb (snrPer.snr) << ", per=" << snrPer.per);
+
+  if (m_random->GetValue () > snrPer.per) //plcp reception succeeded
+    {
+      if (IsModeSupported (txMode) || IsMcsSupported (txMode))
+        {
+          NS_LOG_DEBUG ("receiving plcp payload"); //endReceive is already scheduled
+          m_plcpSuccess = true;
+        }
+      else //mode is not allowed
+        {
+          NS_LOG_DEBUG ("drop packet because it was sent using an unsupported mode (" << txMode << ")");
+          NotifyRxDrop (packet);
+          m_plcpSuccess = false;
+        }
+    }
+  else //plcp reception failed
+    {
+      NS_LOG_DEBUG ("drop packet because plcp preamble/header reception failed");
+      NotifyRxDrop (packet);
+      m_plcpSuccess = false;
+    }
 }
 
 void
-YansWifiPhy::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType)
+YansWifiPhy::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber)
 {
-  NS_LOG_FUNCTION (this << packet << txVector.GetMode() << preamble << (uint32_t)txVector.GetTxPowerLevel() << (uint32_t)packetType);
+  NS_LOG_FUNCTION (this << packet << txVector.GetMode () << txVector.GetMode ().GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1) << preamble << (uint32_t)txVector.GetTxPowerLevel () << (uint32_t)packetType);
   /* Transmission can happen if:
    *  - we are syncing on a packet. It is the responsability of the
    *    MAC layer to avoid doing this but the PHY does nothing to
@@ -722,7 +767,7 @@
    *  - we are idle
    */
   NS_ASSERT (!m_state->IsStateTx () && !m_state->IsStateSwitching ());
-  
+
   if (m_state->IsStateSleep ())
     {
       NS_LOG_DEBUG ("Dropping packet because in sleep mode");
@@ -730,7 +775,9 @@
       return;
     }
 
-  Time txDuration = CalculateTxDuration (packet->GetSize (), txVector, preamble, GetFrequency(), packetType, 1);
+  Time txDuration = CalculateTxDuration (packet->GetSize (), txVector, preamble, GetFrequency (), packetType, 1);
+  NS_ASSERT (txDuration > NanoSeconds (0));
+
   if (m_state->IsStateRx ())
     {
       m_endPlcpRxEvent.Cancel ();
@@ -739,18 +786,20 @@
     }
   NotifyTxBegin (packet);
   uint32_t dataRate500KbpsUnits;
-  if (txVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
+  if (txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT || txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT)
     {
-      dataRate500KbpsUnits = 128 + WifiModeToMcs (txVector.GetMode());
+      dataRate500KbpsUnits = 128 + txVector.GetMode ().GetMcsValue ();
     }
   else
     {
-      dataRate500KbpsUnits = txVector.GetMode().GetDataRate () * txVector.GetNss() / 500000;
+      dataRate500KbpsUnits = txVector.GetMode ().GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1) * txVector.GetNss () / 500000;
     }
-  bool isShortPreamble = (WIFI_PREAMBLE_SHORT == preamble);
-  NotifyMonitorSniffTx (packet, (uint16_t)GetChannelFrequencyMhz (), GetChannelNumber (), dataRate500KbpsUnits, isShortPreamble, txVector.GetTxPowerLevel());
-  m_state->SwitchToTx (txDuration, packet, GetPowerDbm (txVector.GetTxPowerLevel()), txVector, preamble);
-  m_channel->Send (this, packet, GetPowerDbm (txVector.GetTxPowerLevel()) + m_txGainDb, txVector, preamble, packetType, txDuration);
+  struct mpduInfo aMpdu;
+  aMpdu.packetType = packetType;
+  aMpdu.referenceNumber = mpduReferenceNumber;
+  NotifyMonitorSniffTx (packet, (uint16_t)GetChannelFrequencyMhz (), GetChannelNumber (), dataRate500KbpsUnits, preamble, txVector, aMpdu);
+  m_state->SwitchToTx (txDuration, packet, GetPowerDbm (txVector.GetTxPowerLevel ()), txVector, preamble);
+  m_channel->Send (this, packet, GetPowerDbm (txVector.GetTxPowerLevel ()) + m_txGainDb, txVector, preamble, aMpdu, txDuration);
 }
 
 uint32_t
@@ -758,11 +807,13 @@
 {
   return m_deviceRateSet.size ();
 }
+
 WifiMode
 YansWifiPhy::GetMode (uint32_t mode) const
 {
   return m_deviceRateSet[mode];
 }
+
 bool
 YansWifiPhy::IsModeSupported (WifiMode mode) const
 {
@@ -776,17 +827,18 @@
   return false;
 }
 bool
-YansWifiPhy::IsMcsSupported (WifiMode mode)
+YansWifiPhy::IsMcsSupported (WifiMode mcs)
 {
   for (uint32_t i = 0; i < GetNMcs (); i++)
     {
-      if (mode == McsToWifiMode(GetMcs (i)))
+      if (mcs == GetMcs (i))
         {
           return true;
         }
     }
   return false;
 }
+
 uint32_t
 YansWifiPhy::GetNTxPower (void) const
 {
@@ -797,7 +849,8 @@
 YansWifiPhy::Configure80211a (void)
 {
   NS_LOG_FUNCTION (this);
-  m_channelStartingFrequency = 5e3; // 5.000 GHz
+  m_channelStartingFrequency = 5e3; //5.000 GHz
+  SetChannelWidth (20); //20 MHz
 
   m_deviceRateSet.push_back (WifiPhy::GetOfdmRate6Mbps ());
   m_deviceRateSet.push_back (WifiPhy::GetOfdmRate9Mbps ());
@@ -809,12 +862,12 @@
   m_deviceRateSet.push_back (WifiPhy::GetOfdmRate54Mbps ());
 }
 
-
 void
 YansWifiPhy::Configure80211b (void)
 {
   NS_LOG_FUNCTION (this);
-  m_channelStartingFrequency = 2407; // 2.407 GHz
+  m_channelStartingFrequency = 2407; //2.407 GHz
+  SetChannelWidth (22); //22 MHz
 
   m_deviceRateSet.push_back (WifiPhy::GetDsssRate1Mbps ());
   m_deviceRateSet.push_back (WifiPhy::GetDsssRate2Mbps ());
@@ -826,7 +879,8 @@
 YansWifiPhy::Configure80211g (void)
 {
   NS_LOG_FUNCTION (this);
-  m_channelStartingFrequency = 2407; // 2.407 GHz
+  m_channelStartingFrequency = 2407; //2.407 GHz
+  SetChannelWidth (20); //20 MHz
 
   m_deviceRateSet.push_back (WifiPhy::GetDsssRate1Mbps ());
   m_deviceRateSet.push_back (WifiPhy::GetDsssRate2Mbps ());
@@ -846,7 +900,8 @@
 YansWifiPhy::Configure80211_10Mhz (void)
 {
   NS_LOG_FUNCTION (this);
-  m_channelStartingFrequency = 5e3; // 5.000 GHz, suppose 802.11a
+  m_channelStartingFrequency = 5e3; //5.000 GHz, suppose 802.11a
+  SetChannelWidth (10); //10 MHz
 
   m_deviceRateSet.push_back (WifiPhy::GetOfdmRate3MbpsBW10MHz ());
   m_deviceRateSet.push_back (WifiPhy::GetOfdmRate4_5MbpsBW10MHz ());
@@ -862,7 +917,8 @@
 YansWifiPhy::Configure80211_5Mhz (void)
 {
   NS_LOG_FUNCTION (this);
-  m_channelStartingFrequency = 5e3; // 5.000 GHz, suppose 802.11a
+  m_channelStartingFrequency = 5e3; //5.000 GHz, suppose 802.11a
+  SetChannelWidth (5); //5 MHz
 
   m_deviceRateSet.push_back (WifiPhy::GetOfdmRate1_5MbpsBW5MHz ());
   m_deviceRateSet.push_back (WifiPhy::GetOfdmRate2_25MbpsBW5MHz ());
@@ -878,7 +934,9 @@
 YansWifiPhy::ConfigureHolland (void)
 {
   NS_LOG_FUNCTION (this);
-  m_channelStartingFrequency = 5e3; // 5.000 GHz
+  m_channelStartingFrequency = 5e3; //5.000 GHz
+  SetChannelWidth (20); //20 MHz
+
   m_deviceRateSet.push_back (WifiPhy::GetOfdmRate6Mbps ());
   m_deviceRateSet.push_back (WifiPhy::GetOfdmRate12Mbps ());
   m_deviceRateSet.push_back (WifiPhy::GetOfdmRate18Mbps ());
@@ -887,6 +945,74 @@
 }
 
 void
+YansWifiPhy::Configure80211n (void)
+{
+  NS_LOG_FUNCTION (this);
+  SetChannelWidth (20); //20 MHz
+  if (m_channelStartingFrequency >= 2400 && m_channelStartingFrequency <= 2500) //at 2.4 GHz
+    {
+      m_deviceRateSet.push_back (WifiPhy::GetDsssRate1Mbps ());
+      m_deviceRateSet.push_back (WifiPhy::GetDsssRate2Mbps ());
+      m_deviceRateSet.push_back (WifiPhy::GetDsssRate5_5Mbps ());
+      m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate6Mbps ());
+      m_deviceRateSet.push_back (WifiPhy::GetDsssRate11Mbps ());
+      m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate12Mbps ());
+      m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate24Mbps ());
+    }
+  if (m_channelStartingFrequency >= 5000 && m_channelStartingFrequency <= 6000) //at 5 GHz
+    {
+      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate6Mbps ());
+      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate12Mbps ());
+      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate24Mbps ());
+    }
+
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs0 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs1 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs2 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs3 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs4 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs5 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs6 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs7 ());
+
+  m_bssMembershipSelectorSet.push_back (HT_PHY);
+}
+
+void
+YansWifiPhy::Configure80211ac (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_channelStartingFrequency = 5e3;   //5.000 GHz
+  SetChannelWidth (80); //80 MHz
+
+  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate6Mbps ());
+  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate12Mbps ());
+  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate24Mbps ());
+
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs0 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs1 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs2 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs3 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs4 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs5 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs6 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetHtMcs7 ());
+
+  m_deviceMcsSet.push_back (WifiPhy::GetVhtMcs0 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetVhtMcs1 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetVhtMcs2 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetVhtMcs3 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetVhtMcs4 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetVhtMcs5 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetVhtMcs6 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetVhtMcs7 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetVhtMcs8 ());
+  m_deviceMcsSet.push_back (WifiPhy::GetVhtMcs9 ());
+
+  m_bssMembershipSelectorSet.push_back (VHT_PHY);
+}
+
+void
 YansWifiPhy::RegisterListener (WifiPhyListener *listener)
 {
   m_state->RegisterListener (listener);
@@ -909,26 +1035,31 @@
 {
   return m_state->IsStateIdle ();
 }
+
 bool
 YansWifiPhy::IsStateBusy (void)
 {
   return m_state->IsStateBusy ();
 }
+
 bool
 YansWifiPhy::IsStateRx (void)
 {
   return m_state->IsStateRx ();
 }
+
 bool
 YansWifiPhy::IsStateTx (void)
 {
   return m_state->IsStateTx ();
 }
+
 bool
 YansWifiPhy::IsStateSwitching (void)
 {
   return m_state->IsStateSwitching ();
 }
+
 bool
 YansWifiPhy::IsStateSleep (void)
 {
@@ -940,6 +1071,7 @@
 {
   return m_state->GetStateDuration ();
 }
+
 Time
 YansWifiPhy::GetDelayUntilIdle (void)
 {
@@ -1003,7 +1135,7 @@
 }
 
 void
-YansWifiPhy::EndReceive (Ptr<Packet> packet, enum WifiPreamble preamble, uint8_t packetType, Ptr<InterferenceHelper::Event> event)
+YansWifiPhy::EndReceive (Ptr<Packet> packet, enum WifiPreamble preamble, struct mpduInfo aMpdu, Ptr<InterferenceHelper::Event> event)
 {
   NS_LOG_FUNCTION (this << packet << event);
   NS_ASSERT (IsStateRx ());
@@ -1012,47 +1144,46 @@
   struct InterferenceHelper::SnrPer snrPer;
   snrPer = m_interference.CalculatePlcpPayloadSnrPer (event);
   m_interference.NotifyRxEnd ();
-  
+
   if (m_plcpSuccess == true)
-  {
-    NS_LOG_DEBUG ("mode=" << (event->GetPayloadMode ().GetDataRate ()) <<
-                  ", snr=" << snrPer.snr << ", per=" << snrPer.per << ", size=" << packet->GetSize ());
-  
-    if (m_random->GetValue () > snrPer.per)
-    {
-      NotifyRxEnd (packet);
-      uint32_t dataRate500KbpsUnits;
-      if ((event->GetPayloadMode ().GetModulationClass () == WIFI_MOD_CLASS_HT))
+    {
+      NS_LOG_DEBUG ("mode=" << (event->GetPayloadMode ().GetDataRate (event->GetTxVector ().GetChannelWidth (), event->GetTxVector ().IsShortGuardInterval (), 1)) <<
+                    ", snr(dB)=" << RatioToDb (snrPer.snr) << ", per=" << snrPer.per << ", size=" << packet->GetSize ());
+
+      if (m_random->GetValue () > snrPer.per)
         {
-          dataRate500KbpsUnits = 128 + WifiModeToMcs (event->GetPayloadMode ());
+          NotifyRxEnd (packet);
+          uint32_t dataRate500KbpsUnits;
+          if ((event->GetPayloadMode ().GetModulationClass () == WIFI_MOD_CLASS_HT) || (event->GetPayloadMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT))
+            {
+              dataRate500KbpsUnits = 128 + event->GetPayloadMode ().GetMcsValue ();
+            }
+          else
+            {
+              dataRate500KbpsUnits = event->GetPayloadMode ().GetDataRate (event->GetTxVector ().GetChannelWidth (), event->GetTxVector ().IsShortGuardInterval (), 1) * event->GetTxVector ().GetNss () / 500000;
+            }
+          struct signalNoiseDbm signalNoise;
+          signalNoise.signal = RatioToDb (event->GetRxPowerW ()) + 30;
+          signalNoise.noise = RatioToDb (event->GetRxPowerW () / snrPer.snr) - GetRxNoiseFigure () + 30;
+          NotifyMonitorSniffRx (packet, (uint16_t)GetChannelFrequencyMhz (), GetChannelNumber (), dataRate500KbpsUnits, event->GetPreambleType (), event->GetTxVector (), aMpdu, signalNoise);
+          m_state->SwitchFromRxEndOk (packet, snrPer.snr, event->GetTxVector (), event->GetPreambleType ());
         }
       else
         {
-          dataRate500KbpsUnits = event->GetPayloadMode ().GetDataRate () * event->GetTxVector().GetNss()/ 500000;
+          /* failure. */
+          NotifyRxDrop (packet);
+          m_state->SwitchFromRxEndError (packet, snrPer.snr);
         }
-      bool isShortPreamble = (WIFI_PREAMBLE_SHORT == event->GetPreambleType ());
-      double signalDbm = RatioToDb (event->GetRxPowerW ()) + 30;
-      double noiseDbm = RatioToDb (event->GetRxPowerW () / snrPer.snr) - GetRxNoiseFigure () + 30;
-      NotifyMonitorSniffRx (packet, (uint16_t)GetChannelFrequencyMhz (), GetChannelNumber (), dataRate500KbpsUnits, isShortPreamble, signalDbm, noiseDbm);
-      m_state->SwitchFromRxEndOk (packet, snrPer.snr, event->GetTxVector (), event->GetPreambleType ());
     }
-    else
+  else
     {
-      /* failure. */
-      NotifyRxDrop (packet);
       m_state->SwitchFromRxEndError (packet, snrPer.snr);
     }
-  }
-  else
-  {
-    m_state->SwitchFromRxEndError (packet, snrPer.snr); //notify rx end
-  }
-    
-  if (preamble == WIFI_PREAMBLE_NONE && packetType == 2)
+
+  if (preamble == WIFI_PREAMBLE_NONE && aMpdu.packetType == 2)
     {
       m_plcpSuccess = false;
     }
-    
 }
 
 int64_t
@@ -1074,6 +1205,7 @@
 {
   m_numberOfTransmitters = tx;
 }
+
 void
 YansWifiPhy::SetNumberOfReceiveAntennas (uint32_t rx)
 {
@@ -1097,11 +1229,13 @@
 {
   m_greenfield = greenfield;
 }
+
 bool
 YansWifiPhy::GetGuardInterval (void) const
 {
   return m_guardInterval;
 }
+
 void
 YansWifiPhy::SetGuardInterval (bool guardInterval)
 {
@@ -1119,6 +1253,7 @@
 {
   return m_numberOfTransmitters;
 }
+
 uint32_t
 YansWifiPhy::GetNumberOfReceiveAntennas (void) const
 {
@@ -1130,6 +1265,7 @@
 {
   return m_ldpc;
 }
+
 bool
 YansWifiPhy::GetStbc (void) const
 {
@@ -1142,318 +1278,75 @@
   return m_greenfield;
 }
 
-bool
-YansWifiPhy::GetChannelBonding(void) const
-{
-  return m_channelBonding;
-}
-
 void
-YansWifiPhy::SetChannelBonding(bool channelbonding) 
+YansWifiPhy::SetChannelWidth (uint32_t channelwidth)
 {
-  m_channelBonding= channelbonding;
+  NS_ASSERT_MSG (channelwidth == 5 || channelwidth == 10 || channelwidth == 20 || channelwidth == 22 || channelwidth == 40 || channelwidth == 80 || channelwidth == 160, "wrong channel width value");
+  m_channelWidth = channelwidth;
 }
 
-void
-YansWifiPhy::Configure80211n (void)
+uint32_t
+YansWifiPhy::GetChannelWidth (void) const
 {
-  NS_LOG_FUNCTION (this);
-  if (m_channelStartingFrequency>=2400 && m_channelStartingFrequency<=2500) //@ 2.4 GHz
-    {
-      m_deviceRateSet.push_back (WifiPhy::GetDsssRate1Mbps ());
-      m_deviceRateSet.push_back (WifiPhy::GetDsssRate2Mbps ());
-      m_deviceRateSet.push_back (WifiPhy::GetDsssRate5_5Mbps ());
-      m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate6Mbps ());
-      m_deviceRateSet.push_back (WifiPhy::GetDsssRate11Mbps ());
-      m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate12Mbps ());
-      m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate24Mbps ());
-    }
-  if (m_channelStartingFrequency>=5000 && m_channelStartingFrequency<=6000) //@ 5 GHz
-    {
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate6Mbps ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate12Mbps ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate24Mbps ());
-    }
-  m_bssMembershipSelectorSet.push_back(HT_PHY);
-  for (uint8_t i=0; i <8; i++)
-    {
-      m_deviceMcsSet.push_back(i);
-    }
-
+  return m_channelWidth;
 }
+
 uint32_t
 YansWifiPhy::GetNBssMembershipSelectors (void) const
 {
-  return  m_bssMembershipSelectorSet.size ();
+  return m_bssMembershipSelectorSet.size ();
 }
+
 uint32_t
 YansWifiPhy::GetBssMembershipSelector (uint32_t selector) const
 {
-  return  m_bssMembershipSelectorSet[selector];
+  return m_bssMembershipSelectorSet[selector];
 }
+
 WifiModeList
-YansWifiPhy::GetMembershipSelectorModes(uint32_t selector)
+YansWifiPhy::GetMembershipSelectorModes (uint32_t selector)
 {
-  uint32_t id=GetBssMembershipSelector(selector);
+  uint32_t id = GetBssMembershipSelector (selector);
   WifiModeList supportedmodes;
-  if (id == HT_PHY)
-  {
-    //mandatory MCS 0 to 7
-     supportedmodes.push_back (WifiPhy::GetOfdmRate6_5MbpsBW20MHz ());
-     supportedmodes.push_back (WifiPhy::GetOfdmRate13MbpsBW20MHz ());
-     supportedmodes.push_back (WifiPhy::GetOfdmRate19_5MbpsBW20MHz ());
-     supportedmodes.push_back (WifiPhy::GetOfdmRate26MbpsBW20MHz ());
-     supportedmodes.push_back (WifiPhy::GetOfdmRate39MbpsBW20MHz ());
-     supportedmodes.push_back (WifiPhy::GetOfdmRate52MbpsBW20MHz ());
-     supportedmodes.push_back (WifiPhy::GetOfdmRate58_5MbpsBW20MHz ());
-     supportedmodes.push_back (WifiPhy::GetOfdmRate65MbpsBW20MHz ());
-  }
+  if (id == HT_PHY || id == VHT_PHY)
+    {
+      //mandatory MCS 0 to 7
+      supportedmodes.push_back (WifiPhy::GetHtMcs0 ());
+      supportedmodes.push_back (WifiPhy::GetHtMcs1 ());
+      supportedmodes.push_back (WifiPhy::GetHtMcs2 ());
+      supportedmodes.push_back (WifiPhy::GetHtMcs3 ());
+      supportedmodes.push_back (WifiPhy::GetHtMcs4 ());
+      supportedmodes.push_back (WifiPhy::GetHtMcs5 ());
+      supportedmodes.push_back (WifiPhy::GetHtMcs6 ());
+      supportedmodes.push_back (WifiPhy::GetHtMcs7 ());
+    }
+  if (id == VHT_PHY)
+    {
+      //mandatory MCS 0 to 9
+      supportedmodes.push_back (WifiPhy::GetVhtMcs0 ());
+      supportedmodes.push_back (WifiPhy::GetVhtMcs1 ());
+      supportedmodes.push_back (WifiPhy::GetVhtMcs2 ());
+      supportedmodes.push_back (WifiPhy::GetVhtMcs3 ());
+      supportedmodes.push_back (WifiPhy::GetVhtMcs4 ());
+      supportedmodes.push_back (WifiPhy::GetVhtMcs5 ());
+      supportedmodes.push_back (WifiPhy::GetVhtMcs6 ());
+      supportedmodes.push_back (WifiPhy::GetVhtMcs7 ());
+      supportedmodes.push_back (WifiPhy::GetVhtMcs8 ());
+      supportedmodes.push_back (WifiPhy::GetVhtMcs9 ());
+    }
   return supportedmodes;
 }
+
 uint8_t
 YansWifiPhy::GetNMcs (void) const
 {
-  return  m_deviceMcsSet.size ();
+  return m_deviceMcsSet.size ();
 }
-uint8_t
+
+WifiMode
 YansWifiPhy::GetMcs (uint8_t mcs) const
 {
-  return  m_deviceMcsSet[mcs];
-}
-uint32_t 
-YansWifiPhy::WifiModeToMcs (WifiMode mode)
-{
-    uint32_t mcs = 0;
-   if (mode.GetUniqueName() == "OfdmRate135MbpsBW40MHzShGi" || mode.GetUniqueName() == "OfdmRate65MbpsBW20MHzShGi" )
-     {
-             mcs=6;
-     }
-  else
-    {
-     switch (mode.GetDataRate())
-       {
-         case 6500000:
-         case 7200000:
-         case 13500000:
-         case 15000000:
-           mcs=0;
-           break;
-         case 13000000:
-         case 14400000:
-         case 27000000:
-         case 30000000:
-           mcs=1;
-           break;
-         case 19500000:
-         case 21700000:
-         case 40500000:
-         case 45000000:
-           mcs=2;
-           break;
-         case 26000000:
-         case 28900000:
-         case 54000000:
-         case 60000000:
-           mcs=3;
-           break;
-         case 39000000:
-         case 43300000:
-         case 81000000:
-         case 90000000:        
-           mcs=4;
-           break;
-         case 52000000:
-         case 57800000:
-         case 108000000:
-         case 120000000:
-           mcs=5;
-           break; 
-         case 58500000:
-         case 121500000:
-           mcs=6;
-           break;
-         case 65000000:
-         case 72200000:
-         case 135000000:
-         case 150000000:
-           mcs=7;
-           break;     
-       }
-    }
-  return mcs;
+  return m_deviceMcsSet[mcs];
 }
-WifiMode
-YansWifiPhy::McsToWifiMode (uint8_t mcs)
-{
-   WifiMode mode;
-   switch (mcs)
-     { 
-       case 7:
-          if (!GetGuardInterval() && !GetChannelBonding())
-           {
-              mode =  WifiPhy::GetOfdmRate65MbpsBW20MHz ();
-            }
-         else if(GetGuardInterval() && !GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate72_2MbpsBW20MHz ();
-            }
-          else if (!GetGuardInterval() && GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate135MbpsBW40MHz ();
-            }
-          else
-            {
-              mode = WifiPhy::GetOfdmRate150MbpsBW40MHz ();
-            }
-          break;
-       case 6:
-          if (!GetGuardInterval() && !GetChannelBonding())
-           {
-              mode = WifiPhy::GetOfdmRate58_5MbpsBW20MHz ();
- 
-            }
-         else if(GetGuardInterval() && !GetChannelBonding())
-            {
-              mode =  WifiPhy::GetOfdmRate65MbpsBW20MHzShGi ();
-       
-            }
-          else if (!GetGuardInterval() && GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate121_5MbpsBW40MHz ();
-     
-            }
-          else
-            {
-              mode= WifiPhy::GetOfdmRate135MbpsBW40MHzShGi ();
-          
-            }
-          break;
-       case 5:
-          if (!GetGuardInterval() && !GetChannelBonding())
-           {
-              mode = WifiPhy::GetOfdmRate52MbpsBW20MHz ();
-  
-            }
-         else if(GetGuardInterval() && !GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate57_8MbpsBW20MHz ();
-            }
-          else if (!GetGuardInterval() && GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate108MbpsBW40MHz ();
-     
-            }
-          else
-            {
-              mode = WifiPhy::GetOfdmRate120MbpsBW40MHz ();
-       
-            }
-          break;
-       case 4:
-          if (!GetGuardInterval() && !GetChannelBonding())
-           {
-              mode = WifiPhy::GetOfdmRate39MbpsBW20MHz ();
-            }
-         else if(GetGuardInterval() && !GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate43_3MbpsBW20MHz ();
-            }
-          else if (!GetGuardInterval() && GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate81MbpsBW40MHz ();
-  
-            }
-          else
-            {
-              mode = WifiPhy::GetOfdmRate90MbpsBW40MHz ();
-         
-            }
-          break;
-       case 3:
-          if (!GetGuardInterval() && !GetChannelBonding())
-           {
-              mode =  WifiPhy::GetOfdmRate26MbpsBW20MHz ();
-  
-            }
-         else if(GetGuardInterval() && !GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate28_9MbpsBW20MHz ();
-      
-            }
-          else if (!GetGuardInterval() && GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate54MbpsBW40MHz ();
-     
-            }
-          else
-            {
-              mode = WifiPhy::GetOfdmRate60MbpsBW40MHz ();
-            }
-          break;
-       case 2:
-          if (!GetGuardInterval() && !GetChannelBonding())
-           {
-              mode = WifiPhy::GetOfdmRate19_5MbpsBW20MHz ();
- 
-            }
-         else if(GetGuardInterval() && !GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate21_7MbpsBW20MHz ();
-     
-            }
-          else if (!GetGuardInterval() && GetChannelBonding())
-            {
-              mode =  WifiPhy::GetOfdmRate40_5MbpsBW40MHz ();
-  
-            }
-          else
-            {
-              mode = WifiPhy::GetOfdmRate45MbpsBW40MHz ();
-           
-            }
-          break;
-       case 1:
-          if (!GetGuardInterval() && !GetChannelBonding())
-           {
-            mode = WifiPhy::GetOfdmRate13MbpsBW20MHz ();
-  
-            }
-         else if(GetGuardInterval() && !GetChannelBonding())
-            {
-              mode =  WifiPhy::GetOfdmRate14_4MbpsBW20MHz ();
-            }
-          else if (!GetGuardInterval() && GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate27MbpsBW40MHz ();
-     
-            }
-          else
-            {
-              mode = WifiPhy::GetOfdmRate30MbpsBW40MHz ();
-            }
-          break;
-       case 0:
-       default:
-         if (!GetGuardInterval() && !GetChannelBonding())
-           {
-              mode = WifiPhy::GetOfdmRate6_5MbpsBW20MHz ();
-              
-            }
-         else if(GetGuardInterval() && !GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate7_2MbpsBW20MHz ();
-            }
-          else if (!GetGuardInterval() && GetChannelBonding())
-            {
-              mode = WifiPhy::GetOfdmRate13_5MbpsBW40MHz ();
- 
-            }
-          else
-            {
-              mode = WifiPhy::GetOfdmRate15MbpsBW40MHz ();
-            }
-         break;
-        }
- return mode;
-}
-} // namespace ns3
+
+} //namespace ns3
diff -Naur ns-3.23/src/wifi/model/yans-wifi-phy.h ns-3.24/src/wifi/model/yans-wifi-phy.h
--- ns-3.23/src/wifi/model/yans-wifi-phy.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/model/yans-wifi-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -15,8 +15,9 @@
  * 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>
- * Author: ghada Badawy <gbadawy@gmail.com>
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Ghada Badawy <gbadawy@gmail.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
 #ifndef YANS_WIFI_PHY_H
@@ -31,15 +32,16 @@
 #include "ns3/nstime.h"
 #include "ns3/ptr.h"
 #include "ns3/random-variable-stream.h"
+#include "ns3/mobility-model.h"
 #include "wifi-phy.h"
 #include "wifi-mode.h"
 #include "wifi-preamble.h"
 #include "wifi-phy-standard.h"
 #include "interference-helper.h"
 
-
 namespace ns3 {
 
+#define VHT_PHY 126
 #define HT_PHY 127
 
 class YansWifiChannel;
@@ -75,7 +77,6 @@
    * \param channel the YansWifiChannel this YansWifiPhy is to be connected to
    */
   void SetChannel (Ptr<YansWifiChannel> channel);
-
   /**
    * Set the current channel number.
    *
@@ -96,7 +97,7 @@
    * Return current center channel frequency in MHz.
    *
    * \return the current center channel frequency in MHz
-   */  
+   */
   double GetChannelFrequencyMhz () const;
 
   /**
@@ -106,28 +107,30 @@
    * \param rxPowerDbm the receive power in dBm
    * \param txVector the TXVECTOR of the arriving packet
    * \param preamble the preamble of the arriving packet
-   * \param packetType The type of the received packet (values: 0 not an A-MPDU, 1 corresponds to any packets in an A-MPDU except the last one, 2 is the last packet in an A-MPDU) 
+   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
+   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
    * \param rxDuration the duration needed for the reception of the packet
    */
-  void StartReceivePlcp (Ptr<Packet> packet,
-                         double rxPowerDbm,
-                         WifiTxVector txVector,
-                         WifiPreamble preamble,
-                         uint8_t packetType,
-                         Time rxDuration);
+  void StartReceivePreambleAndHeader (Ptr<Packet> packet,
+                                      double rxPowerDbm,
+                                      WifiTxVector txVector,
+                                      WifiPreamble preamble,
+                                      struct mpduInfo aMpdu,
+                                      Time rxDuration);
   /**
    * Starting receiving the payload of a packet (i.e. the first bit of the packet has arrived).
    *
    * \param packet the arriving packet
    * \param txVector the TXVECTOR of the arriving packet
    * \param preamble the preamble of the arriving packet
-   * \param packetType The type of the received packet (values: 0 not an A-MPDU, 1 corresponds to any packets in an A-MPDU except the last one, 2 is the last packet in an A-MPDU) 
+   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
+   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
    * \param event the corresponding event of the first time the packet arrives
    */
   void StartReceivePacket (Ptr<Packet> packet,
                            WifiTxVector txVector,
                            WifiPreamble preamble,
-                           uint8_t packetType,
+                           struct mpduInfo aMpdu,
                            Ptr<InterferenceHelper::Event> event);
 
   /**
@@ -150,7 +153,7 @@
   void SetTxPowerEnd (double end);
   /**
    * Sets the number of transmission power levels available between the
-   * minimum level and the maximum level.  Transmission power levels are
+   * minimum level and the maximum level. Transmission power levels are
    * equally separated (in dBm) with the minimum and the maximum included.
    *
    * \param n the number of available levels
@@ -177,7 +180,7 @@
    */
   void SetEdThreshold (double threshold);
   /**
-   * Sets the CCA threshold (dBm).  The energy of a received signal
+   * Sets the CCA threshold (dBm). The energy of a received signal
    * should be higher than this threshold to allow the PHY
    * layer to declare CCA BUSY state.
    *
@@ -195,13 +198,18 @@
    *
    * \param device the device this PHY is associated with
    */
-  void SetDevice (Ptr<Object> device);
+  void SetDevice (Ptr<NetDevice> device);
   /**
-   * Sets the mobility model.
+   * \brief assign a mobility model to this device
+   *
+   * This method allows a user to specify a mobility model that should be
+   * associated with this physical layer.  Calling this method is optional
+   * and only necessary if the user wants to override the mobility model
+   * that is aggregated to the node.
    *
    * \param mobility the mobility model this PHY is associated with
    */
-  void SetMobility (Ptr<Object> mobility);
+  void SetMobility (Ptr<MobilityModel> mobility);
   /**
    * Return the RX noise figure (dBm).
    *
@@ -243,14 +251,17 @@
    *
    * \return the device this PHY is associated with
    */
-  Ptr<Object> GetDevice (void) const;
+  Ptr<NetDevice> GetDevice (void) const;
   /**
    * Return the mobility model this PHY is associated with.
+   * This method will return either the mobility model that has been
+   * explicitly set by a call to YansWifiPhy::SetMobility(), or else
+   * will return the mobility model (if any) that has been aggregated
+   * to the node.
    *
    * \return the mobility model this PHY is associated with
    */
-  Ptr<Object> GetMobility (void);
-
+  Ptr<MobilityModel> GetMobility (void);
   /**
    * Return the minimum available transmission power level (dBm).
    * \return the minimum available transmission power level (dBm)
@@ -267,9 +278,10 @@
    * \return the number of available transmission power levels
    */
   virtual uint32_t GetNTxPower (void) const;
+
   virtual void SetReceiveOkCallback (WifiPhy::RxOkCallback callback);
   virtual void SetReceiveErrorCallback (WifiPhy::RxErrorCallback callback);
-  virtual void SendPacket (Ptr<const Packet> packet, WifiTxVector txvector, enum WifiPreamble preamble, uint8_t packetType);
+  virtual void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, enum WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber);
   virtual void RegisterListener (WifiPhyListener *listener);
   virtual void UnregisterListener (WifiPhyListener *listener);
   virtual void SetSleepMode (void);
@@ -287,20 +299,20 @@
   virtual uint32_t GetNModes (void) const;
   virtual WifiMode GetMode (uint32_t mode) const;
   virtual bool IsModeSupported (WifiMode mode) const;
-  virtual bool IsMcsSupported (WifiMode mode);
+  virtual bool IsMcsSupported (WifiMode mcs);
   virtual double CalculateSnr (WifiMode txMode, double ber) const;
   virtual Ptr<WifiChannel> GetChannel (void) const;
-  
+
   virtual void ConfigureStandard (enum WifiPhyStandard standard);
 
- /**
-  * 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
-  */
+  /**
+   * 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);
 
   /**
@@ -315,11 +327,14 @@
    * \param tx the number of transmitters on this node.
    */
   virtual void SetNumberOfTransmitAntennas (uint32_t tx);
+  /**
+   * \return the number of transmitters on this node.
+   */
   virtual uint32_t GetNumberOfTransmitAntennas (void) const;
   /**
    * \param rx the number of receivers on this node.
    */
-  virtual void SetNumberOfReceiveAntennas (uint32_t rx) ;
+  virtual void SetNumberOfReceiveAntennas (uint32_t rx);
   /**
    * \return the number of receivers on this node.
    */
@@ -354,7 +369,7 @@
    */
   virtual void SetStbc (bool stbc);
   /**
-   * Return whether STBC is supported. 
+   * Return whether STBC is supported.
    *
    * \return true if STBC is supported, false otherwise
    */
@@ -372,33 +387,32 @@
    */
   virtual bool GetGreenfield (void) const;
   /**
-   * Return whether channel bonding is supported.
-   * 
-   * \return true if channel bonding is supported, false otherwise
+   * Return channel width.
+   *
+   * \return channel width
    */
-  virtual bool GetChannelBonding (void) const ;
+  virtual uint32_t GetChannelWidth (void) const;
   /**
-   * Enable or disable channel bonding support.
-   * 
-   * \param channelbonding Enable or disable channel bonding
+   * Set channel width.
+   *
+   * \param channel width
    */
-  virtual void SetChannelBonding (bool channelbonding) ;
+  virtual void SetChannelWidth (uint32_t channelwidth);
 
   virtual uint32_t GetNBssMembershipSelectors (void) const;
   virtual uint32_t GetBssMembershipSelector (uint32_t selector) const;
-  virtual WifiModeList GetMembershipSelectorModes(uint32_t selector);
+  virtual WifiModeList GetMembershipSelectorModes (uint32_t selector);
+
   /**
    * \return the number of MCS supported by this phy
    */
   virtual uint8_t GetNMcs (void) const;
-  virtual uint8_t GetMcs (uint8_t mcs) const;
-
-  virtual uint32_t WifiModeToMcs (WifiMode mode);
-  virtual WifiMode McsToWifiMode (uint8_t mcs);
+  virtual WifiMode GetMcs (uint8_t mcs) const;
 
 private:
-  //YansWifiPhy (const YansWifiPhy &o);
+  virtual void DoInitialize (void);
   virtual void DoDispose (void);
+
   /**
    * Configure YansWifiPhy with appropriate channel frequency and
    * supported rates for 802.11a standard.
@@ -431,6 +445,11 @@
    */
   void Configure80211n (void);
   /**
+   * Configure YansWifiPhy with appropriate channel frequency and
+   * supported rates for 802.11ac standard.
+   */
+  void Configure80211ac (void);
+  /**
    * Return the energy detection threshold.
    *
    * \return the energy detection threshold.
@@ -440,6 +459,7 @@
    * Convert from dBm to Watts.
    *
    * \param dbm the power in dBm
+   *
    * \return the equivalent Watts for the given dBm
    */
   double DbmToW (double dbm) const;
@@ -447,6 +467,7 @@
    * Convert from dB to ratio.
    *
    * \param db
+   *
    * \return ratio
    */
   double DbToRatio (double db) const;
@@ -454,6 +475,7 @@
    * Convert from Watts to dBm.
    *
    * \param w the power in Watts
+   *
    * \return the equivalent dBm for the given Watts
    */
   double WToDbm (double w) const;
@@ -461,6 +483,7 @@
    * Convert from ratio to dB.
    *
    * \param ratio
+   *
    * \return dB
    */
   double RatioToDb (double ratio) const;
@@ -469,6 +492,7 @@
    * In YansWifiPhy implementation, the power levels are equally spaced (in dBm).
    *
    * \param power the power level
+   *
    * \return the transmission power in dBm at the given power level
    */
   double GetPowerDbm (uint8_t power) const;
@@ -477,14 +501,12 @@
    *
    * \param packet the packet that the last bit has arrived
    * \param preamble the preamble of the arriving packet
-   * \param packetType The type of the received packet (values: 0 not an A-MPDU, 1 corresponds to any packets in an A-MPDU except the last one, 2 is the last packet in an A-MPDU)
+   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
+   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
    * \param event the corresponding event of the first time the packet arrives
    */
-  void EndReceive (Ptr<Packet> packet, enum WifiPreamble preamble, uint8_t packetType, Ptr<InterferenceHelper::Event> event);
+  void EndReceive (Ptr<Packet> packet, enum WifiPreamble preamble, struct mpduInfo aMpdu, Ptr<InterferenceHelper::Event> event);
 
-private:
-  virtual void DoInitialize (void);
-  
   bool     m_initialized;         //!< Flag for runtime initialization
   double   m_edThresholdW;        //!< Energy detection threshold in watts
   double   m_ccaMode1ThresholdW;  //!< Clear channel assessment (CCA) threshold in watts
@@ -496,16 +518,16 @@
 
   Ptr<YansWifiChannel> m_channel;        //!< YansWifiChannel that this YansWifiPhy is connected to
   uint16_t             m_channelNumber;  //!< Operating channel number
-  Ptr<Object>          m_device;         //!< Pointer to the device
-  Ptr<Object>          m_mobility;       //!< Pointer to the mobility model
+  Ptr<NetDevice>       m_device;         //!< Pointer to the device
+  Ptr<MobilityModel>   m_mobility;       //!< Pointer to the mobility model
 
   uint32_t m_numberOfTransmitters;  //!< Number of transmitters
   uint32_t m_numberOfReceivers;     //!< Number of receivers
   bool     m_ldpc;                  //!< Flag if LDPC is used
-  bool     m_stbc;                  //!< Flag if STBC is used      
+  bool     m_stbc;                  //!< Flag if STBC is used
   bool     m_greenfield;            //!< Flag if GreenField format is supported
   bool     m_guardInterval;         //!< Flag if short guard interval is used
-  bool     m_channelBonding;        //!< Flag if channel bonding is used
+  uint32_t m_channelWidth;          //!< Channel width
 
 
   /**
@@ -545,9 +567,9 @@
    * mandatory rates".
    */
   WifiModeList m_deviceRateSet;
-  
+  WifiModeList m_deviceMcsSet;
+
   std::vector<uint32_t> m_bssMembershipSelectorSet;
-  std::vector<uint8_t> m_deviceMcsSet;
   EventId m_endRxEvent;
   EventId m_endPlcpRxEvent;
 
@@ -560,7 +582,6 @@
   bool m_plcpSuccess;                   //!< Flag if the PLCP of the packet or the first MPDU in an A-MPDU has been received
 };
 
-} // namespace ns3
-
+} //namespace ns3
 
 #endif /* YANS_WIFI_PHY_H */
diff -Naur ns-3.23/src/wifi/test/block-ack-test-suite.cc ns-3.24/src/wifi/test/block-ack-test-suite.cc
--- ns-3.23/src/wifi/test/block-ack-test-suite.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/test/block-ack-test-suite.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
+
 #include "ns3/test.h"
 #include "ns3/log.h"
 #include "ns3/qos-utils.h"
@@ -98,7 +99,6 @@
   uint32_t mappedSeq = QosUtilsMapSeqControlToUniqueInteger (receivedSeq, endSeq);
   for (i = m_buffer.begin (); i != m_buffer.end () && QosUtilsMapSeqControlToUniqueInteger ((*i), endSeq) < mappedSeq; i++)
     {
-      ;
     }
   {
     m_buffer.insert (i, receivedSeq);
@@ -108,7 +108,6 @@
   mappedSeq = QosUtilsMapSeqControlToUniqueInteger (receivedSeq, endSeq);
   for (i = m_buffer.begin (); i != m_buffer.end () && QosUtilsMapSeqControlToUniqueInteger ((*i), endSeq) < mappedSeq; i++)
     {
-      ;
     }
   {
     m_buffer.insert (i, receivedSeq);
@@ -120,6 +119,7 @@
     }
 }
 
+
 /* ----- = old packets
  * +++++ = new packets
  *
@@ -183,7 +183,6 @@
   uint32_t mappedSeq = QosUtilsMapSeqControlToUniqueInteger (receivedSeq, endSeq);
   for (i = m_buffer.begin (); i != m_buffer.end () && QosUtilsMapSeqControlToUniqueInteger ((*i), endSeq) < mappedSeq; i++)
     {
-      ;
     }
   {
     m_buffer.insert (i, receivedSeq);
@@ -193,7 +192,6 @@
   mappedSeq = QosUtilsMapSeqControlToUniqueInteger (receivedSeq, endSeq);
   for (i = m_buffer.begin (); i != m_buffer.end () && QosUtilsMapSeqControlToUniqueInteger ((*i), endSeq) < mappedSeq; i++)
     {
-      ;
     }
   {
     m_buffer.insert (i, receivedSeq);
@@ -203,7 +201,6 @@
   mappedSeq = QosUtilsMapSeqControlToUniqueInteger (receivedSeq, endSeq);
   for (i = m_buffer.begin (); i != m_buffer.end () && QosUtilsMapSeqControlToUniqueInteger ((*i), endSeq) < mappedSeq; i++)
     {
-      ;
     }
   {
     m_buffer.insert (i, receivedSeq);
@@ -215,6 +212,7 @@
     }
 }
 
+
 //Test for block ack header
 class CtrlBAckResponseHeaderTest : public TestCase
 {
@@ -276,6 +274,7 @@
   NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.IsPacketReceived (80), false, "error in compressed bitmap");
 }
 
+
 class BlockAckTestSuite : public TestSuite
 {
 public:
diff -Naur ns-3.23/src/wifi/test/dcf-manager-test.cc ns-3.24/src/wifi/test/dcf-manager-test.cc
--- ns-3.23/src/wifi/test/dcf-manager-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/test/dcf-manager-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -31,6 +31,8 @@
 public:
   DcfStateTest (DcfManagerTest *test, uint32_t i);
   void QueueTx (uint64_t txTime, uint64_t expectedGrantTime);
+
+
 private:
   friend class DcfManagerTest;
   virtual void DoNotifyAccessGranted (void);
@@ -63,7 +65,6 @@
   DcfManagerTest ();
   virtual void DoRun (void);
 
-
   void NotifyAccessGranted (uint32_t i);
   void NotifyInternalCollision (uint32_t i);
   void NotifyCollision (uint32_t i);
@@ -106,47 +107,50 @@
   uint32_t m_ackTimeoutValue;
 };
 
-
-
 DcfStateTest::DcfStateTest (DcfManagerTest *test, uint32_t i)
   : m_test (test),
     m_i (i)
 {
 }
+
 void
 DcfStateTest::QueueTx (uint64_t txTime, uint64_t expectedGrantTime)
 {
   m_expectedGrants.push_back (std::make_pair (txTime, expectedGrantTime));
 }
+
 void
 DcfStateTest::DoNotifyAccessGranted (void)
 {
   m_test->NotifyAccessGranted (m_i);
 }
+
 void
 DcfStateTest::DoNotifyInternalCollision (void)
 {
   m_test->NotifyInternalCollision (m_i);
 }
+
 void
 DcfStateTest::DoNotifyCollision (void)
 {
   m_test->NotifyCollision (m_i);
 }
+
 void
 DcfStateTest::DoNotifyChannelSwitching (void)
 {
   m_test->NotifyChannelSwitching (m_i);
 }
+
 void
 DcfStateTest::DoNotifySleep (void)
 {
-
 }
+
 void
 DcfStateTest::DoNotifyWakeUp (void)
 {
-
 }
 
 DcfManagerTest::DcfManagerTest ()
@@ -165,6 +169,7 @@
   m_dcfManager->NotifyTxStartNow (MicroSeconds (expected.first));
   m_dcfManager->NotifyAckTimeoutStartNow (MicroSeconds (m_ackTimeoutValue + expected.first));
 }
+
 void
 DcfManagerTest::AddTxEvt (uint64_t at, uint64_t duration)
 {
@@ -172,6 +177,7 @@
                        &DcfManager::NotifyTxStartNow, m_dcfManager,
                        MicroSeconds (duration));
 }
+
 void
 DcfManagerTest::NotifyInternalCollision (uint32_t i)
 {
@@ -182,6 +188,7 @@
   NS_TEST_EXPECT_MSG_EQ (Simulator::Now (), MicroSeconds (expected.at), "Expected internal collision time is now");
   state->StartBackoffNow (expected.nSlots);
 }
+
 void
 DcfManagerTest::NotifyCollision (uint32_t i)
 {
@@ -192,6 +199,7 @@
   NS_TEST_EXPECT_MSG_EQ (Simulator::Now (), MicroSeconds (expected.at), "Expected collision is now");
   state->StartBackoffNow (expected.nSlots);
 }
+
 void
 DcfManagerTest::NotifyChannelSwitching (uint32_t i)
 {
@@ -213,6 +221,7 @@
   col.nSlots = nSlots;
   state->m_expectedInternalCollision.push_back (col);
 }
+
 void
 DcfManagerTest::ExpectCollision (uint64_t time, uint32_t nSlots, uint32_t from)
 {
@@ -268,6 +277,7 @@
   Simulator::Schedule (MicroSeconds (at + duration) - Now (),
                        &DcfManager::NotifyRxEndOkNow, m_dcfManager);
 }
+
 void
 DcfManagerTest::AddRxInsideSifsEvt (uint64_t at, uint64_t duration)
 {
@@ -275,6 +285,7 @@
                        &DcfManager::NotifyRxStartNow, m_dcfManager,
                        MicroSeconds (duration));
 }
+
 void
 DcfManagerTest::AddRxErrorEvt (uint64_t at, uint64_t duration)
 {
@@ -292,6 +303,7 @@
                        &DcfManager::NotifyNavResetNow, m_dcfManager,
                        MicroSeconds (duration));
 }
+
 void
 DcfManagerTest::AddNavStart (uint64_t at, uint64_t duration)
 {
@@ -299,18 +311,21 @@
                        &DcfManager::NotifyNavStartNow, m_dcfManager,
                        MicroSeconds (duration));
 }
+
 void
 DcfManagerTest::AddAckTimeoutReset (uint64_t at)
 {
   Simulator::Schedule (MicroSeconds (at) - Now (),
                        &DcfManager::NotifyAckTimeoutResetNow, m_dcfManager);
 }
+
 void
 DcfManagerTest::AddAccessRequest (uint64_t at, uint64_t txTime,
                                   uint64_t expectedGrantTime, uint32_t from)
 {
   AddAccessRequestWithSuccessfullAck (at, txTime, expectedGrantTime, 0, from);
 }
+
 void
 DcfManagerTest::AddAccessRequestWithAckTimeout (uint64_t at, uint64_t txTime,
                                                 uint64_t expectedGrantTime, uint32_t from)
@@ -319,6 +334,7 @@
                        &DcfManagerTest::DoAccessRequest, this,
                        txTime, expectedGrantTime, m_dcfStates[from]);
 }
+
 void
 DcfManagerTest::AddAccessRequestWithSuccessfullAck (uint64_t at, uint64_t txTime,
                                                     uint64_t expectedGrantTime, uint32_t ackDelay, uint32_t from)
@@ -329,12 +345,14 @@
                        txTime, expectedGrantTime, m_dcfStates[from]);
   AddAckTimeoutReset (expectedGrantTime + txTime + ackDelay);
 }
+
 void
 DcfManagerTest::DoAccessRequest (uint64_t txTime, uint64_t expectedGrantTime, DcfStateTest *state)
 {
   state->QueueTx (txTime, expectedGrantTime);
   m_dcfManager->RequestAccess (state);
 }
+
 void
 DcfManagerTest::AddCcaBusyEvt (uint64_t at, uint64_t duration)
 {
@@ -342,6 +360,7 @@
                        &DcfManager::NotifyMaybeCcaBusyStartNow, m_dcfManager,
                        MicroSeconds (duration));
 }
+
 void
 DcfManagerTest::AddSwitchingEvt (uint64_t at, uint64_t duration)
 {
@@ -349,6 +368,7 @@
                        &DcfManager::NotifySwitchingStartNow, m_dcfManager,
                        MicroSeconds (duration));
 }
+
 void
 DcfManagerTest::AddRxStartEvt (uint64_t at, uint64_t duration)
 {
@@ -357,8 +377,6 @@
                        MicroSeconds (duration));
 }
 
-
-
 void
 DcfManagerTest::DoRun (void)
 {
@@ -374,6 +392,7 @@
   //  0      3       4    5      8     9     12       13 14
   //  | sifs | aifsn | tx | sifs | ack | sifs | aifsn |  |tx |
   //
+
   StartTest (1, 3, 10);
   AddDcfState (1);
   AddAccessRequest (1, 1, 4, 0);
@@ -381,8 +400,6 @@
   AddTxEvt (8, 1);
   AddAccessRequest (14, 2, 14, 0);
   EndTest ();
-
-
   // The test below mainly intends to test the case where the medium
   // becomes busy in the middle of a backoff slot: the backoff counter
   // must not be decremented for this backoff slot. This is the case
@@ -392,20 +409,21 @@
   //   |    rx     | sifs | aifsn | bslot0  | bslot1  |   | rx   | sifs  |  aifsn | bslot2 | bslot3 | tx  |
   //        |
   //       30 request access. backoff slots: 4
+
   StartTest (4, 6, 10);
   AddDcfState (1);
   AddRxOkEvt (20, 40);
   AddRxOkEvt (80, 20);
   AddAccessRequest (30, 2, 118, 0);
-  ExpectCollision (30, 4, 0); // backoff: 4 slots
+  ExpectCollision (30, 4, 0); //backoff: 4 slots
   EndTest ();
-
   // Test the case where the backoff slots is zero.
   //
   //  20          60     66      70   72
   //   |    rx     | sifs | aifsn | tx |
   //        |
   //       30 request access. backoff slots: 0
+
   StartTest (4, 6, 10);
   AddDcfState (1);
   AddRxOkEvt (20, 40);
@@ -424,10 +442,9 @@
   AddRxOkEvt (20, 40);
   AddRxOkEvt (60, 40);
   AddAccessRequest (30, 2, 110, 0);
-  ExpectCollision (30, 0, 0); // backoff: 0 slots
+  ExpectCollision (30, 0, 0); //backoff: 0 slots
   EndTest ();
 
-
   // The test below is subject to some discussion because I am
   // not sure I understand the intent of the spec here.
   // i.e., what happens if you make a request to get access
@@ -447,7 +464,6 @@
   AddAccessRequest (62, 2, 70, 0);
   EndTest ();
 
-
   // Test an EIFS
   //
   //  20          60     66           76             86       90       94       98       102   106
@@ -458,7 +474,7 @@
   AddDcfState (1);
   AddRxErrorEvt (20, 40);
   AddAccessRequest (30, 2, 102, 0);
-  ExpectCollision (30, 4, 0); // backoff: 4 slots
+  ExpectCollision (30, 4, 0); //backoff: 4 slots
   EndTest ();
 
   // Test an EIFS which is interupted by a successfull transmission.
@@ -471,11 +487,10 @@
   AddDcfState (1);
   AddRxErrorEvt (20, 40);
   AddAccessRequest (30, 2, 101, 0);
-  ExpectCollision (30, 4, 0); // backoff: 4 slots
+  ExpectCollision (30, 4, 0); //backoff: 4 slots
   AddRxOkEvt (69, 6);
   EndTest ();
 
-
   // Test two DCFs which suffer an internal collision. the first DCF has a higher
   // priority than the second DCF.
   //
@@ -484,15 +499,14 @@
   // DCF1  |    rx     | sifs  | aifsn | aifsn  | aifsn  |     | sifs | aifsn | aifsn | aifsn | bslot |  tx  |
   //                                                                 94      98     102     106     110    112
   StartTest (4, 6, 10);
-  AddDcfState (1); // high priority DCF
-  AddDcfState (3); // low priority DCF
+  AddDcfState (1); //high priority DCF
+  AddDcfState (3); //low priority DCF
   AddRxOkEvt (20, 40);
   AddAccessRequest (30, 10, 78, 0);
-  ExpectCollision (30, 2, 0); // backoff: 2 slot
-
+  ExpectCollision (30, 2, 0); //backoff: 2 slot
   AddAccessRequest (40, 2, 110, 1);
-  ExpectCollision (40, 0, 1); // backoff: 0 slot
-  ExpectInternalCollision (78, 1, 1); // backoff: 1 slot
+  ExpectCollision (40, 0, 1); //backoff: 0 slot
+  ExpectInternalCollision (78, 1, 1); //backoff: 1 slot
   EndTest ();
 
   // Test of AckTimeout handling: First queue requests access and ack procedure fails,
@@ -503,8 +517,8 @@
   // DCF1 - high |                    |     |sifs|  tx   |
   //                                  ^ request access
   StartTest (4, 6, 10);
-  AddDcfState (2); // high priority DCF
-  AddDcfState (0); // low priority DCF
+  AddDcfState (2); //high priority DCF
+  AddDcfState (0); //low priority DCF
   AddAccessRequestWithAckTimeout (20, 20, 20, 0);
   AddAccessRequest (50, 10, 66, 1);
   EndTest ();
@@ -519,8 +533,8 @@
   // DCF1 - high |                |    |sifs|  tx   |
   //                              ^ request access
   StartTest (4, 6, 10);
-  AddDcfState (2); // high priority DCF
-  AddDcfState (0); // low priority DCF
+  AddDcfState (2); //high priority DCF
+  AddDcfState (0); //low priority DCF
   AddAccessRequestWithSuccessfullAck (20, 20, 20, 2, 0);
   AddAccessRequest (41, 10, 48, 1);
   EndTest ();
@@ -544,14 +558,12 @@
   AddDcfState (2);
   AddAccessRequestWithSuccessfullAck (20, 20, 20, 2, 0);
   AddAccessRequest (39, 10, 64, 0);
-  ExpectCollision (39, 2, 0); // backoff: 2 slot
+  ExpectCollision (39, 2, 0); //backoff: 2 slot
   EndTest ();
 
-  //
   // test simple NAV count. This scenario modelizes a simple DATA+ACK handshake
   // where the data rate used for the ACK is higher than expected by the DATA source
   // so, the data exchange completes before the end of nav.
-  //
   StartTest (4, 6, 10);
   AddDcfState (1);
   AddRxOkEvt (20, 40);
@@ -559,14 +571,12 @@
   AddRxOkEvt (66, 5);
   AddNavStart (71, 0);
   AddAccessRequest (30, 10, 93, 0);
-  ExpectCollision (30, 2, 0); // backoff: 2 slot
+  ExpectCollision (30, 2, 0); //backoff: 2 slot
   EndTest ();
 
-  //
   // test more complex NAV handling by a CF-poll. This scenario modelizes a
   // simple DATA+ACK handshake interrupted by a CF-poll which resets the
   // NAV counter.
-  //
   StartTest (4, 6, 10);
   AddDcfState (1);
   AddRxOkEvt (20, 40);
@@ -574,7 +584,7 @@
   AddRxOkEvt (66, 5);
   AddNavReset (71, 2);
   AddAccessRequest (30, 10, 91, 0);
-  ExpectCollision (30, 2, 0); // backoff: 2 slot
+  ExpectCollision (30, 2, 0); //backoff: 2 slot
   EndTest ();
 
 
@@ -590,7 +600,7 @@
   AddRxOkEvt (20, 40);
   AddRxOkEvt (78, 8);
   AddAccessRequest (30, 50, 108, 0);
-  ExpectCollision (30, 3, 0); // backoff: 3 slots
+  ExpectCollision (30, 3, 0); //backoff: 3 slots
   EndTest ();
 
 
@@ -676,13 +686,12 @@
   AddDcfState (1);
   AddRxOkEvt (20,40);
   AddAccessRequest (30, 2, 80, 0);
-  ExpectCollision (30, 4, 0); // backoff: 4 slots
+  ExpectCollision (30, 4, 0); //backoff: 4 slots
   AddSwitchingEvt (80,20);
   AddAccessRequest (101, 2, 110, 0);
   EndTest ();
 }
 
-//-----------------------------------------------------------------------------
 
 class DcfTestSuite : public TestSuite
 {
diff -Naur ns-3.23/src/wifi/test/power-rate-adaptation-test.cc ns-3.24/src/wifi/test/power-rate-adaptation-test.cc
--- ns-3.23/src/wifi/test/power-rate-adaptation-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/test/power-rate-adaptation-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -93,9 +93,9 @@
   /*
    * Configure power control parameters.
    */
-  phy->SetNTxPower(18);
-  phy->SetTxPowerStart(0);
-  phy->SetTxPowerEnd(17);
+  phy->SetNTxPower (18);
+  phy->SetTxPowerStart (0);
+  phy->SetTxPowerEnd (17);
 
   /*
    * Create manager.
@@ -119,15 +119,15 @@
 PowerRateAdaptationTest::TestParf ()
 {
   m_manager.SetTypeId ("ns3::ParfWifiManager");
-  Ptr<Node> node = ConfigureNode();
-  Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice> (node->GetDevice(0));
-  Ptr<WifiRemoteStationManager> manager = dev->GetRemoteStationManager();
+  Ptr<Node> node = ConfigureNode ();
+  Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice> (node->GetDevice (0));
+  Ptr<WifiRemoteStationManager> manager = dev->GetRemoteStationManager ();
 
   /*
    * Configure thresholds for rate and power control.
    */
-  manager->SetAttribute("AttemptThreshold",UintegerValue (15));
-  manager->SetAttribute("SuccessThreshold",UintegerValue(10));
+  manager->SetAttribute ("AttemptThreshold",UintegerValue (15));
+  manager->SetAttribute ("SuccessThreshold",UintegerValue (10));
 
   /*
    * Create a dummy packet to simulate transmission.
@@ -150,11 +150,11 @@
   /*
    * Parf initiates with maximal rate and power.
    */
-  WifiTxVector txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  WifiMode mode = txVector.GetMode();
-  int power = (int) txVector.GetTxPowerLevel();
+  WifiTxVector txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  WifiMode mode = txVector.GetMode ();
+  int power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "PARF: Initial data rate wrong");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "PARF: Initial data rate wrong");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Initial power level wrong");
 
   //-----------------------------------------------------------------------------------------------------
@@ -163,16 +163,16 @@
    * After 10 consecutive successful transmissions parf increase rate or decrease power.
    * As we are at maximal rate, the power should be decreased. recoveryPower=true.
    */
-  for(int i = 0; i<10; i++)
+  for (int i = 0; i < 10; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "PARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "PARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 16, "PARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -181,13 +181,13 @@
    * As we are using recovery power, one failure make power increase.
    *
    */
-  manager->ReportDataFailed(remoteAddress,&packetHeader);
+  manager->ReportDataFailed (remoteAddress,&packetHeader);
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "PARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "PARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -196,18 +196,18 @@
    * After 15 transmissions attempts parf increase rate or decrease power.
    * As we are at maximal rate, the power should be decreased. recoveryPower=true.
    */
-  for(int i = 0; i<7; i++)
+  for (int i = 0; i < 7; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
-      manager->ReportDataFailed(remoteAddress,&packetHeader);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataFailed (remoteAddress,&packetHeader);
     }
-  manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "PARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "PARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 16, "PARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -216,13 +216,13 @@
    * As we are using recovery power, one failure make power increase. recoveryPower=false.
    */
 
-  manager->ReportDataFailed(remoteAddress,&packetHeader);
+  manager->ReportDataFailed (remoteAddress,&packetHeader);
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "PARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "PARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -231,14 +231,14 @@
    * After two consecutive fails the rate is decreased or the power increased.
    * As we are at maximal power, the rate should be decreased.
    */
-  manager->ReportDataFailed(remoteAddress,&packetHeader);
-  manager->ReportDataFailed(remoteAddress,&packetHeader);
+  manager->ReportDataFailed (remoteAddress,&packetHeader);
+  manager->ReportDataFailed (remoteAddress,&packetHeader);
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 48000000, "PARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 48000000, "PARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -247,16 +247,16 @@
    * After 10 consecutive successful transmissions parf increase rate or decrease power.
    * As we are not at maximal rate, the rate is increased again. recoveryRate=true.
    */
-  for(int i = 0; i<10; i++)
+  for (int i = 0; i < 10; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "PARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "PARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -265,13 +265,13 @@
    * As we are using recovery rate, one failure make rate decrease. recoveryRate=false.
    */
 
-  manager->ReportDataFailed(remoteAddress,&packetHeader);
+  manager->ReportDataFailed (remoteAddress,&packetHeader);
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 48000000, "PARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 48000000, "PARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -280,16 +280,16 @@
    * After 10 consecutive successful transmissions parf increase rate or decrease power.
    * As we are not at maximal rate, the rate is increased again. recoveryRate=true.
    */
-  for(int i = 0; i<10; i++)
+  for (int i = 0; i < 10; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "PARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "PARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -298,16 +298,16 @@
    * After 10 consecutive successful transmissions parf increase rate or decrease power.
    * As we are at maximal rate, the power is decreased. recoveryRate=false, recoveryPower=true.
    */
-  for(int i = 0; i<10; i++)
+  for (int i = 0; i < 10; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "PARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "PARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 16, "PARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -316,18 +316,18 @@
    * One successful transmissions after a power decrease make recoverPower=false.
    * So we need two consecutive failures to increase power again.
    */
-  manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
 
-  for(int i = 0; i<2; i++)
+  for (int i = 0; i < 2; i++)
     {
-      manager->ReportDataFailed(remoteAddress,&packetHeader);
+      manager->ReportDataFailed (remoteAddress,&packetHeader);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "PARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "PARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
 
   Simulator::Stop (Seconds (10.0));
@@ -341,17 +341,17 @@
 PowerRateAdaptationTest::TestAparf ()
 {
   m_manager.SetTypeId ("ns3::AparfWifiManager");
-  Ptr<Node> node = ConfigureNode();
-  Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice> (node->GetDevice(0));
-  Ptr<WifiRemoteStationManager> manager = dev->GetRemoteStationManager();
+  Ptr<Node> node = ConfigureNode ();
+  Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice> (node->GetDevice (0));
+  Ptr<WifiRemoteStationManager> manager = dev->GetRemoteStationManager ();
 
   /*
    * Configure thresholds for rate and power control.
    */
-  manager->SetAttribute("SuccessThreshold 1",UintegerValue (3));
-  manager->SetAttribute("SuccessThreshold 2",UintegerValue(10));
-  manager->SetAttribute("FailThreshold",UintegerValue (1));
-  manager->SetAttribute("PowerThreshold",UintegerValue(10));
+  manager->SetAttribute ("SuccessThreshold 1",UintegerValue (3));
+  manager->SetAttribute ("SuccessThreshold 2",UintegerValue (10));
+  manager->SetAttribute ("FailThreshold",UintegerValue (1));
+  manager->SetAttribute ("PowerThreshold",UintegerValue (10));
 
   /*
    * Create a dummy packet to simulate transmission.
@@ -374,11 +374,11 @@
   /*
    * Aparf initiates with maximal rate and power.
    */
-  WifiTxVector txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  WifiMode mode = txVector.GetMode();
-  int power = (int) txVector.GetTxPowerLevel();
+  WifiTxVector txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  WifiMode mode = txVector.GetMode ();
+  int power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "APARF: Initial data rate wrong");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "APARF: Initial data rate wrong");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "APARF: Initial power level wrong");
 
   //-----------------------------------------------------------------------------------------------------
@@ -388,16 +388,16 @@
    * As we are at maximal rate, the power should be decreased.
    * Change to state Spread.
    */
-  for(int i = 0; i<3; i++)
+  for (int i = 0; i < 3; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "APARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "APARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 16, "APARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -406,13 +406,13 @@
    * One failure make the power to be increased again.
    * Change to state Low.
    */
-  manager->ReportDataFailed(remoteAddress,&packetHeader);
+  manager->ReportDataFailed (remoteAddress,&packetHeader);
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "APARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "APARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "APARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -422,16 +422,16 @@
    * As we are at maximal rate, the power should be decreased.
    * Change to state Spread.
    */
-  for(int i = 0; i<10; i++)
+  for (int i = 0; i < 10; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "APARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "APARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 16, "APARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -441,16 +441,16 @@
    * Two more successful transmissions make power decrease.
    */
 
-  for(int i = 0; i<3; i++)
+  for (int i = 0; i < 3; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "APARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "APARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 15, "APARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -459,16 +459,16 @@
    * As we are in state High we need 3 successful transmissions to increase rate or decrease power.
    * After 16*3 successful transmissions power is decreased to zero.
    */
-  for(int i = 0; i<16*3; i++)
+  for (int i = 0; i < 16 * 3; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "APARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "APARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 0, "APARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -477,13 +477,13 @@
    * After one fail the rate is decreased or the power increased.
    * As we are at minimal power, the power should be increased.
    */
-  manager->ReportDataFailed(remoteAddress,&packetHeader);
+  manager->ReportDataFailed (remoteAddress,&packetHeader);
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 1, "Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -492,16 +492,16 @@
    * After one fail the rate is decreased or the power increased.
    * After 16 failed transmissions power is increase to 17.
    */
-  for(int i = 0; i<16; i++)
+  for (int i = 0; i < 16; i++)
     {
-      manager->ReportDataFailed(remoteAddress,&packetHeader);
+      manager->ReportDataFailed (remoteAddress,&packetHeader);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "APARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "APARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "APARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -511,13 +511,13 @@
    * As we are at maximal power, the rate should be decreased.
    * Set critical rate to 54 Mbps.
    */
-  manager->ReportDataFailed(remoteAddress,&packetHeader);
+  manager->ReportDataFailed (remoteAddress,&packetHeader);
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 48000000, "Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 48000000, "Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -526,16 +526,16 @@
    * As we are in state High we need 3 successful transmissions to increase rate or decrease power.
    * As rate critical is set, after 3 successful transmissions power is decreased.
    */
-  for(int i = 0; i<3; i++)
+  for (int i = 0; i < 3; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 48000000, "APARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 48000000, "APARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 16, "APARF: Incorrect value of power level");
 
   //-----------------------------------------------------------------------------------------------------
@@ -546,28 +546,28 @@
    * So after 10*3 successful transmissions critical rate is set to 0.
    * And 3 successful transmissions more will make power increase to maximum and rate increase to the critical rate.
    */
-  for(int i = 0; i<9*3; i++)
+  for (int i = 0; i < 9 * 3; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 48000000, "APARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 48000000, "APARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 7, "APARF: Incorrect value of power level");
 
-  for(int i = 0; i<3; i++)
+  for (int i = 0; i < 3; i++)
     {
-      manager->ReportDataOk(remoteAddress, &packetHeader, 0, ackMode, 0);
+      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0);
     }
 
-  txVector = manager->GetDataTxVector(remoteAddress,&packetHeader,packet,packet->GetSize());
-  mode = txVector.GetMode();
-  power = (int) txVector.GetTxPowerLevel();
+  txVector = manager->GetDataTxVector (remoteAddress,&packetHeader,packet,packet->GetSize ());
+  mode = txVector.GetMode ();
+  power = (int) txVector.GetTxPowerLevel ();
 
-  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate(), 54000000, "APARF: Incorrect vale of data rate");
+  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1), 54000000, "APARF: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "APARF: Incorrect value of power level");
 
   Simulator::Stop (Seconds (10.0));
diff -Naur ns-3.23/src/wifi/test/tx-duration-test.cc ns-3.24/src/wifi/test/tx-duration-test.cc
--- ns-3.23/src/wifi/test/tx-duration-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/test/tx-duration-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -15,7 +15,8 @@
  * 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>
+ * Authors: Nicola Baldo <nbaldo@cttc.es>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
 #include <ns3/object.h>
@@ -39,6 +40,7 @@
   virtual ~TxDurationTest ();
   virtual void DoRun (void);
 
+
 private:
   /**
    * Check if the payload tx duration returned by InterferenceHelper
@@ -46,11 +48,13 @@
    *
    * @param size size of payload in octets (includes everything after the PLCP header)
    * @param payloadMode the WifiMode used
+   * @param channelWidth the channel width used (in MHz)
+   * @param isShortGuardInterval whether short guard interval is used
    * @param knownDurationMicroSeconds the known duration value of the transmission in microseconds
    *
    * @return true if values correspond, false otherwise
    */
-  bool CheckPayloadDuration (uint32_t size, WifiMode payloadMode, WifiPreamble preamble, uint32_t knownDurationMicroSeconds);
+  bool CheckPayloadDuration (uint32_t size, WifiMode payloadMode, uint32_t channelWidth, bool isShortGuardInterval, WifiPreamble preamble, uint32_t knownDurationMicroSeconds);
 
   /**
    * Check if the overall tx duration returned by InterferenceHelper
@@ -58,43 +62,50 @@
    *
    * @param size size of payload in octets (includes everything after the PLCP header)
    * @param payloadMode the WifiMode used
+   * @param channelWidth the channel width used (in MHz)
+   * @param isShortGuardInterval whether short guard interval is used
    * @param preamble the WifiPreamble used
    * @param knownDurationMicroSeconds the known duration value of the transmission in microseconds
    *
    * @return true if values correspond, false otherwise
    */
-  bool CheckTxDuration (uint32_t size, WifiMode payloadMode, WifiPreamble preamble, double knownDurationMicroSeconds);
+  bool CheckTxDuration (uint32_t size, WifiMode payloadMode, uint32_t channelWidth, bool isShortGuardInterval, WifiPreamble preamble, double knownDurationMicroSeconds);
 
 };
 
-
 TxDurationTest::TxDurationTest ()
   : TestCase ("Wifi TX Duration")
 {
 }
 
-
 TxDurationTest::~TxDurationTest ()
 {
 }
 
 bool
-TxDurationTest::CheckPayloadDuration (uint32_t size, WifiMode payloadMode, WifiPreamble preamble, uint32_t knownDurationMicroSeconds)
+TxDurationTest::CheckPayloadDuration (uint32_t size, WifiMode payloadMode, uint32_t channelWidth, bool isShortGuardInterval, WifiPreamble preamble, uint32_t knownDurationMicroSeconds)
 {
   WifiTxVector txVector;
   txVector.SetMode (payloadMode);
+  txVector.SetChannelWidth (channelWidth);
+  txVector.SetShortGuardInterval (isShortGuardInterval);
+  txVector.SetNss (1);
+  txVector.SetStbc (0);
+  txVector.SetNess (0);
   double testedFrequency = CHANNEL_1_MHZ;
   Ptr<YansWifiPhy> phy = CreateObject<YansWifiPhy> ();
-  if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_OFDM || 
-      payloadMode.GetModulationClass () == WIFI_MOD_CLASS_HT)
+  if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_OFDM
+      || payloadMode.GetModulationClass () == WIFI_MOD_CLASS_HT
+      || payloadMode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
     {
       testedFrequency = CHANNEL_36_MHZ;
     }
-  double calculatedDurationMicroSeconds = (double)phy->GetPayloadDuration (size, txVector, preamble, testedFrequency, 0, 0).GetMicroSeconds();;
+  double calculatedDurationMicroSeconds = (double)phy->GetPayloadDuration (size, txVector, preamble, testedFrequency, 0, 0).GetMicroSeconds  ();
   if (calculatedDurationMicroSeconds != knownDurationMicroSeconds)
     {
       std::cerr << " size=" << size
                 << " mode=" << payloadMode
+                << " datarate=" << payloadMode.GetDataRate (channelWidth, isShortGuardInterval, 1)
                 << " known=" << knownDurationMicroSeconds
                 << " calculated=" << calculatedDurationMicroSeconds
                 << std::endl;
@@ -102,13 +113,14 @@
     }
   if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_HT)
     {
-      // Durations vary depending on frequency; test also 2.4 GHz (bug 1971)
+      //Durations vary depending on frequency; test also 2.4 GHz (bug 1971)
       testedFrequency = CHANNEL_1_MHZ;
-      calculatedDurationMicroSeconds = (double)phy->GetPayloadDuration (size, txVector, preamble, testedFrequency, 0, 0).GetMicroSeconds();;
+      calculatedDurationMicroSeconds = (double)phy->GetPayloadDuration (size, txVector, preamble, testedFrequency, 0, 0).GetMicroSeconds ();
       if (calculatedDurationMicroSeconds != knownDurationMicroSeconds + 6)
         {
           std::cerr << " size=" << size
                     << " mode=" << payloadMode
+                    << " datarate=" << payloadMode.GetDataRate (channelWidth, isShortGuardInterval, 1)
                     << " known=" << knownDurationMicroSeconds
                     << " calculated=" << calculatedDurationMicroSeconds
                     << std::endl;
@@ -119,25 +131,29 @@
 }
 
 bool
-TxDurationTest::CheckTxDuration (uint32_t size, WifiMode payloadMode, WifiPreamble preamble, double knownDurationMicroSeconds)
+TxDurationTest::CheckTxDuration (uint32_t size, WifiMode payloadMode, uint32_t channelWidth, bool isShortGuardInterval, WifiPreamble preamble, double knownDurationMicroSeconds)
 {
   WifiTxVector txVector;
   txVector.SetMode (payloadMode);
-  txVector.SetNss(1);
-  txVector.SetStbc(0);
-  txVector.SetNess(0);
+  txVector.SetChannelWidth (channelWidth);
+  txVector.SetShortGuardInterval (isShortGuardInterval);
+  txVector.SetNss (1);
+  txVector.SetStbc (0);
+  txVector.SetNess (0);
   double testedFrequency = CHANNEL_1_MHZ;
   Ptr<YansWifiPhy> phy = CreateObject<YansWifiPhy> ();
-  if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_OFDM || 
-      payloadMode.GetModulationClass () == WIFI_MOD_CLASS_HT)
+  if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_OFDM
+      || payloadMode.GetModulationClass () == WIFI_MOD_CLASS_HT
+      || payloadMode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
     {
       testedFrequency = CHANNEL_36_MHZ;
     }
-  double calculatedDurationMicroSeconds = ((double)phy->CalculateTxDuration (size, txVector, preamble, testedFrequency, 0, 0).GetNanoSeconds ())/1000;
+  double calculatedDurationMicroSeconds = ((double)phy->CalculateTxDuration (size, txVector, preamble, testedFrequency, 0, 0).GetNanoSeconds ()) / 1000;
   if (calculatedDurationMicroSeconds != knownDurationMicroSeconds)
     {
       std::cerr << " size=" << size
                 << " mode=" << payloadMode
+                << " datarate=" << payloadMode.GetDataRate (channelWidth, isShortGuardInterval, 1)
                 << " preamble=" << preamble
                 << " known=" << knownDurationMicroSeconds
                 << " calculated=" << calculatedDurationMicroSeconds
@@ -146,13 +162,14 @@
     }
   if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_HT)
     {
-      // Durations vary depending on frequency; test also 2.4 GHz (bug 1971)
+      //Durations vary depending on frequency; test also 2.4 GHz (bug 1971)
       testedFrequency = CHANNEL_1_MHZ;
-      calculatedDurationMicroSeconds = ((double)phy->CalculateTxDuration (size, txVector, preamble, testedFrequency, 0, 0).GetNanoSeconds ())/1000;
+      calculatedDurationMicroSeconds = ((double)phy->CalculateTxDuration (size, txVector, preamble, testedFrequency, 0, 0).GetNanoSeconds ()) / 1000;
       if (calculatedDurationMicroSeconds != knownDurationMicroSeconds + 6)
         {
           std::cerr << " size=" << size
                     << " mode=" << payloadMode
+                    << " datarate=" << payloadMode.GetDataRate (channelWidth, isShortGuardInterval, 1)
                     << " preamble=" << preamble
                     << " known=" << knownDurationMicroSeconds
                     << " calculated=" << calculatedDurationMicroSeconds
@@ -167,117 +184,155 @@
 TxDurationTest::DoRun (void)
 {
   bool retval = true;
-  
 
-  // IEEE Std 802.11-2007 Table 18-2 "Example of LENGTH calculations for CCK"
+  //IEEE Std 802.11-2007 Table 18-2 "Example of LENGTH calculations for CCK"
   retval = retval
-    && CheckPayloadDuration (1023, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 744)
-    && CheckPayloadDuration (1024, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 745)
-    && CheckPayloadDuration (1025, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 746)
-    && CheckPayloadDuration (1026, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 747);
-
-    NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11b CCK duration failed");
-
-  // Similar, but we add PLCP preamble and header durations
-  // and we test different rates.
-  // The payload durations for modes other than 11mbb have been
-  // calculated by hand according to  IEEE Std 802.11-2007 18.2.3.5
+    && CheckPayloadDuration (1023, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_LONG, 744)
+    && CheckPayloadDuration (1024, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_LONG, 745)
+    && CheckPayloadDuration (1025, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_LONG, 746)
+    && CheckPayloadDuration (1026, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_LONG, 747);
+
+  NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11b CCK duration failed");
+
+  //Similar, but we add PLCP preamble and header durations
+  //and we test different rates.
+  //The payload durations for modes other than 11mbb have been
+  //calculated by hand according to  IEEE Std 802.11-2007 18.2.3.5
   retval = retval
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_SHORT, 744 + 96)
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_SHORT, 745 + 96)
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_SHORT, 746 + 96)
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_SHORT, 747 + 96)
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 744 + 192)
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 745 + 192)
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 746 + 192)
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 747 + 192)
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_SHORT, 1488 + 96)
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_SHORT, 1490 + 96)
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_SHORT, 1491 + 96)
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_SHORT, 1493 + 96)
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_LONG, 1488 + 192)
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_LONG, 1490 + 192)
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_LONG, 1491 + 192)
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_LONG, 1493 + 192)
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_SHORT, 4092 + 96)
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_SHORT, 4096 + 96)
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_SHORT, 4100 + 96)
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_SHORT, 4104 + 96)
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_LONG, 4092 + 192)
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_LONG, 4096 + 192)
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_LONG, 4100 + 192)
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_LONG, 4104 + 192)
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_SHORT, 8184 + 96)
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_SHORT, 8192 + 96)
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_SHORT, 8200 + 96)
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_SHORT, 8208 + 96)
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_LONG, 8184 + 192)
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_LONG, 8192 + 192)
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_LONG, 8200 + 192)
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_LONG, 8208 + 192);
+    && CheckTxDuration (1023, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 744 + 96)
+    && CheckTxDuration (1024, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 745 + 96)
+    && CheckTxDuration (1025, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 746 + 96)
+    && CheckTxDuration (1026, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 747 + 96)
+    && CheckTxDuration (1023, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_LONG, 744 + 192)
+    && CheckTxDuration (1024, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_LONG, 745 + 192)
+    && CheckTxDuration (1025, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_LONG, 746 + 192)
+    && CheckTxDuration (1026, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_LONG, 747 + 192)
+    && CheckTxDuration (1023, WifiPhy::GetDsssRate5_5Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 1488 + 96)
+    && CheckTxDuration (1024, WifiPhy::GetDsssRate5_5Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 1490 + 96)
+    && CheckTxDuration (1025, WifiPhy::GetDsssRate5_5Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 1491 + 96)
+    && CheckTxDuration (1026, WifiPhy::GetDsssRate5_5Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 1493 + 96)
+    && CheckTxDuration (1023, WifiPhy::GetDsssRate5_5Mbps (), 22, false, WIFI_PREAMBLE_LONG, 1488 + 192)
+    && CheckTxDuration (1024, WifiPhy::GetDsssRate5_5Mbps (), 22, false, WIFI_PREAMBLE_LONG, 1490 + 192)
+    && CheckTxDuration (1025, WifiPhy::GetDsssRate5_5Mbps (), 22, false, WIFI_PREAMBLE_LONG, 1491 + 192)
+    && CheckTxDuration (1026, WifiPhy::GetDsssRate5_5Mbps (), 22, false, WIFI_PREAMBLE_LONG, 1493 + 192)
+    && CheckTxDuration (1023, WifiPhy::GetDsssRate2Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 4092 + 96)
+    && CheckTxDuration (1024, WifiPhy::GetDsssRate2Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 4096 + 96)
+    && CheckTxDuration (1025, WifiPhy::GetDsssRate2Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 4100 + 96)
+    && CheckTxDuration (1026, WifiPhy::GetDsssRate2Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 4104 + 96)
+    && CheckTxDuration (1023, WifiPhy::GetDsssRate2Mbps (), 22, false, WIFI_PREAMBLE_LONG, 4092 + 192)
+    && CheckTxDuration (1024, WifiPhy::GetDsssRate2Mbps (), 22, false, WIFI_PREAMBLE_LONG, 4096 + 192)
+    && CheckTxDuration (1025, WifiPhy::GetDsssRate2Mbps (), 22, false, WIFI_PREAMBLE_LONG, 4100 + 192)
+    && CheckTxDuration (1026, WifiPhy::GetDsssRate2Mbps (), 22, false, WIFI_PREAMBLE_LONG, 4104 + 192)
+    && CheckTxDuration (1023, WifiPhy::GetDsssRate1Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 8184 + 96)
+    && CheckTxDuration (1024, WifiPhy::GetDsssRate1Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 8192 + 96)
+    && CheckTxDuration (1025, WifiPhy::GetDsssRate1Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 8200 + 96)
+    && CheckTxDuration (1026, WifiPhy::GetDsssRate1Mbps (), 22, false, WIFI_PREAMBLE_SHORT, 8208 + 96)
+    && CheckTxDuration (1023, WifiPhy::GetDsssRate1Mbps (), 22, false, WIFI_PREAMBLE_LONG, 8184 + 192)
+    && CheckTxDuration (1024, WifiPhy::GetDsssRate1Mbps (), 22, false, WIFI_PREAMBLE_LONG, 8192 + 192)
+    && CheckTxDuration (1025, WifiPhy::GetDsssRate1Mbps (), 22, false, WIFI_PREAMBLE_LONG, 8200 + 192)
+    && CheckTxDuration (1026, WifiPhy::GetDsssRate1Mbps (), 22, false, WIFI_PREAMBLE_LONG, 8208 + 192);
 
 
-  // values from http://mailman.isi.edu/pipermail/ns-developers/2009-July/006226.html
-  retval = retval && CheckTxDuration (14, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_LONG, 304);
+  //values from http://mailman.isi.edu/pipermail/ns-developers/2009-July/006226.html
+  retval = retval && CheckTxDuration (14, WifiPhy::GetDsssRate1Mbps (), 22, false, WIFI_PREAMBLE_LONG, 304);
+
+  //values from http://www.oreillynet.com/pub/a/wireless/2003/08/08/wireless_throughput.html
+  retval = retval
+    && CheckTxDuration (1536, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_LONG, 1310)
+    && CheckTxDuration (76, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_LONG, 248)
+    && CheckTxDuration (14, WifiPhy::GetDsssRate11Mbps (), 22, false, WIFI_PREAMBLE_LONG, 203);
 
-    NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11b duration failed");
+  NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11b duration failed");
 
-  // values from
-  // http://www.oreillynet.com/pub/a/wireless/2003/08/08/wireless_throughput.html
+  //802.11a durations
+  //values from http://www.oreillynet.com/pub/a/wireless/2003/08/08/wireless_throughput.html
   retval = retval
-    && CheckTxDuration (1536, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 1310)
-    && CheckTxDuration (76, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 248)
-    && CheckTxDuration (14, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 203)
-    && CheckTxDuration (1536, WifiPhy::GetOfdmRate54Mbps (), WIFI_PREAMBLE_LONG, 248)
-    && CheckTxDuration (76, WifiPhy::GetOfdmRate54Mbps (), WIFI_PREAMBLE_LONG, 32)
-    && CheckTxDuration (14, WifiPhy::GetOfdmRate54Mbps (), WIFI_PREAMBLE_LONG, 24);
+    && CheckTxDuration (1536, WifiPhy::GetOfdmRate54Mbps (), 20, false, WIFI_PREAMBLE_LONG, 248)
+    && CheckTxDuration (76, WifiPhy::GetOfdmRate54Mbps (), 20, false, WIFI_PREAMBLE_LONG, 32)
+    && CheckTxDuration (14, WifiPhy::GetOfdmRate54Mbps (), 20, false, WIFI_PREAMBLE_LONG, 24);
 
-    NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11a duration failed");
+  NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11a duration failed");
 
-  // 802.11g durations are same as 802.11a durations but with 6 us signal extension
+  //802.11g durations are same as 802.11a durations but with 6 us signal extension
   retval = retval
-    && CheckTxDuration (1536, WifiPhy::GetErpOfdmRate54Mbps (), WIFI_PREAMBLE_LONG, 254)
-    && CheckTxDuration (76, WifiPhy::GetErpOfdmRate54Mbps (), WIFI_PREAMBLE_LONG, 38)
-    && CheckTxDuration (14, WifiPhy::GetErpOfdmRate54Mbps (), WIFI_PREAMBLE_LONG, 30);
+    && CheckTxDuration (1536, WifiPhy::GetErpOfdmRate54Mbps (), 20, false, WIFI_PREAMBLE_LONG, 254)
+    && CheckTxDuration (76, WifiPhy::GetErpOfdmRate54Mbps (), 20, false, WIFI_PREAMBLE_LONG, 38)
+    && CheckTxDuration (14, WifiPhy::GetErpOfdmRate54Mbps (), 20, false, WIFI_PREAMBLE_LONG, 30);
 
-    NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11g duration failed");
+  NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11g duration failed");
 
   //802.11n durations
   retval = retval
-    && CheckTxDuration (1536,WifiPhy::GetOfdmRate65MbpsBW20MHz (), WIFI_PREAMBLE_HT_MF,228)
-    && CheckTxDuration (76, WifiPhy::GetOfdmRate65MbpsBW20MHz (), WIFI_PREAMBLE_HT_MF,48)
-    && CheckTxDuration (14, WifiPhy::GetOfdmRate65MbpsBW20MHz (), WIFI_PREAMBLE_HT_MF,40)
-    && CheckTxDuration (1536,WifiPhy::GetOfdmRate65MbpsBW20MHz (), WIFI_PREAMBLE_HT_GF,220)
-    && CheckTxDuration (76, WifiPhy::GetOfdmRate65MbpsBW20MHz (), WIFI_PREAMBLE_HT_GF,40)
-    && CheckTxDuration (14, WifiPhy::GetOfdmRate65MbpsBW20MHz (), WIFI_PREAMBLE_HT_GF,32)
-    && CheckTxDuration (1536,WifiPhy::GetOfdmRate7_2MbpsBW20MHz (), WIFI_PREAMBLE_HT_MF,1746)
-    && CheckTxDuration (76, WifiPhy::GetOfdmRate7_2MbpsBW20MHz (), WIFI_PREAMBLE_HT_MF,126)
-    && CheckTxDuration (14, WifiPhy::GetOfdmRate7_2MbpsBW20MHz (), WIFI_PREAMBLE_HT_MF,57.6)
-    && CheckTxDuration (1536,WifiPhy::GetOfdmRate7_2MbpsBW20MHz (), WIFI_PREAMBLE_HT_GF,1738)
-    && CheckTxDuration (76, WifiPhy::GetOfdmRate7_2MbpsBW20MHz (), WIFI_PREAMBLE_HT_GF,118)
-    && CheckTxDuration (14, WifiPhy::GetOfdmRate7_2MbpsBW20MHz (), WIFI_PREAMBLE_HT_GF,49.6)
-    && CheckTxDuration (1536, WifiPhy::GetOfdmRate65MbpsBW20MHzShGi (), WIFI_PREAMBLE_HT_MF,226.8)
-    && CheckTxDuration (76, WifiPhy::GetOfdmRate65MbpsBW20MHzShGi (), WIFI_PREAMBLE_HT_MF,46.8)
-    && CheckTxDuration (14, WifiPhy::GetOfdmRate65MbpsBW20MHzShGi (), WIFI_PREAMBLE_HT_MF,39.6)
-    && CheckTxDuration (1536, WifiPhy::GetOfdmRate65MbpsBW20MHzShGi (), WIFI_PREAMBLE_HT_GF,218.8)
-    && CheckTxDuration (76, WifiPhy::GetOfdmRate65MbpsBW20MHzShGi (), WIFI_PREAMBLE_HT_GF,38.8)
-    && CheckTxDuration (14, WifiPhy::GetOfdmRate65MbpsBW20MHzShGi (), WIFI_PREAMBLE_HT_GF,31.6)
-    && CheckTxDuration (1536,WifiPhy::GetOfdmRate135MbpsBW40MHz (), WIFI_PREAMBLE_HT_MF,128)
-    && CheckTxDuration (76,WifiPhy::GetOfdmRate135MbpsBW40MHz (), WIFI_PREAMBLE_HT_MF,44)
-    && CheckTxDuration (14,WifiPhy::GetOfdmRate135MbpsBW40MHz (), WIFI_PREAMBLE_HT_MF,40)
-    && CheckTxDuration (1536,WifiPhy::GetOfdmRate135MbpsBW40MHz (), WIFI_PREAMBLE_HT_GF,120)
-    && CheckTxDuration (76,WifiPhy::GetOfdmRate135MbpsBW40MHz (), WIFI_PREAMBLE_HT_GF,36)
-    && CheckTxDuration (14,WifiPhy::GetOfdmRate135MbpsBW40MHz (), WIFI_PREAMBLE_HT_GF,32)
-    && CheckTxDuration (1536,WifiPhy::GetOfdmRate150MbpsBW40MHz (), WIFI_PREAMBLE_HT_MF,118.8)
-    && CheckTxDuration (76,WifiPhy::GetOfdmRate150MbpsBW40MHz (), WIFI_PREAMBLE_HT_MF,43.2)
-    && CheckTxDuration (14,WifiPhy::GetOfdmRate150MbpsBW40MHz (), WIFI_PREAMBLE_HT_MF,39.6)
-    && CheckTxDuration (1536,WifiPhy::GetOfdmRate150MbpsBW40MHz (), WIFI_PREAMBLE_HT_GF,110.8)
-    && CheckTxDuration (76,WifiPhy::GetOfdmRate150MbpsBW40MHz (), WIFI_PREAMBLE_HT_GF,35.2)
-    && CheckTxDuration (14,WifiPhy::GetOfdmRate150MbpsBW40MHz (), WIFI_PREAMBLE_HT_GF,31.6);
+    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 20, false, WIFI_PREAMBLE_HT_MF, 228)
+    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 20, false, WIFI_PREAMBLE_HT_MF, 48)
+    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 20, false, WIFI_PREAMBLE_HT_MF, 40)
+    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 20, false, WIFI_PREAMBLE_HT_GF, 220)
+    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 20, false, WIFI_PREAMBLE_HT_GF, 40)
+    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 20, false, WIFI_PREAMBLE_HT_GF, 32)
+    && CheckTxDuration (1536, WifiPhy::GetHtMcs0 (), 20, true, WIFI_PREAMBLE_HT_MF, 1742.4)
+    && CheckTxDuration (76, WifiPhy::GetHtMcs0 (), 20, true, WIFI_PREAMBLE_HT_MF, 126)
+    && CheckTxDuration (14, WifiPhy::GetHtMcs0 (), 20, true, WIFI_PREAMBLE_HT_MF, 57.6)
+    && CheckTxDuration (1536,WifiPhy::GetHtMcs0 (), 20, true, WIFI_PREAMBLE_HT_GF, 1734.4)
+    && CheckTxDuration (76, WifiPhy::GetHtMcs0 (), 20, true, WIFI_PREAMBLE_HT_GF, 118)
+    && CheckTxDuration (14, WifiPhy::GetHtMcs0 (), 20, true, WIFI_PREAMBLE_HT_GF, 49.6)
+    && CheckTxDuration (1536, WifiPhy::GetHtMcs6 (), 20, true, WIFI_PREAMBLE_HT_MF, 226.8)
+    && CheckTxDuration (76, WifiPhy::GetHtMcs6 (), 20, true, WIFI_PREAMBLE_HT_MF, 46.8)
+    && CheckTxDuration (14, WifiPhy::GetHtMcs6 (), 20, true, WIFI_PREAMBLE_HT_MF, 39.6)
+    && CheckTxDuration (1536, WifiPhy::GetHtMcs6 (), 20, true, WIFI_PREAMBLE_HT_GF, 218.8)
+    && CheckTxDuration (76, WifiPhy::GetHtMcs6 (), 20, true, WIFI_PREAMBLE_HT_GF, 38.8)
+    && CheckTxDuration (14, WifiPhy::GetHtMcs6 (), 20, true, WIFI_PREAMBLE_HT_GF, 31.6)
+    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 40, false, WIFI_PREAMBLE_HT_MF, 128)
+    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 40, false, WIFI_PREAMBLE_HT_MF, 44)
+    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 40, false, WIFI_PREAMBLE_HT_MF, 40)
+    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 40, false, WIFI_PREAMBLE_HT_GF, 120)
+    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 40, false, WIFI_PREAMBLE_HT_GF, 36)
+    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 40, false, WIFI_PREAMBLE_HT_GF, 32)
+    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 40, true, WIFI_PREAMBLE_HT_MF, 118.8)
+    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 40, true, WIFI_PREAMBLE_HT_MF, 43.2)
+    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 40, true, WIFI_PREAMBLE_HT_MF, 39.6)
+    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 40, true, WIFI_PREAMBLE_HT_GF, 110.8)
+    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 40, true, WIFI_PREAMBLE_HT_GF, 35.2)
+    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 40, true, WIFI_PREAMBLE_HT_GF, 31.6);
 
-    NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11n duration failed");
+  NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11n duration failed");
+
+  //802.11ac durations
+  retval = retval
+    && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 20, false, WIFI_PREAMBLE_VHT, 200)
+    && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 20, false, WIFI_PREAMBLE_VHT, 52)
+    && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 20, false, WIFI_PREAMBLE_VHT, 44)
+    && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 20, true, WIFI_PREAMBLE_VHT, 184)
+    && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 20, true, WIFI_PREAMBLE_VHT, 50.8)
+    && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 20, true, WIFI_PREAMBLE_VHT, 43.6)
+    && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 40, false, WIFI_PREAMBLE_VHT, 112)
+    && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 40, false, WIFI_PREAMBLE_VHT, 44)
+    && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 40, false, WIFI_PREAMBLE_VHT, 44)
+    && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 40, true, WIFI_PREAMBLE_VHT, 104.8)
+    && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 40, true, WIFI_PREAMBLE_VHT, 43.6)
+    && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 40, true, WIFI_PREAMBLE_VHT, 43.6)
+    && CheckTxDuration (1536, WifiPhy::GetVhtMcs0 (), 80, false, WIFI_PREAMBLE_VHT, 464)
+    && CheckTxDuration (76, WifiPhy::GetVhtMcs0 (), 80, false, WIFI_PREAMBLE_VHT, 64)
+    && CheckTxDuration (14, WifiPhy::GetVhtMcs0 (), 80, false, WIFI_PREAMBLE_VHT, 48)
+    && CheckTxDuration (1536, WifiPhy::GetVhtMcs0 (), 80, true, WIFI_PREAMBLE_VHT, 421.6)
+    && CheckTxDuration (76, WifiPhy::GetVhtMcs0 (), 80, true, WIFI_PREAMBLE_VHT, 61.6)
+    && CheckTxDuration (14, WifiPhy::GetVhtMcs0 (), 80, true, WIFI_PREAMBLE_VHT, 47.2)
+    && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 80, false, WIFI_PREAMBLE_VHT, 72)
+    && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 80, false, WIFI_PREAMBLE_VHT, 44)
+    && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 80, false, WIFI_PREAMBLE_VHT, 44)
+    && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 80, true, WIFI_PREAMBLE_VHT, 68.8)
+    && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 80, true, WIFI_PREAMBLE_VHT, 43.6)
+    && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 80, true, WIFI_PREAMBLE_VHT, 43.6)
+    && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 160, false, WIFI_PREAMBLE_VHT, 60)
+    && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 160, false, WIFI_PREAMBLE_VHT, 44)
+    && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 160, false, WIFI_PREAMBLE_VHT, 44)
+    && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 160, true, WIFI_PREAMBLE_VHT, 58)
+    && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 160, true, WIFI_PREAMBLE_VHT, 43.6)
+    && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 160, true, WIFI_PREAMBLE_VHT, 43.6);
+
+  NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11ac duration failed");
 }
 
+
 class TxDurationTestSuite : public TestSuite
 {
 public:
diff -Naur ns-3.23/src/wifi/test/wifi-aggregation-test.cc ns-3.24/src/wifi/test/wifi-aggregation-test.cc
--- ns-3.23/src/wifi/test/wifi-aggregation-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/test/wifi-aggregation-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -64,15 +64,15 @@
    */
   m_factory = ObjectFactory ();
   m_factory.SetTypeId ("ns3::ConstantRateWifiManager");
-  m_factory.Set ("DataMode", StringValue ("OfdmRate65MbpsBW20MHz"));
+  m_factory.Set ("DataMode", StringValue ("HtMcs7"));
   m_manager = m_factory.Create<WifiRemoteStationManager> ();
-  m_manager->SetupPhy(m_phy);
+  m_manager->SetupPhy (m_phy);
 
   /*
    * Create and configure maclayer.
    */
   m_low = CreateObject<MacLow> ();
-  m_low->SetPhy(m_phy);
+  m_low->SetPhy (m_phy);
   m_low->SetWifiRemoteStationManager (m_manager);
 
   m_edca = CreateObject<EdcaTxopN> ();
@@ -86,16 +86,16 @@
    */
   m_factory = ObjectFactory ();
   m_factory.SetTypeId ("ns3::MsduStandardAggregator");
-  m_factory.Set ("MaxAmsduSize", UintegerValue(4095));
+  m_factory.Set ("MaxAmsduSize", UintegerValue (4095));
   m_msduAggregator = m_factory.Create<MsduAggregator> ();
   m_edca->SetMsduAggregator (m_msduAggregator);
-  
+
   m_factory = ObjectFactory ();
   m_factory.SetTypeId ("ns3::MpduStandardAggregator");
-  m_factory.Set ("MaxAmpduSize", UintegerValue(65535));
+  m_factory.Set ("MaxAmpduSize", UintegerValue (65535));
   m_mpduAggregator = m_factory.Create<MpduAggregator> ();
   m_low->SetMpduAggregator (m_mpduAggregator);
-  
+
   /*
    * Create dummy packets of 1500 bytes and fill mac header fields that will be used for the tests.
    */
@@ -109,33 +109,33 @@
   Time tstamp;
 
   //-----------------------------------------------------------------------------------------------------
-  
+
   /*
    * Test MSDU aggregation of two packets using MacLow::PerformMsduAggregation.
-   * It checks whether aggregation succeeded: 
+   * It checks whether aggregation succeeded:
    *      - returned packet should be different from 0;
    *      - A-MSDU frame size should be 3030 bytes (= 2 packets + headers + padding);
    *      - one packet should be removed from the queue (the other packet is removed later in MacLow::AggregateToAmpdu) .
    */
-  m_edca->GetEdcaQueue()->Enqueue(pkt, hdr);
-  m_edca->GetEdcaQueue()->Enqueue(pkt, hdr);
-    
-  Ptr<const Packet> peekedPacket = m_edca->GetEdcaQueue()->PeekByTidAndAddress (&peekedHdr, 0,
-                                                                                WifiMacHeader::ADDR1,
-                                                                                hdr.GetAddr1 (),
-                                                                                &tstamp);
+  m_edca->GetEdcaQueue ()->Enqueue (pkt, hdr);
+  m_edca->GetEdcaQueue ()->Enqueue (pkt, hdr);
+
+  Ptr<const Packet> peekedPacket = m_edca->GetEdcaQueue ()->PeekByTidAndAddress (&peekedHdr, 0,
+                                                                                 WifiMacHeader::ADDR1,
+                                                                                 hdr.GetAddr1 (),
+                                                                                 &tstamp);
   m_low->m_currentPacket = peekedPacket->Copy ();
   m_low->m_currentHdr = peekedHdr;
-  
-  Ptr<Packet> packet = m_low->PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, 0);
-    
+
+  Ptr<Packet> packet = m_low->PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, 0);
+
   bool result = (packet != 0);
   NS_TEST_EXPECT_MSG_EQ (result, true, "aggregation failed");
-  NS_TEST_EXPECT_MSG_EQ (packet->GetSize(), 3030, "wrong packet size");
-  NS_TEST_EXPECT_MSG_EQ (m_edca->GetEdcaQueue()->GetSize(), 1, "removing packet from EDCA queue failed");
+  NS_TEST_EXPECT_MSG_EQ (packet->GetSize (), 3030, "wrong packet size");
+  NS_TEST_EXPECT_MSG_EQ (m_edca->GetEdcaQueue ()->GetSize (), 0, "aggregated packets not removed from the queue");
 
   //-----------------------------------------------------------------------------------------------------
-    
+
   /*
    * Aggregation is refused when the maximum size is reached.
    * It checks whether MSDU aggregation has been rejected because the maximum MPDU size is set to 0 (returned packet should be equal to 0).
@@ -143,18 +143,18 @@
    */
   m_factory = ObjectFactory ();
   m_factory.SetTypeId ("ns3::MpduStandardAggregator");
-  m_factory.Set ("MaxAmpduSize", UintegerValue(0));
+  m_factory.Set ("MaxAmpduSize", UintegerValue (0));
   m_mpduAggregator = m_factory.Create<MpduAggregator> ();
   m_low->SetMpduAggregator (m_mpduAggregator);
-  
-  m_edca->GetEdcaQueue()->Enqueue(pkt, hdr);
-  packet = m_low->PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, 0);
-  
+
+  m_edca->GetEdcaQueue ()->Enqueue (pkt, hdr);
+  packet = m_low->PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, 0);
+
   result = (packet != 0);
   NS_TEST_EXPECT_MSG_EQ (result, false, "maximum aggregated frame size check failed");
 
   //-----------------------------------------------------------------------------------------------------
-  
+
   /*
    * Aggregation does not occur zhen there is no more packets in the queue.
    * It checks whether MSDU aggregation has been rejected because there is no packets ready in the queue (returned packet should be equal to 0).
@@ -162,19 +162,20 @@
    */
   m_factory = ObjectFactory ();
   m_factory.SetTypeId ("ns3::MpduStandardAggregator");
-  m_factory.Set ("MaxAmpduSize", UintegerValue(4095));
+  m_factory.Set ("MaxAmpduSize", UintegerValue (4095));
   m_mpduAggregator = m_factory.Create<MpduAggregator> ();
   m_low->SetMpduAggregator (m_mpduAggregator);
-    
-  m_edca->GetEdcaQueue()->Remove(pkt);
-  m_edca->GetEdcaQueue()->Remove(pkt);
-  packet = m_low->PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, 0);
-  
+
+  m_edca->GetEdcaQueue ()->Remove (pkt);
+  m_edca->GetEdcaQueue ()->Remove (pkt);
+  packet = m_low->PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, 0);
+
   result = (packet != 0);
   NS_TEST_EXPECT_MSG_EQ (result, false, "aggregation failed to stop as queue is empty");
   Simulator::Destroy ();
 }
 
+
 //-----------------------------------------------------------------------------
 class WifiAggregationTestSuite : public TestSuite
 {
diff -Naur ns-3.23/src/wifi/test/wifi-test.cc ns-3.24/src/wifi/test/wifi-test.cc
--- ns-3.23/src/wifi/test/wifi-test.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/test/wifi-test.cc	2015-09-15 11:18:44.000000000 -0700
@@ -16,36 +16,35 @@
  * 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>
- *         Quincy Tse <quincy.tse@nicta.com.au> (Case for Bug 991)
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Quincy Tse <quincy.tse@nicta.com.au> (Case for Bug 991)
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (Case for bug 730)
  */
 
+#include "ns3/nqos-wifi-mac-helper.h"
+#include "ns3/yans-wifi-helper.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/packet-sink-helper.h"
+#include "ns3/on-off-helper.h"
+#include "ns3/mobility-helper.h"
 #include "ns3/wifi-net-device.h"
-#include "ns3/yans-wifi-channel.h"
 #include "ns3/adhoc-wifi-mac.h"
-#include "ns3/yans-wifi-phy.h"
-#include "ns3/arf-wifi-manager.h"
 #include "ns3/propagation-delay-model.h"
 #include "ns3/propagation-loss-model.h"
-#include "ns3/error-rate-model.h"
 #include "ns3/yans-error-rate-model.h"
 #include "ns3/constant-position-mobility-model.h"
-#include "ns3/node.h"
-#include "ns3/simulator.h"
 #include "ns3/test.h"
-#include "ns3/object-factory.h"
-#include "ns3/dca-txop.h"
-#include "ns3/mac-rx-middle.h"
 #include "ns3/pointer.h"
 #include "ns3/rng-seed-manager.h"
-#include "ns3/edca-txop-n.h"
 #include "ns3/config.h"
 #include "ns3/boolean.h"
+#include "ns3/string.h"
 
 using namespace ns3;
 
-// helper function to assign streams to random variables, to control 
-// randomness in the tests
+//Helper function to assign streams to random variables, to control
+//randomness in the tests
 static void
 AssignWifiRandomStreams (Ptr<WifiMac> mac, int64_t stream)
 {
@@ -76,12 +75,15 @@
     }
 }
 
+
 class WifiTest : public TestCase
 {
 public:
   WifiTest ();
 
   virtual void DoRun (void);
+
+
 private:
   void RunOne (void);
   void CreateOne (Vector pos, Ptr<YansWifiChannel> channel);
@@ -118,7 +120,6 @@
   phy->SetErrorRateModel (error);
   phy->SetChannel (channel);
   phy->SetDevice (dev);
-  phy->SetMobility (node);
   phy->ConfigureStandard (WIFI_PHY_STANDARD_80211a);
   Ptr<WifiRemoteStationManager> manager = m_manager.Create<WifiRemoteStationManager> ();
 
@@ -193,25 +194,26 @@
   }
   virtual void DoRun (void)
   {
-    // startingSeq=0, seqNum=2047
+    //startingSeq=0, seqNum=2047
     NS_TEST_EXPECT_MSG_EQ (QosUtilsIsOldPacket (0, 2047), false, "2047 is new in comparison to 0");
-    // startingSeq=0, seqNum=2048
+    //startingSeq=0, seqNum=2048
     NS_TEST_EXPECT_MSG_EQ (QosUtilsIsOldPacket (0, 2048), true, "2048 is old in comparison to 0");
-    // startingSeq=2048, seqNum=0
+    //startingSeq=2048, seqNum=0
     NS_TEST_EXPECT_MSG_EQ (QosUtilsIsOldPacket (2048, 0), true, "0 is old in comparison to 2048");
-    // startingSeq=4095, seqNum=0
+    //startingSeq=4095, seqNum=0
     NS_TEST_EXPECT_MSG_EQ (QosUtilsIsOldPacket (4095, 0), false, "0 is new in comparison to 4095");
-    // startingSeq=0, seqNum=4095
+    //startingSeq=0, seqNum=4095
     NS_TEST_EXPECT_MSG_EQ (QosUtilsIsOldPacket (0, 4095), true, "4095 is old in comparison to 0");
-    // startingSeq=4095 seqNum=2047
+    //startingSeq=4095 seqNum=2047
     NS_TEST_EXPECT_MSG_EQ (QosUtilsIsOldPacket (4095, 2047), true, "2047 is old in comparison to 4095");
-    // startingSeq=2048 seqNum=4095
+    //startingSeq=2048 seqNum=4095
     NS_TEST_EXPECT_MSG_EQ (QosUtilsIsOldPacket (2048, 4095), false, "4095 is new in comparison to 2048");
-    // startingSeq=2049 seqNum=0
+    //startingSeq=2049 seqNum=0
     NS_TEST_EXPECT_MSG_EQ (QosUtilsIsOldPacket (2049, 0), false, "0 is new in comparison to 2049");
   }
 };
 
+
 //-----------------------------------------------------------------------------
 /**
  * See \bugid{991}
@@ -222,6 +224,8 @@
   InterferenceHelperSequenceTest ();
 
   virtual void DoRun (void);
+
+
 private:
   Ptr<Node> CreateOne (Vector pos, Ptr<YansWifiChannel> channel);
   void SendOnePacket (Ptr<WifiNetDevice> dev);
@@ -265,7 +269,7 @@
   phy->SetErrorRateModel (error);
   phy->SetChannel (channel);
   phy->SetDevice (dev);
-  phy->SetMobility (node);
+  phy->SetMobility (mobility);
   phy->ConfigureStandard (WIFI_PHY_STANDARD_80211a);
   Ptr<WifiRemoteStationManager> manager = m_manager.Create<WifiRemoteStationManager> ();
 
@@ -322,21 +326,22 @@
   Simulator::Destroy ();
 }
 
+
 //-----------------------------------------------------------------------------
 /**
  * Make sure that when multiple broadcast packets are queued on the same
- * device in a short succession no virtual collision occurs 
+ * device in a short succession no virtual collision occurs
  *
  * The observed behavior is that the first frame will be sent immediately,
  * and the frames are spaced by (backoff + SIFS + AIFS) time intervals
  * (where backoff is a random number of slot sizes up to maximum CW)
- * 
+ *
  * The following test case should _not_ generate virtual collision for the second frame.
  * The seed and run numbers were pick such that the second frame gets backoff = 0.
  *
  *                      frame 1, frame 2
  *                      arrive                SIFS + AIFS
- *                      V                    <-----------> 
+ *                      V                    <----------->
  * time  |--------------|-------------------|-------------|----------->
  *       0              1s                  1.001408s     1.001442s
  *                      ^                   ^             ^
@@ -357,17 +362,16 @@
 class Bug555TestCase : public TestCase
 {
 public:
-
   Bug555TestCase ();
 
   virtual void DoRun (void);
 
-private:
 
+private:
   void SendOnePacket (Ptr<WifiNetDevice> dev);
 
   ObjectFactory m_manager;
-  ObjectFactory m_mac; 
+  ObjectFactory m_mac;
   ObjectFactory m_propDelay;
 
   Time m_firstTransmissionTime;
@@ -382,12 +386,12 @@
 {
 }
 
-void 
+void
 Bug555TestCase::NotifyPhyTxBegin (Ptr<const Packet> p)
 {
   if (m_numSentPackets == 0)
     {
-      NS_ASSERT_MSG (Simulator::Now() == Time (Seconds (1)), "Packet 0 not transmitted at 1 second");
+      NS_ASSERT_MSG (Simulator::Now () == Time (Seconds (1)), "Packet 0 not transmitted at 1 second");
       m_numSentPackets++;
       m_firstTransmissionTime = Simulator::Now ();
     }
@@ -411,13 +415,13 @@
   m_propDelay.SetTypeId ("ns3::ConstantSpeedPropagationDelayModel");
   m_manager.SetTypeId ("ns3::ConstantRateWifiManager");
 
-  // Assign a seed and run number, and later fix the assignment of streams to
-  // WiFi random variables, so that the first backoff used is zero slots
+  //Assign a seed and run number, and later fix the assignment of streams to
+  //WiFi random variables, so that the first backoff used is zero slots
   RngSeedManager::SetSeed (1);
   RngSeedManager::SetRun (17);
 
-  // Disable the initial jitter of AP beacons (test case was written before
-  // beacon jitter was added)
+  //Disable the initial jitter of AP beacons (test case was written before
+  //beacon jitter was added)
   Config::SetDefault ("ns3::ApWifiMac::EnableBeaconJitter", BooleanValue (false));
 
   Ptr<YansWifiChannel> channel = CreateObject<YansWifiChannel> ();
@@ -430,10 +434,10 @@
   Ptr<WifiNetDevice> txDev = CreateObject<WifiNetDevice> ();
   Ptr<WifiMac> txMac = m_mac.Create<WifiMac> ();
   txMac->ConfigureStandard (WIFI_PHY_STANDARD_80211a);
-  // Fix the stream assignment to the Dcf Txop objects (backoffs)
-  // The below stream assignment will result in the DcaTxop object
-  // using a backoff value of zero for this test when the 
-  // DcaTxop::EndTxNoAck() calls to StartBackoffNow()
+  //Fix the stream assignment to the Dcf Txop objects (backoffs)
+  //The below stream assignment will result in the DcaTxop object
+  //using a backoff value of zero for this test when the
+  //DcaTxop::EndTxNoAck() calls to StartBackoffNow()
   AssignWifiRandomStreams (txMac, 23);
 
   Ptr<ConstantPositionMobilityModel> txMobility = CreateObject<ConstantPositionMobilityModel> ();
@@ -442,7 +446,7 @@
   txPhy->SetErrorRateModel (txError);
   txPhy->SetChannel (channel);
   txPhy->SetDevice (txDev);
-  txPhy->SetMobility (txNode);
+  txPhy->SetMobility (txMobility);
   txPhy->ConfigureStandard (WIFI_PHY_STANDARD_80211a);
 
   txPhy->TraceConnectWithoutContext ("PhyTxBegin", MakeCallback (&Bug555TestCase::NotifyPhyTxBegin, this));
@@ -458,7 +462,7 @@
   m_firstTransmissionTime = Seconds (0.0);
   m_secondTransmissionTime = Seconds (0.0);
   m_numSentPackets = 0;
-  
+
   Simulator::Schedule (Seconds (1.0), &Bug555TestCase::SendOnePacket, this, txDev);
   Simulator::Schedule (Seconds (1.0), &Bug555TestCase::SendOnePacket, this, txDev);
 
@@ -466,16 +470,158 @@
   Simulator::Run ();
   Simulator::Destroy ();
 
-  // First packet has 1408 us of transmit time.   Slot time is 9 us.  
-  // Backoff is 0 slots.  SIFS is 16 us.  AIFS is 2 slots = 18 us.
-  // Should send next packet at 1408 us + (0 * 9 us) + 16 us + 18 us
-  // 1442 us after the first one.
+  //First packet has 1408 us of transmit time.   Slot time is 9 us.
+  //Backoff is 0 slots.  SIFS is 16 us.  AIFS is 2 slots = 18 us.
+  //Should send next packet at 1408 us + (0 * 9 us) + 16 us + 18 us
+  //1442 us after the first one.
   uint32_t expectedWait1 = 1408 + (0 * 9) + 16 + 18;
   Time expectedSecondTransmissionTime = MicroSeconds (expectedWait1) + Seconds (1.0);
 
   NS_TEST_ASSERT_MSG_EQ (m_secondTransmissionTime, expectedSecondTransmissionTime, "The second transmission time not correct!");
 }
 
+
+//-----------------------------------------------------------------------------
+/**
+ * Make sure that when changing the fragmentation threshold during the simulation,
+ * the TCP transmission does not unexpectedly stop.
+ *
+ * The scenario considers a TCP transmission between a 802.11b station and a 802.11b
+ * access point. After the simulation has begun, the fragmentation threshold is set at
+ * a value lower than the packet size. It then checks whether the TCP transmission
+ * continues after the fragmentation threshold modification.
+ *
+ * See \bugid{730}
+ */
+
+class Bug730TestCase : public TestCase
+{
+public:
+  Bug730TestCase ();
+  virtual ~Bug730TestCase ();
+
+  virtual void DoRun (void);
+
+
+private:
+  void Receive (std::string context, Ptr<const Packet> p, const Address &adr);
+
+  uint32_t m_received;
+};
+
+Bug730TestCase::Bug730TestCase ()
+  : TestCase ("Test case for Bug 730"),
+    m_received (0)
+{
+}
+
+Bug730TestCase::~Bug730TestCase ()
+{
+}
+
+void
+Bug730TestCase::Receive (std::string context, Ptr<const Packet> p, const Address &adr)
+{
+  if ((p->GetSize () == 1460) && (Simulator::Now () > Seconds (20)))
+    {
+      m_received++;
+    }
+}
+
+void
+Bug730TestCase::DoRun (void)
+{
+  m_received = 0;
+
+  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2304"));
+  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (2));
+  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1460));
+
+  NodeContainer wifiStaNode;
+  wifiStaNode.Create (1);
+
+  NodeContainer wifiApNode;
+  wifiApNode.Create (1);
+
+  YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
+  YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
+  phy.SetChannel (channel.Create ());
+
+  WifiHelper wifi = WifiHelper::Default ();
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                "DataMode", StringValue ("DsssRate1Mbps"),
+                                "ControlMode", StringValue ("DsssRate1Mbps"));
+
+  NqosWifiMacHelper mac = NqosWifiMacHelper::Default ();
+  Ssid ssid = Ssid ("ns-3-ssid");
+  mac.SetType ("ns3::StaWifiMac",
+               "Ssid", SsidValue (ssid),
+               "ActiveProbing", BooleanValue (false));
+
+  NetDeviceContainer staDevices;
+  staDevices = wifi.Install (phy, mac, wifiStaNode);
+
+  mac.SetType ("ns3::ApWifiMac",
+               "Ssid", SsidValue (ssid),
+               "BeaconGeneration", BooleanValue (true));
+
+  NetDeviceContainer apDevices;
+  apDevices = wifi.Install (phy, mac, wifiApNode);
+
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+
+  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
+  positionAlloc->Add (Vector (1.0, 0.0, 0.0));
+  mobility.SetPositionAllocator (positionAlloc);
+
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (wifiApNode);
+  mobility.Install (wifiStaNode);
+
+  InternetStackHelper stack;
+  stack.Install (wifiApNode);
+  stack.Install (wifiStaNode);
+
+  Ipv4AddressHelper address;
+  address.SetBase ("10.1.1.0", "255.255.255.0");
+  Ipv4InterfaceContainer StaInterface;
+  StaInterface = address.Assign (staDevices);
+  Ipv4InterfaceContainer ApInterface;
+  ApInterface = address.Assign (apDevices);
+
+  Address sinkLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), 21));
+  PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", sinkLocalAddress);
+  ApplicationContainer sinkApp = sinkHelper.Install (wifiApNode.Get (0));
+  sinkApp.Start (Seconds (1.0));
+  sinkApp.Stop (Seconds (51.0));
+
+  OnOffHelper sourceHelper ("ns3::TcpSocketFactory", Address ());
+  sourceHelper.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
+  sourceHelper.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
+  AddressValue remoteAddress (InetSocketAddress (ApInterface.GetAddress (0), 21));
+  sourceHelper.SetAttribute ("Remote", remoteAddress);
+  sourceHelper.SetAttribute ("PacketSize", UintegerValue (1460));
+  sourceHelper.SetAttribute ("DataRate", StringValue ("10Mb/s"));
+  ApplicationContainer sourceApp;
+  sourceApp.Add (sourceHelper.Install (wifiStaNode.Get (0)));
+  sourceApp.Start (Seconds (1.0));
+  sourceApp.Stop (Seconds (51.0));
+
+  Config::Connect ("/NodeList/*/ApplicationList/0/$ns3::PacketSink/Rx", MakeCallback (&Bug730TestCase::Receive, this));
+
+  Simulator::Schedule (Seconds (10.0), Config::Set, "/NodeList/0/DeviceList/0/RemoteStationManager/FragmentationThreshold", StringValue ("800"));
+
+  Simulator::Stop (Seconds (55));
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+  bool result = (m_received > 0);
+  NS_TEST_ASSERT_MSG_EQ (result, true, "packet reception unexpectedly stopped after adapting fragmentation threshold!");
+}
+
+
 //-----------------------------------------------------------------------------
 class WifiTestSuite : public TestSuite
 {
@@ -488,8 +634,9 @@
 {
   AddTestCase (new WifiTest, TestCase::QUICK);
   AddTestCase (new QosUtilsIsOldPacketTest, TestCase::QUICK);
-  AddTestCase (new InterferenceHelperSequenceTest, TestCase::QUICK); // Bug 991
-  AddTestCase (new Bug555TestCase, TestCase::QUICK); // Bug 555
+  AddTestCase (new InterferenceHelperSequenceTest, TestCase::QUICK); //Bug 991
+  AddTestCase (new Bug555TestCase, TestCase::QUICK); //Bug 555
+  AddTestCase (new Bug730TestCase, TestCase::QUICK); //Bug 730
 }
 
 static WifiTestSuite g_wifiTestSuite;
diff -Naur ns-3.23/src/wifi/wscript ns-3.24/src/wifi/wscript
--- ns-3.23/src/wifi/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wifi/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -1,7 +1,7 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 def build(bld):
-    obj = bld.create_ns3_module('wifi', ['network', 'propagation'])
+    obj = bld.create_ns3_module('wifi', ['network', 'internet', 'applications', 'propagation', 'energy'])
     obj.source = [
         'model/wifi-information-element.cc',
         'model/wifi-information-element-vector.cc',
@@ -69,6 +69,11 @@
         'model/mpdu-aggregator.cc',
         'model/mpdu-standard-aggregator.cc',
         'model/ampdu-tag.cc',
+        'model/wifi-radio-energy-model.cc',
+        'model/wifi-tx-current-model.cc',
+	'model/vht-capabilities.cc',
+        'helper/wifi-radio-energy-model-helper.cc',
+        'helper/vht-wifi-mac-helper.cc',
         'helper/ht-wifi-mac-helper.cc',
         'helper/athstats-helper.cc',
         'helper/wifi-helper.cc',
@@ -137,6 +142,7 @@
         'model/status-code.h',
         'model/capability-information.h',
         'model/dcf-manager.h',
+        'model/mac-tx-middle.h', 
         'model/mac-rx-middle.h', 
         'model/mac-low.h',
         'model/originator-block-ack-agreement.h',
@@ -154,6 +160,11 @@
         'model/mpdu-aggregator.h',
         'model/mpdu-standard-aggregator.h',
         'model/ampdu-tag.h',
+        'model/wifi-radio-energy-model.h',
+        'model/wifi-tx-current-model.h',
+	'model/vht-capabilities.h',
+        'helper/wifi-radio-energy-model-helper.h',
+        'helper/vht-wifi-mac-helper.h',
         'helper/ht-wifi-mac-helper.h',
         'helper/athstats-helper.h',
         'helper/wifi-helper.h',
diff -Naur ns-3.23/src/wimax/bindings/modulegen__gcc_ILP32.py ns-3.24/src/wimax/bindings/modulegen__gcc_ILP32.py
--- ns-3.23/src/wimax/bindings/modulegen__gcc_ILP32.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/bindings/modulegen__gcc_ILP32.py	2015-09-15 11:18:44.000000000 -0700
@@ -139,7 +139,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## snr-to-block-error-rate-manager.h (module 'wimax'): ns3::SNRToBlockErrorRateManager [class]
@@ -560,6 +560,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -600,6 +606,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -1052,17 +1065,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1084,11 +1097,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1098,16 +1106,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1345,14 +1343,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1413,11 +1415,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Cid_methods(root_module, cls):
@@ -3091,7 +3088,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -3116,10 +3113,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -3183,10 +3180,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -4177,10 +4174,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -5366,6 +5363,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ofdm-downlink-frame-prefix.h (module 'wimax'): static ns3::TypeId ns3::OfdmDownlinkFramePrefix::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## ofdm-downlink-frame-prefix.h (module 'wimax'): void ns3::OfdmDownlinkFramePrefix::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5545,10 +5547,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -6401,6 +6403,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ss-service-flow-manager.h (module 'wimax'): static ns3::TypeId ns3::SsServiceFlowManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## ss-service-flow-manager.h (module 'wimax'): void ns3::SsServiceFlowManager::InitiateServiceFlows() [member function]
     cls.add_method('InitiateServiceFlows', 
                    'void', 
@@ -6684,6 +6691,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## wimax-tlv.h (module 'wimax'): static ns3::TypeId ns3::Tlv::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wimax-tlv.h (module 'wimax'): ns3::TlvValue * ns3::Tlv::PeekValue() [member function]
     cls.add_method('PeekValue', 
                    'ns3::TlvValue *', 
@@ -8747,6 +8759,11 @@
                    'std::vector< ns3::ServiceFlow * >', 
                    [param('ns3::ServiceFlow::SchedulingType', 'schedulingType')], 
                    is_const=True)
+    ## bs-service-flow-manager.h (module 'wimax'): static ns3::TypeId ns3::BsServiceFlowManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## bs-service-flow-manager.h (module 'wimax'): void ns3::BsServiceFlowManager::ProcessDsaAck(ns3::DsaAck const & dsaAck, ns3::Cid cid) [member function]
     cls.add_method('ProcessDsaAck', 
                    'void', 
@@ -8773,11 +8790,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -9340,10 +9367,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -11728,6 +11755,11 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True)
+    ## simple-ofdm-wimax-channel.h (module 'wimax'): static ns3::TypeId ns3::SimpleOfdmWimaxChannel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## simple-ofdm-wimax-channel.h (module 'wimax'): void ns3::SimpleOfdmWimaxChannel::Send(ns3::Time BlockTime, uint32_t burstSize, ns3::Ptr<ns3::WimaxPhy> phy, bool isFirstBlock, bool isLastBlock, uint64_t frequency, ns3::WimaxPhy::ModulationType modulationType, uint8_t direction, double txPowerDbm, ns3::Ptr<ns3::PacketBurst> burst) [member function]
     cls.add_method('Send', 
                    'void', 
@@ -12143,6 +12175,7 @@
                         [param('uint8_t const *', 'data'), param('int', 'length')])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -12156,6 +12189,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/wimax/bindings/modulegen__gcc_LP64.py ns-3.24/src/wimax/bindings/modulegen__gcc_LP64.py
--- ns-3.23/src/wimax/bindings/modulegen__gcc_LP64.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/bindings/modulegen__gcc_LP64.py	2015-09-15 11:18:44.000000000 -0700
@@ -139,7 +139,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
-    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SSL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## snr-to-block-error-rate-manager.h (module 'wimax'): ns3::SNRToBlockErrorRateManager [class]
@@ -560,6 +560,12 @@
     register_types_ns3_Hash(nested_module)
     
     
+    ## Register a nested module for the namespace TracedValueCallback
+    
+    nested_module = module.add_cpp_namespace('TracedValueCallback')
+    register_types_ns3_TracedValueCallback(nested_module)
+    
+    
     ## Register a nested module for the namespace internal
     
     nested_module = module.add_cpp_namespace('internal')
@@ -600,6 +606,13 @@
     ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
     module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
 
+def register_types_ns3_TracedValueCallback(module):
+    root_module = module.get_root()
+    
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *', u'ns3::TracedValueCallback::Time')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) **', u'ns3::TracedValueCallback::Time*')
+    typehandlers.add_type_alias(u'void ( * ) ( ns3::Time, ns3::Time ) *&', u'ns3::TracedValueCallback::Time&')
+
 def register_types_ns3_internal(module):
     root_module = module.get_root()
     
@@ -1052,17 +1065,17 @@
     cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(uint32_t end) [member function]
     cls.add_method('AddAtEnd', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'end')])
     ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
                    [param('ns3::Buffer const &', 'o')])
-    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtStart(uint32_t start) [member function]
     cls.add_method('AddAtStart', 
-                   'bool', 
+                   'void', 
                    [param('uint32_t', 'start')])
     ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
     cls.add_method('Begin', 
@@ -1084,11 +1097,6 @@
                    'ns3::Buffer', 
                    [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
-    cls.add_method('CreateFullCopy', 
-                   'ns3::Buffer', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -1098,16 +1106,6 @@
                    'ns3::Buffer::Iterator', 
                    [], 
                    is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
-    cls.add_method('GetCurrentEndOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
-    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
-    cls.add_method('GetCurrentStartOffset', 
-                   'int32_t', 
-                   [], 
-                   is_const=True)
     ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -1345,14 +1343,18 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::ByteTagList const &', 'o')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t appendOffset) [member function]
     cls.add_method('AddAtEnd', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
-    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+                   [param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t prependOffset) [member function]
     cls.add_method('AddAtStart', 
                    'void', 
-                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+                   [param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Adjust(int32_t adjustment) [member function]
+    cls.add_method('Adjust', 
+                   'void', 
+                   [param('int32_t', 'adjustment')])
     ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
     cls.add_method('Begin', 
                    'ns3::ByteTagList::Iterator', 
@@ -1413,11 +1415,6 @@
     ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
     cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
                         visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
     return
 
 def register_Ns3Cid_methods(root_module, cls):
@@ -3091,7 +3088,7 @@
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
     cls.add_instance_attribute('count', 'uint32_t', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
-    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    cls.add_instance_attribute('data', 'uint8_t [ 21 ]', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
     cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
@@ -3116,10 +3113,10 @@
     cls.add_method('Close', 
                    'void', 
                    [])
-    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t & packets, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
     cls.add_method('Diff', 
                    'bool', 
-                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t &', 'packets'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
                    is_static=True)
     ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
     cls.add_method('Eof', 
@@ -3183,10 +3180,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
     cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
     ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
@@ -4177,10 +4174,10 @@
                    'void', 
                    [], 
                    is_static=True)
-    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & delay) [member function]
     cls.add_method('Stop', 
                    'void', 
-                   [param('ns3::Time const &', 'time')], 
+                   [param('ns3::Time const &', 'delay')], 
                    is_static=True)
     return
 
@@ -5366,6 +5363,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ofdm-downlink-frame-prefix.h (module 'wimax'): static ns3::TypeId ns3::OfdmDownlinkFramePrefix::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## ofdm-downlink-frame-prefix.h (module 'wimax'): void ns3::OfdmDownlinkFramePrefix::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5545,10 +5547,10 @@
     cls.add_method('Write', 
                    'void', 
                    [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<const ns3::Packet> p) [member function]
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header const & header, ns3::Ptr<const ns3::Packet> p) [member function]
     cls.add_method('Write', 
                    'void', 
-                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+                   [param('ns3::Time', 't'), param('ns3::Header const &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
     ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
     cls.add_method('Write', 
                    'void', 
@@ -6401,6 +6403,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## ss-service-flow-manager.h (module 'wimax'): static ns3::TypeId ns3::SsServiceFlowManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## ss-service-flow-manager.h (module 'wimax'): void ns3::SsServiceFlowManager::InitiateServiceFlows() [member function]
     cls.add_method('InitiateServiceFlows', 
                    'void', 
@@ -6684,6 +6691,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## wimax-tlv.h (module 'wimax'): static ns3::TypeId ns3::Tlv::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## wimax-tlv.h (module 'wimax'): ns3::TlvValue * ns3::Tlv::PeekValue() [member function]
     cls.add_method('PeekValue', 
                    'ns3::TlvValue *', 
@@ -8747,6 +8759,11 @@
                    'std::vector< ns3::ServiceFlow * >', 
                    [param('ns3::ServiceFlow::SchedulingType', 'schedulingType')], 
                    is_const=True)
+    ## bs-service-flow-manager.h (module 'wimax'): static ns3::TypeId ns3::BsServiceFlowManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## bs-service-flow-manager.h (module 'wimax'): void ns3::BsServiceFlowManager::ProcessDsaAck(ns3::DsaAck const & dsaAck, ns3::Cid cid) [member function]
     cls.add_method('ProcessDsaAck', 
                    'void', 
@@ -8773,11 +8790,21 @@
     cls.add_constructor([])
     ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
                    is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -9340,10 +9367,10 @@
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double c1, double c2, double v1, double v2, double r) [member function]
     cls.add_method('Interpolate', 
                    'double', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   [param('double', 'c1'), param('double', 'c2'), param('double', 'v1'), param('double', 'v2'), param('double', 'r')], 
                    visibility='private', is_virtual=True)
     ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
     cls.add_method('Validate', 
@@ -11728,6 +11755,11 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True)
+    ## simple-ofdm-wimax-channel.h (module 'wimax'): static ns3::TypeId ns3::SimpleOfdmWimaxChannel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## simple-ofdm-wimax-channel.h (module 'wimax'): void ns3::SimpleOfdmWimaxChannel::Send(ns3::Time BlockTime, uint32_t burstSize, ns3::Ptr<ns3::WimaxPhy> phy, bool isFirstBlock, bool isLastBlock, uint64_t frequency, ns3::WimaxPhy::ModulationType modulationType, uint8_t direction, double txPowerDbm, ns3::Ptr<ns3::PacketBurst> burst) [member function]
     cls.add_method('Send', 
                    'void', 
@@ -12143,6 +12175,7 @@
                         [param('uint8_t const *', 'data'), param('int', 'length')])
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_TracedValueCallback(module.get_submodule('TracedValueCallback'), root_module)
     register_functions_ns3_internal(module.get_submodule('internal'), root_module)
     return
 
@@ -12156,6 +12189,9 @@
 def register_functions_ns3_Hash_Function(module, root_module):
     return
 
+def register_functions_ns3_TracedValueCallback(module, root_module):
+    return
+
 def register_functions_ns3_internal(module, root_module):
     return
 
diff -Naur ns-3.23/src/wimax/model/bs-scheduler.cc ns-3.24/src/wimax/model/bs-scheduler.cc
--- ns-3.23/src/wimax/model/bs-scheduler.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/bs-scheduler.cc	2015-09-15 11:18:44.000000000 -0700
@@ -44,7 +44,11 @@
 TypeId
 BSScheduler::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::BSScheduler").SetParent<Object> ().SetGroupName("Wimax");
+  static TypeId tid = TypeId ("ns3::BSScheduler")
+    .SetParent<Object> ()
+    .SetGroupName("Wimax")
+    // No AddConstructor because this is an abstract class.
+    ;
   return tid;
 }
 
diff -Naur ns-3.23/src/wimax/model/bs-scheduler-rtps.cc ns-3.24/src/wimax/model/bs-scheduler-rtps.cc
--- ns-3.23/src/wimax/model/bs-scheduler-rtps.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/bs-scheduler-rtps.cc	2015-09-15 11:18:44.000000000 -0700
@@ -46,7 +46,11 @@
 TypeId
 BSSchedulerRtps::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::BSSchedulerRtps").SetParent<Object> ().SetGroupName("Wimax").AddConstructor<BSSchedulerRtps> ();
+  static TypeId tid = TypeId ("ns3::BSSchedulerRtps")
+    .SetParent<BSScheduler> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<BSSchedulerRtps> ()
+    ;
   return tid;
 }
 
diff -Naur ns-3.23/src/wimax/model/bs-scheduler-simple.cc ns-3.24/src/wimax/model/bs-scheduler-simple.cc
--- ns-3.23/src/wimax/model/bs-scheduler-simple.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/bs-scheduler-simple.cc	2015-09-15 11:18:44.000000000 -0700
@@ -43,7 +43,11 @@
 
 TypeId BSSchedulerSimple::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::BSSchedulerSimple").SetParent<Object> ().SetGroupName("Wimax").AddConstructor<BSSchedulerSimple> ();
+  static TypeId tid = TypeId ("ns3::BSSchedulerSimple")
+    .SetParent<BSScheduler> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<BSSchedulerSimple> ()
+    ;
   return tid;
 }
 
diff -Naur ns-3.23/src/wimax/model/bs-service-flow-manager.cc ns-3.24/src/wimax/model/bs-service-flow-manager.cc
--- ns-3.23/src/wimax/model/bs-service-flow-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/bs-service-flow-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -54,6 +54,18 @@
 {
 }
 
+/* static */
+TypeId
+BsServiceFlowManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::BsServiceFlowManager")
+    .SetParent<ServiceFlowManager> ()
+    .SetGroupName ("Wifi")
+    // No AddConstructor because this class has no default constructor.
+  ;
+  return tid;
+}
+
 void
 BsServiceFlowManager::DoDispose (void)
 {
diff -Naur ns-3.23/src/wimax/model/bs-service-flow-manager.h ns-3.24/src/wimax/model/bs-service-flow-manager.h
--- ns-3.23/src/wimax/model/bs-service-flow-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/bs-service-flow-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -52,6 +52,12 @@
   ~BsServiceFlowManager (void);
   void DoDispose (void);
   /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
+  /**
    * \brief Add a new service flow
    * \param serviceFlow the service flow to add
    */
diff -Naur ns-3.23/src/wimax/model/bs-uplink-scheduler-rtps.cc ns-3.24/src/wimax/model/bs-uplink-scheduler-rtps.cc
--- ns-3.23/src/wimax/model/bs-uplink-scheduler-rtps.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/bs-uplink-scheduler-rtps.cc	2015-09-15 11:18:44.000000000 -0700
@@ -71,7 +71,11 @@
 TypeId
 UplinkSchedulerRtps::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::UplinkSchedulerRtps").SetParent<UplinkScheduler> ().SetGroupName("Wimax");
+  static TypeId tid = TypeId ("ns3::UplinkSchedulerRtps")
+    .SetParent<UplinkScheduler> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<UplinkSchedulerRtps> ()
+    ;
   return tid;
 }
 
diff -Naur ns-3.23/src/wimax/model/bs-uplink-scheduler-simple.cc ns-3.24/src/wimax/model/bs-uplink-scheduler-simple.cc
--- ns-3.23/src/wimax/model/bs-uplink-scheduler-simple.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/bs-uplink-scheduler-simple.cc	2015-09-15 11:18:44.000000000 -0700
@@ -75,7 +75,11 @@
 TypeId
 UplinkSchedulerSimple::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::UplinkSchedulerSimple").SetParent<Object> ().SetGroupName("Wimax");
+  static TypeId tid = TypeId ("ns3::UplinkSchedulerSimple")
+    .SetParent<UplinkScheduler> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<UplinkSchedulerSimple> ()
+    ;
   return tid;
 }
 
diff -Naur ns-3.23/src/wimax/model/mac-messages.cc ns-3.24/src/wimax/model/mac-messages.cc
--- ns-3.23/src/wimax/model/mac-messages.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/mac-messages.cc	2015-09-15 11:18:44.000000000 -0700
@@ -68,7 +68,11 @@
 ManagementMessageType::GetTypeId (void)
 {
   static TypeId tid =
-    TypeId ("ns3::ManagementMessageType").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<ManagementMessageType> ();
+    TypeId ("ns3::ManagementMessageType")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<ManagementMessageType> ()
+    ;
   return tid;
 }
 
@@ -166,7 +170,11 @@
 TypeId
 RngReq::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::RngReq").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<RngReq> ();
+  static TypeId tid = TypeId ("ns3::RngReq")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<RngReq> ()
+    ;
   return tid;
 }
 
@@ -423,7 +431,11 @@
 TypeId
 RngRsp::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::RngRsp").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<RngRsp> ();
+  static TypeId tid = TypeId ("ns3::RngRsp")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<RngRsp> ()
+    ;
   return tid;
 }
 
@@ -564,7 +576,11 @@
 TypeId
 DsaReq::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::DsaReq").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<DsaReq> ();
+  static TypeId tid = TypeId ("ns3::DsaReq")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<DsaReq> ()
+    ;
   return tid;
 }
 
@@ -705,7 +721,11 @@
 TypeId
 DsaRsp::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::DsaRsp").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<DsaRsp> ();
+  static TypeId tid = TypeId ("ns3::DsaRsp")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<DsaRsp> ()
+    ;
   return tid;
 }
 
@@ -799,7 +819,11 @@
 TypeId
 DsaAck::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::DsaAck").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<DsaAck> ();
+  static TypeId tid = TypeId ("ns3::DsaAck")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<DsaAck> ()
+    ;
   return tid;
 }
 
diff -Naur ns-3.23/src/wimax/model/ofdm-downlink-frame-prefix.cc ns-3.24/src/wimax/model/ofdm-downlink-frame-prefix.cc
--- ns-3.23/src/wimax/model/ofdm-downlink-frame-prefix.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/ofdm-downlink-frame-prefix.cc	2015-09-15 11:18:44.000000000 -0700
@@ -140,6 +140,18 @@
 {
 }
 
+/* static */
+TypeId
+OfdmDownlinkFramePrefix::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::OfdmDownlinkFramePrefix")
+    .SetParent<Header> ()
+    .SetGroupName ("Wimax")
+    // No AddConstructor because this is an abstract class.
+    ;
+  return tid;
+}
+   
 void
 OfdmDownlinkFramePrefix::SetBaseStationId (Mac48Address baseStationId)
 {
diff -Naur ns-3.23/src/wimax/model/ofdm-downlink-frame-prefix.h ns-3.24/src/wimax/model/ofdm-downlink-frame-prefix.h
--- ns-3.23/src/wimax/model/ofdm-downlink-frame-prefix.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/ofdm-downlink-frame-prefix.h	2015-09-15 11:18:44.000000000 -0700
@@ -83,6 +83,12 @@
   OfdmDownlinkFramePrefix ();
   ~OfdmDownlinkFramePrefix ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
   void SetBaseStationId (Mac48Address baseStationId);
   void SetFrameNumber (uint32_t frameNumber);
   void SetConfigurationChangeCount (uint8_t configurationChangeCount);
diff -Naur ns-3.23/src/wimax/model/simple-ofdm-wimax-channel.cc ns-3.24/src/wimax/model/simple-ofdm-wimax-channel.cc
--- ns-3.23/src/wimax/model/simple-ofdm-wimax-channel.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/simple-ofdm-wimax-channel.cc	2015-09-15 11:18:44.000000000 -0700
@@ -50,6 +50,18 @@
   m_phyList.clear ();
 }
 
+/* static */
+TypeId
+SimpleOfdmWimaxChannel::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::SimpleOfdmWimaxChannel")
+    .SetParent<WimaxChannel> ()
+    .SetGroupName ("Wimax")
+    .AddConstructor<SimpleOfdmWimaxChannel> ()
+    ;
+  return tid;
+}
+
 SimpleOfdmWimaxChannel::SimpleOfdmWimaxChannel (PropModel propModel)
 {
   switch (propModel)
diff -Naur ns-3.23/src/wimax/model/simple-ofdm-wimax-channel.h ns-3.24/src/wimax/model/simple-ofdm-wimax-channel.h
--- ns-3.23/src/wimax/model/simple-ofdm-wimax-channel.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/simple-ofdm-wimax-channel.h	2015-09-15 11:18:44.000000000 -0700
@@ -51,6 +51,13 @@
     LOG_DISTANCE_PROPAGATION,
     COST231_PROPAGATION
   };
+  
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
   /**
    * \brief Creates a channel and sets the propagation model
    * \param propModel the propagation model to use
diff -Naur ns-3.23/src/wimax/model/simple-ofdm-wimax-phy.cc ns-3.24/src/wimax/model/simple-ofdm-wimax-phy.cc
--- ns-3.23/src/wimax/model/simple-ofdm-wimax-phy.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/simple-ofdm-wimax-phy.cc	2015-09-15 11:18:44.000000000 -0700
@@ -43,9 +43,11 @@
 
 TypeId SimpleOfdmWimaxPhy::GetTypeId (void)
 {
-  static TypeId
-    tid =
-    TypeId ("ns3::SimpleOfdmWimaxPhy").SetParent<WimaxPhy> ()
+  static TypeId tid = TypeId ("ns3::SimpleOfdmWimaxPhy")
+    .SetParent<WimaxPhy> ()
+    .SetGroupName ("Wimax")
+    
+    .AddConstructor<SimpleOfdmWimaxPhy> ()
 
     .AddAttribute ("NoiseFigure",
                    "Loss (dB) in the Signal-to-Noise-Ratio due to non-idealities in the receiver.",
@@ -92,7 +94,7 @@
 
     .AddTraceSource ("Rx", "Receive trace",
                      MakeTraceSourceAccessor (&SimpleOfdmWimaxPhy::m_traceRx),
-                     "ns3::PacketBurst::Traced::Ptr")
+                     "ns3::PacketBurst::TracedCallback")
     .AddTraceSource ("Tx", "Transmit trace",
                      MakeTraceSourceAccessor (&SimpleOfdmWimaxPhy::m_traceTx),
                      "ns3::PacketBurst::TracedCallback")
diff -Naur ns-3.23/src/wimax/model/simple-ofdm-wimax-phy.h ns-3.24/src/wimax/model/simple-ofdm-wimax-phy.h
--- ns-3.23/src/wimax/model/simple-ofdm-wimax-phy.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/simple-ofdm-wimax-phy.h	2015-09-15 11:18:44.000000000 -0700
@@ -273,6 +273,8 @@
    * the medium.
    *
    * \see class CallBackTraceSource
+   * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+   * and will be changed to \c Ptrc<PacketBurst> in a future release.
    */
   TracedCallback <Ptr<PacketBurst > >  m_phyTxBeginTrace;
 
@@ -281,6 +283,8 @@
    * the medium.
    *
    * \see class CallBackTraceSource
+   * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+   * and will be changed to \c Ptrc<PacketBurst> in a future release.
    */
   TracedCallback<Ptr<PacketBurst > > m_phyTxEndTrace;
 
@@ -289,6 +293,8 @@
    * to transmit it.
    *
    * \see class CallBackTraceSource
+   * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+   * and will be changed to \c Ptrc<PacketBurst> in a future release.
    */
   TracedCallback<Ptr<PacketBurst > > m_phyTxDropTrace;
 
@@ -297,6 +303,8 @@
    * the medium.
    *
    * \see class CallBackTraceSource
+   * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+   * and will be changed to \c Ptrc<PacketBurst> in a future release.
    */
   TracedCallback<Ptr<PacketBurst > > m_phyRxBeginTrace;
 
@@ -305,6 +313,8 @@
    * the medium.
    *
    * \see class CallBackTraceSource
+   * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+   * and will be changed to \c Ptrc<PacketBurst> in a future release.
    */
   TracedCallback<Ptr<PacketBurst > > m_phyRxEndTrace;
 
@@ -312,6 +322,8 @@
    * The trace source fired when the phy layer drops a packet it has received.
    *
    * \see class CallBackTraceSource
+   * \deprecated The non-const \c Ptr<PacketBurst> argument is deprecated
+   * and will be changed to \c Ptrc<PacketBurst> in a future release.
    */
   TracedCallback<Ptr<PacketBurst > > m_phyRxDropTrace;
 
diff -Naur ns-3.23/src/wimax/model/ss-net-device.cc ns-3.24/src/wimax/model/ss-net-device.cc
--- ns-3.23/src/wimax/model/ss-net-device.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/ss-net-device.cc	2015-09-15 11:18:44.000000000 -0700
@@ -61,6 +61,7 @@
     TypeId ("ns3::SubscriberStationNetDevice")
 
     .SetParent<WimaxNetDevice> ()
+    .SetGroupName ("Wimax")
 
     .AddConstructor<SubscriberStationNetDevice> ()
 
@@ -914,7 +915,7 @@
         }
       else if (GetInitialRangingConnection () != 0 && cid == GetInitialRangingConnection ()->GetCid () && !fragmentation)
         {
-          m_traceSSRx (packet, GetMacAddress (), &cid);
+          m_traceSSRx (packet, GetMacAddress (), cid);
           packet->RemoveHeader (msgType);
           switch (msgType.GetType ())
             {
@@ -933,7 +934,7 @@
         }
       else if (m_basicConnection != 0 && cid == m_basicConnection->GetCid () && !fragmentation)
         {
-          m_traceSSRx (packet, GetMacAddress (), &cid);
+          m_traceSSRx (packet, GetMacAddress (), cid);
           packet->RemoveHeader (msgType);
           switch (msgType.GetType ())
             {
@@ -952,7 +953,7 @@
         }
       else if (m_primaryConnection != 0 && cid == m_primaryConnection->GetCid () && !fragmentation)
         {
-          m_traceSSRx (packet, GetMacAddress (), &cid);
+          m_traceSSRx (packet, GetMacAddress (), cid);
           packet->RemoveHeader (msgType);
           switch (msgType.GetType ())
             {
@@ -1042,7 +1043,7 @@
         }
       else if (cid.IsMulticast ())
         {
-          m_traceSSRx (packet, GetMacAddress (), &cid);
+          m_traceSSRx (packet, GetMacAddress (), cid);
           ForwardUp (packet, m_baseStationId, GetMacAddress ()); // source shall be BS's address or sender SS's?
         }
       else if (IsPromisc ())
diff -Naur ns-3.23/src/wimax/model/ss-net-device.h ns-3.24/src/wimax/model/ss-net-device.h
--- ns-3.23/src/wimax/model/ss-net-device.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/ss-net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -350,8 +350,10 @@
   Ptr<SsServiceFlowManager> m_serviceFlowManager;
   Ptr<IpcsClassifier> m_classifier;
 
-  TracedCallback<Ptr<const Packet>, Mac48Address, Cid*> m_traceSSRx;
-  TracedCallback<Ptr<const PacketBurst>, Mac48Address, Cid*, WimaxPhy::ModulationType> m_traceSSTx;
+  TracedCallback<Ptr<const Packet>, Mac48Address, const Cid &> m_traceSSRx;
+  /** \todo Remove: this TracedCallback is never invoked. */
+  TracedCallback<Ptr<const PacketBurst>, Mac48Address, const Cid &,
+                 WimaxPhy::ModulationType> m_traceSSTx;
 
   /**
    * The trace source fired when packets come into the "top" of the device
diff -Naur ns-3.23/src/wimax/model/ss-service-flow-manager.cc ns-3.24/src/wimax/model/ss-service-flow-manager.cc
--- ns-3.23/src/wimax/model/ss-service-flow-manager.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/ss-service-flow-manager.cc	2015-09-15 11:18:44.000000000 -0700
@@ -59,6 +59,18 @@
 {
 }
 
+/* static */
+TypeId
+SsServiceFlowManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::SsServiceFlowManager")
+    .SetParent<ServiceFlowManager> ()
+    .SetGroupName ("Wimax")
+    // No AddConstructor because this is an abstract class.
+    ;
+  return tid;
+}
+
 void
 SsServiceFlowManager::DoDispose (void)
 {
diff -Naur ns-3.23/src/wimax/model/ss-service-flow-manager.h ns-3.24/src/wimax/model/ss-service-flow-manager.h
--- ns-3.23/src/wimax/model/ss-service-flow-manager.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/ss-service-flow-manager.h	2015-09-15 11:18:44.000000000 -0700
@@ -51,9 +51,15 @@
    * \param  device the device to which the service flow manager will be attached
    */
   SsServiceFlowManager (Ptr<SubscriberStationNetDevice> device);
-
   ~SsServiceFlowManager (void);
   void DoDispose (void);
+
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+  
   /**
    * \brief add a service flow to the list
    * \param serviceFlow the service flow to add
diff -Naur ns-3.23/src/wimax/model/wimax-mac-header.cc ns-3.24/src/wimax/model/wimax-mac-header.cc
--- ns-3.23/src/wimax/model/wimax-mac-header.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/wimax-mac-header.cc	2015-09-15 11:18:44.000000000 -0700
@@ -62,7 +62,11 @@
 TypeId
 MacHeaderType::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::MacHeaderType").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<MacHeaderType> ();
+  static TypeId tid = TypeId ("ns3::MacHeaderType")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<MacHeaderType> ()
+    ;
   return tid;
 }
 
@@ -200,7 +204,11 @@
 
 TypeId GenericMacHeader::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::GenericMacHeader").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<GenericMacHeader> ();
+  static TypeId tid = TypeId ("ns3::GenericMacHeader")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<GenericMacHeader> ()
+    ;
   return tid;
 }
 
@@ -379,8 +387,11 @@
 
 TypeId BandwidthRequestHeader::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::BandwidthRequestHeader").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<
-      BandwidthRequestHeader> ();
+  static TypeId tid = TypeId ("ns3::BandwidthRequestHeader")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<BandwidthRequestHeader> ()
+    ;
   return tid;
 }
 
@@ -528,8 +539,11 @@
 
 TypeId GrantManagementSubheader::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::GrantManagementSubheader").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<
-      GrantManagementSubheader> ();
+  static TypeId tid = TypeId ("ns3::GrantManagementSubheader")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<GrantManagementSubheader> ()
+    ;
   return tid;
 }
 
@@ -615,8 +629,11 @@
 TypeId
 FragmentationSubheader::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::FragmentationSubheader").SetParent<
-      Header> ().SetGroupName("Wimax").AddConstructor<FragmentationSubheader> ();
+  static TypeId tid = TypeId ("ns3::FragmentationSubheader")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<FragmentationSubheader> ()
+    ;
   return tid;
 }
 
diff -Naur ns-3.23/src/wimax/model/wimax-mac-to-mac-header.cc ns-3.24/src/wimax/model/wimax-mac-to-mac-header.cc
--- ns-3.23/src/wimax/model/wimax-mac-to-mac-header.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/wimax-mac-to-mac-header.cc	2015-09-15 11:18:44.000000000 -0700
@@ -46,7 +46,11 @@
 WimaxMacToMacHeader::GetTypeId (void)
 {
   static TypeId tid =
-    TypeId ("ns3::WimaxMacToMacHeader").SetParent<Header> ().SetGroupName("Wimax").AddConstructor<WimaxMacToMacHeader> ();
+    TypeId ("ns3::WimaxMacToMacHeader")
+    .SetParent<Header> ()
+    .SetGroupName("Wimax")
+    .AddConstructor<WimaxMacToMacHeader> ()
+    ;
   return tid;
 }
 
diff -Naur ns-3.23/src/wimax/model/wimax-net-device.cc ns-3.24/src/wimax/model/wimax-net-device.cc
--- ns-3.23/src/wimax/model/wimax-net-device.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/wimax-net-device.cc	2015-09-15 11:18:44.000000000 -0700
@@ -56,6 +56,9 @@
     TypeId ("ns3::WimaxNetDevice")
 
     .SetParent<NetDevice> ()
+    .SetGroupName ("Wimax")
+
+    // No AddConstructor because this is an abstract class.
 
     .AddAttribute ("Mtu", "The MAC-level Maximum Transmission Unit",
                    UintegerValue (DEFAULT_MSDU_SIZE),
@@ -123,12 +126,12 @@
     .AddTraceSource ("Rx",
                      "Receive trace",
                      MakeTraceSourceAccessor (&WimaxNetDevice::m_traceRx),
-                     "ns3::Packet::TracedCallback")
+                     "ns3::WimaxNetDevice::TxRxTracedCallback")
 
     .AddTraceSource ("Tx",
                      "Transmit trace",
                      MakeTraceSourceAccessor (&WimaxNetDevice::m_traceTx),
-                     "ns3::Packet::TracedCallback");
+                     "ns3::WimaxNetDevice::TxRxTracedCallback");
   return tid;
 }
 
diff -Naur ns-3.23/src/wimax/model/wimax-net-device.h ns-3.24/src/wimax/model/wimax-net-device.h
--- ns-3.23/src/wimax/model/wimax-net-device.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/wimax-net-device.h	2015-09-15 11:18:44.000000000 -0700
@@ -170,7 +170,7 @@
    */
   void SetBandwidthManager (Ptr<BandwidthManager> bandwidthManager);
 
-  /*
+  /**
    * \brief Creates the initial ranging and broadcast connections
    */
   void CreateDefaultConnections (void);
@@ -219,8 +219,34 @@
   NetDevice::PromiscReceiveCallback GetPromiscReceiveCallback (void);
   virtual bool SupportsSendFrom (void) const;
 
-  TracedCallback<Ptr<const Packet>, const Mac48Address&> m_traceRx;
-  TracedCallback<Ptr<const Packet>, const Mac48Address&> m_traceTx;
+  /**
+   * TracedCallback signature for packet and Mac48Address.
+   *
+   * \param [in] packet The packet.
+   * \param [in] mac The Mac48Address.
+   * \deprecated The `const Mac48Address &` argument is deprecated
+   * and will be changed to \c Mac48Address in a future release.
+   * The TracedCallback signature will then match \c Packet::Mac48Address
+   * and this typedef can be removed.
+   */
+  typedef void (* TxRxTracedCallback)
+    (Ptr<const Packet> packet, const Mac48Address & mac);
+  /**
+   * \deprecated The `const Mac48Address &` argument is deprecated
+   * and will be changed to \c Mac48Address in a future release.
+   * The TracedCallback signature will then match \c Packet::Mac48Address
+   * and this typedef can be removed.
+   * \todo This member variable should be private.
+   */
+  TracedCallback<Ptr<const Packet>, const Mac48Address &> m_traceRx;
+  /**
+   * \deprecated The `const Mac48Address &` argument is deprecated
+   * and will be changed to \c Mac48Address in a future release.
+   * The TracedCallback signature will then match \c Packet::Mac48Address
+   * and this typedef can be removed.
+   * \todo This member variable should be private.
+   */
+  TracedCallback<Ptr<const Packet>, const Mac48Address &> m_traceTx;
 
   virtual void DoDispose (void);
   virtual Address GetMulticast (Ipv6Address addr) const;
diff -Naur ns-3.23/src/wimax/model/wimax-phy.cc ns-3.24/src/wimax/model/wimax-phy.cc
--- ns-3.23/src/wimax/model/wimax-phy.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/wimax-phy.cc	2015-09-15 11:18:44.000000000 -0700
@@ -38,7 +38,11 @@
 
 TypeId WimaxPhy::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::WimaxPhy").SetParent<Object> ().SetGroupName("Wimax")
+  static TypeId tid = TypeId ("ns3::WimaxPhy")
+    .SetParent<Object> ()
+    .SetGroupName("Wimax")
+
+    // No AddConstructor because this is an abstract class.
 
     .AddAttribute ("Channel",
                    "Wimax channel",
diff -Naur ns-3.23/src/wimax/model/wimax-tlv.cc ns-3.24/src/wimax/model/wimax-tlv.cc
--- ns-3.23/src/wimax/model/wimax-tlv.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/wimax-tlv.cc	2015-09-15 11:18:44.000000000 -0700
@@ -27,6 +27,18 @@
   
 // NS_OBJECT_ENSURE_REGISTERED ("Tlv");
 
+/* static */
+TypeId
+Tlv::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::Tlv")
+    .SetParent<Header> ()
+    .SetGroupName ("Wimax")
+    .AddConstructor<Tlv> ()
+    ;
+  return tid;
+}
+  
 TypeId Tlv::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
diff -Naur ns-3.23/src/wimax/model/wimax-tlv.h ns-3.24/src/wimax/model/wimax-tlv.h
--- ns-3.23/src/wimax/model/wimax-tlv.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wimax/model/wimax-tlv.h	2015-09-15 11:18:44.000000000 -0700
@@ -77,6 +77,11 @@
   Tlv (uint8_t type, uint64_t length, const TlvValue & value);
   Tlv (void);
   ~Tlv (void);
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetSerializedSize (void) const;
diff -Naur ns-3.23/src/wscript ns-3.24/src/wscript
--- ns-3.23/src/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/src/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -1,6 +1,6 @@
 
 ## -*- 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
@@ -335,7 +335,7 @@
 
     def __str__(self):
         "string to display to the user"
-        tgt_str = ' '.join([a.nice_path(self.env) for a in self.outputs])
+        tgt_str = ' '.join([a.bldpath() for a in self.outputs])
         return 'pcfile: %s\n' % (tgt_str)
 
     def runnable_status(self):
@@ -406,7 +406,7 @@
             if dep.startswith('ns3-'):
                 dep_name = dep[4:]
                 requires.append("libns%s-%s%s" % (wutils.VERSION, dep_name, env.BUILD_SUFFIX))
-        print >> outfile, """\
+        print("""\
 prefix=%s
 libdir=%s
 includedir=%s
@@ -418,7 +418,7 @@
 Cflags: %s
 Requires: %s\
 """ % (prefix, libdir, includedir,
-       name, name, wutils.VERSION, ' '.join(libs), ' '.join(cflags), ' '.join(requires))
+       name, name, wutils.VERSION, ' '.join(libs), ' '.join(cflags), ' '.join(requires)), file=outfile)
         outfile.close()
 
     def run(self):
@@ -473,13 +473,13 @@
     def __str__(self):
         "string to display to the user"
         env = self.env
-        src_str = ' '.join([a.nice_path(env) for a in self.inputs])
-        tgt_str = ' '.join([a.nice_path(env) for a in self.outputs])
+        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\n' % (self.header_to_remove.abspath(),)
-        return 'install-ns3-header: %s%s%s\n' % (src_str, sep, tgt_str)
+            return 'rm-ns3-header %s' % (self.header_to_remove.abspath(),)
+        return 'install-ns3-header: %s' % (tgt_str)
 
     def __repr__(self):
         return str(self)
@@ -492,8 +492,8 @@
             up = m.update
             up(self.__class__.__name__.encode())
             for x in self.inputs + self.outputs:
-                up(x.abspath())
-            up(self.mode)
+                up(x.abspath().encode())
+            up(self.mode.encode())
             if self.mode == 'remove':
                 up(self.header_to_remove.abspath().encode())
             self.uid_ = m.digest()
@@ -515,13 +515,13 @@
             outputs = [node.abspath() for node in self.outputs]
             for src, dst in zip(inputs, outputs):
                 try:
-                    os.chmod(dst, 0600)
+                    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, 0400)
+                os.chmod(dst, 0o400)
             return 0
         else:
             assert len(self.inputs) == 0
@@ -529,7 +529,7 @@
             out_file_name = self.header_to_remove.abspath()
             try:
                 os.unlink(out_file_name)
-            except OSError, ex:
+            except OSError as ex:
                 if ex.errno != 2:
                     raise
             return 0
@@ -559,19 +559,19 @@
 
 class ns3privateheader_task(Task.Task):
     before = 'cxx gen_ns3_module_header'
-    after = 'ns3_header'
+    after = 'ns3header'
     color = 'BLUE'
 
     def __str__(self):
         "string to display to the user"
         env = self.env
-        src_str = ' '.join([a.nice_path(env) for a in self.inputs])
-        tgt_str = ' '.join([a.nice_path(env) for a in self.outputs])
+        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\n' % (self.header_to_remove.abspath(),)
-        return 'install-ns3-header: %s%s%s\n' % (src_str, sep, tgt_str)
+            return 'rm-ns3-header %s' % (self.header_to_remove.abspath(),)
+        return 'install-ns3-header: %s' % (tgt_str)
 
     def __repr__(self):
         return str(self)
@@ -584,8 +584,8 @@
             up = m.update
             up(self.__class__.__name__.encode())
             for x in self.inputs + self.outputs:
-                up(x.abspath())
-            up(self.mode)
+                up(x.abspath().encode())
+            up(self.mode.encode())
             if self.mode == 'remove':
                 up(self.header_to_remove.abspath().encode())
             self.uid_ = m.digest()
@@ -607,13 +607,13 @@
             outputs = [node.abspath() for node in self.outputs]
             for src, dst in zip(inputs, outputs):
                 try:
-                    os.chmod(dst, 0600)
+                    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, 0400)
+                os.chmod(dst, 0o400)
             return 0
         else:
             assert len(self.inputs) == 0
@@ -621,7 +621,7 @@
             out_file_name = self.header_to_remove.abspath()
             try:
                 os.unlink(out_file_name)
-            except OSError, ex:
+            except OSError as ex:
                 if ex.errno != 2:
                     raise
             return 0
@@ -644,13 +644,13 @@
     def __str__(self):
         "string to display to the user"
         env = self.env
-        src_str = ' '.join([a.nice_path(env) for a in self.inputs])
-        tgt_str = ' '.join([a.nice_path(env) for a in self.outputs])
+        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\n' % (self.header_to_remove.abspath(),)
-        return 'gen-module-header: %s%s%s\n' % (src_str, sep, tgt_str)
+            return 'rm-module-header %s' % (self.header_to_remove.abspath(),)
+        return 'gen-module-header: %s' % (tgt_str)
 
     def run(self):
         if self.mode == 'remove':
@@ -659,41 +659,41 @@
             out_file_name = self.header_to_remove.abspath()
             try:
                 os.unlink(out_file_name)
-            except OSError, ex:
+            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]
-        outfile = file(out_file_name, "w")
+        outfile = open(out_file_name, "w")
         header_files.sort()
 
-        print >> 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('-', '_'),)
+    """ % (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 >> outfile
-        print >> outfile, "// Module headers:"
+        print(file=outfile)
+        print("// Module headers:", file=outfile)
         for header in header_files:
-            print >> outfile, "#include \"%s\"" % (header,)
+            print("#include \"%s\"" % (header,), file=outfile)
 
-        print >> outfile, "#endif"
+        print("#endif", file=outfile)
 
         outfile.close()
         return 0
 
     def sig_explicit_deps(self):
-        self.m.update('\n'.join([node.abspath() for node in self.inputs]))
+        self.m.update('\n'.join(sorted([node.abspath() for node in self.inputs])).encode('utf-8'))
         return self.m.digest()
 
     def unique_id(self):
@@ -721,7 +721,7 @@
             if ns3headers.module != self.module:
                 continue
             found_the_module = True
-            for source in ns3headers.headers:
+            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:
diff -Naur ns-3.23/test.py ns-3.24/test.py
--- ns-3.23/test.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/test.py	2015-09-15 11:18:44.000000000 -0700
@@ -16,14 +16,13 @@
 # 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 os
 import sys
 import time
 import optparse
 import subprocess
 import threading
-import Queue
 import signal
 import xml.dom.minidom
 import shutil
@@ -31,6 +30,10 @@
 
 from utils import get_list_from_file
 
+try:
+    import queue
+except ImportError:
+    import Queue as queue
 #
 # XXX This should really be part of a waf command to list the configuration
 # items relative to optional ns-3 pieces.
@@ -590,7 +593,7 @@
 
     if options.verbose:
         for item in interesting_config_items:
-            print "%s ==" % item, eval(item)
+            print("%s ==" % item, eval(item))
 
 #
 # It seems pointless to fork a process to run waf to fork a process to run
@@ -608,7 +611,7 @@
     have_PATH = False
     have_PYTHONPATH = False
 
-    keys = os.environ.keys()
+    keys = list(os.environ.keys())
     for key in keys:
         if key == "DYLD_LIBRARY_PATH":
             have_DYLD_LIBRARY_PATH = True
@@ -627,7 +630,7 @@
         os.environ["PYTHONPATH"] += ":" + pypath
 
     if options.verbose:
-        print "os.environ[\"PYTHONPATH\"] == %s" % os.environ["PYTHONPATH"]
+        print("os.environ[\"PYTHONPATH\"] == %s" % os.environ["PYTHONPATH"])
 
     if sys.platform == "darwin":
         if not have_DYLD_LIBRARY_PATH:
@@ -635,28 +638,28 @@
         for path in NS3_MODULE_PATH:
             os.environ["DYLD_LIBRARY_PATH"] += ":" + path
         if options.verbose:
-            print "os.environ[\"DYLD_LIBRARY_PATH\"] == %s" % os.environ["DYLD_LIBRARY_PATH"]
+            print("os.environ[\"DYLD_LIBRARY_PATH\"] == %s" % os.environ["DYLD_LIBRARY_PATH"])
     elif sys.platform == "win32":
         if not have_PATH:
             os.environ["PATH"] = ""
         for path in NS3_MODULE_PATH:
             os.environ["PATH"] += ';' + path
         if options.verbose:
-            print "os.environ[\"PATH\"] == %s" % os.environ["PATH"]
+            print("os.environ[\"PATH\"] == %s" % os.environ["PATH"])
     elif sys.platform == "cygwin":
         if not have_PATH:
             os.environ["PATH"] = ""
         for path in NS3_MODULE_PATH:
             os.environ["PATH"] += ":" + path
         if options.verbose:
-            print "os.environ[\"PATH\"] == %s" % os.environ["PATH"]
+            print("os.environ[\"PATH\"] == %s" % os.environ["PATH"])
     else:
         if not have_LD_LIBRARY_PATH:
             os.environ["LD_LIBRARY_PATH"] = ""
         for path in NS3_MODULE_PATH:
-            os.environ["LD_LIBRARY_PATH"] += ":" + path
+            os.environ["LD_LIBRARY_PATH"] += ":" + str(path)
         if options.verbose:
-            print "os.environ[\"LD_LIBRARY_PATH\"] == %s" % os.environ["LD_LIBRARY_PATH"]
+            print("os.environ[\"LD_LIBRARY_PATH\"] == %s" % os.environ["LD_LIBRARY_PATH"])
 
 #
 # Short note on generating suppressions:
@@ -756,7 +759,7 @@
         cmd = path_cmd
 
     if options.verbose:
-        print "Synchronously execute %s" % cmd
+        print("Synchronously execute %s" % cmd)
 
     start_time = time.time()
     proc = subprocess.Popen(cmd, shell = True, cwd = directory, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
@@ -778,8 +781,8 @@
         retval = 2
     
     if options.verbose:
-        print "Return code = ", retval
-        print "stderr = ", stderr_results
+        print("Return code = ", retval)
+        print("stderr = ", stderr_results)
 
     return (retval, stdout_results, stderr_results, elapsed_time)
 
@@ -947,7 +950,7 @@
             #
             if job.is_skip:
                 if options.verbose:
-                    print "Skip %s" % job.shell_command
+                    print("Skip %s" % job.shell_command)
                 self.output_queue.put(job)
                 continue
 
@@ -956,7 +959,7 @@
             #
             else:
                 if options.verbose:
-                    print "Launch %s" % job.shell_command
+                    print("Launch %s" % job.shell_command)
 
                 if job.is_example or job.is_pyexample:
                     #
@@ -983,12 +986,12 @@
                 job.set_elapsed_time(et)
 
                 if options.verbose:
-                    print "returncode = %d" % job.returncode
-                    print "---------- begin standard out ----------"
-                    print standard_out
-                    print "---------- begin standard err ----------"
-                    print standard_err
-                    print "---------- end standard err ----------"
+                    print("returncode = %d" % job.returncode)
+                    print("---------- begin standard out ----------")
+                    print(standard_out)
+                    print("---------- begin standard err ----------")
+                    print(standard_err)
+                    print("---------- end standard err ----------")
 
                 self.output_queue.put(job)
 
@@ -1047,30 +1050,31 @@
         #
         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"
+                waf_cmd = sys.executable + " waf --target=test-runner"
             else:
-                waf_cmd = "./waf --target=test-runner"
+                waf_cmd = sys.executable + " waf --target=test-runner"
         elif len(options.example):
-            if sys.platform == "win32":
-                waf_cmd = "waf --target=%s" % os.path.basename(options.example)
+            if sys.platform == "win32": #Modify for windows
+                waf_cmd = sys.executable + " waf --target=%s" % os.path.basename(options.example)
             else:
-                waf_cmd = "./waf --target=%s" % os.path.basename(options.example)
+                waf_cmd = sys.executable + " waf --target=%s" % os.path.basename(options.example)
 
         else:
-            if sys.platform == "win32":
-                waf_cmd = "waf"
+            if sys.platform == "win32": #Modify for windows
+                waf_cmd = sys.executable + " waf"
             else:
-                waf_cmd = "./waf"
+                waf_cmd = sys.executable + " waf"
 
         if options.verbose:
-            print "Building: %s" % waf_cmd
+            print("Building: %s" % waf_cmd)
 
         proc = subprocess.Popen(waf_cmd, shell = True)
         proc.communicate()
         if proc.returncode:
-            print >> sys.stderr, "Waf died. Not running tests"
+            print("Waf died. Not running tests", file=sys.stderr)
             return proc.returncode
 
+
     #
     # Dynamically set up paths.
     #
@@ -1084,7 +1088,7 @@
         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")
     else:
-        print >> sys.stderr, 'The build status file was not found.  You must do waf build before running test.py.'
+        print('The build status file was not found.  You must do waf build before running test.py.', file=sys.stderr)
         sys.exit(2)
 
     #
@@ -1154,7 +1158,7 @@
     if options.kinds:
         path_cmd = os.path.join("utils", test_runner_name + " --print-test-type-list")
         (rc, standard_out, standard_err, et) = run_job_synchronously(path_cmd, os.getcwd(), False, False)
-        print standard_out
+        print(standard_out.decode())
 
     if options.list:
         if len(options.constrain):
@@ -1164,20 +1168,22 @@
         (rc, standard_out, standard_err, et) = run_job_synchronously(path_cmd, os.getcwd(), False, False)
         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(('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\"\'')))
             return
+        if isinstance(standard_out, bytes):
+            standard_out = standard_out.decode()
         list_items = standard_out.split('\n')
         list_items.sort()
-        print "Test Type    Test Name"
-        print "---------    ---------"
+        print("Test Type    Test Name")
+        print("---------    ---------")
         for item in list_items:
             if len(item.strip()):
-                print item
+                print(item)
         example_names_original.sort()
         for item in example_names_original:
-                print "example     ", item
-        print
+                print("example     ", item)
+        print()
 
     if options.kinds or options.list:
         return
@@ -1248,10 +1254,12 @@
         # See if this is a valid test suite.
         path_cmd = os.path.join("utils", test_runner_name + " --print-test-name-list")
         (rc, suites, standard_err, et) = run_job_synchronously(path_cmd, os.getcwd(), False, False)
+        if isinstance(suites, bytes):
+            suites = suites.decode()
         if options.suite in suites.split('\n'):
             suites = options.suite + "\n"
         else:
-            print >> sys.stderr, 'The test suite was not run because an unknown test suite name was requested.'
+            print('The test suite was not run because an unknown test suite name was requested.', file=sys.stderr)
             sys.exit(2)
 
     elif len(options.example) == 0 and len(options.pyexample) == 0:
@@ -1272,6 +1280,8 @@
     # even in the case of a single suite to avoid having two process the
     # results in two different places.
     #
+    if isinstance(suites, bytes):
+        suites = suites.decode()
     suite_list = suites.split('\n')
 
     #
@@ -1283,6 +1293,8 @@
         # Get a list of all of the performance tests.
         path_cmd = os.path.join("utils", test_runner_name + " --print-test-name-list --test-type=%s" % "performance")
         (rc, performance_tests, standard_err, et) = run_job_synchronously(path_cmd, os.getcwd(), False, False)
+        if isinstance(performance_tests, bytes):
+            performance_tests = performance_tests.decode()
         performance_test_list = performance_tests.split('\n')
 
         # Remove any performance tests from the suites list.
@@ -1294,8 +1306,8 @@
     # run them in parallel.  We're going to spin up a number of worker threads
     # that will run our test jobs for us.
     #
-    input_queue = Queue.Queue(0)
-    output_queue = Queue.Queue(0)
+    input_queue = queue.Queue(0)
+    output_queue = queue.Queue(0)
 
     jobs = 0
     threads=[]
@@ -1374,7 +1386,7 @@
                 job.set_is_skip(True)
 
             if options.verbose:
-                print "Queue %s" % test
+                print("Queue %s" % test)
 
             input_queue.put(job)
             jobs = jobs + 1
@@ -1428,7 +1440,7 @@
                     test_name = os.path.basename(test_name)
 
                     # Don't try to run this example if it isn't runnable.
-                    if ns3_runnable_programs_dictionary.has_key(test_name):
+                    if test_name in ns3_runnable_programs_dictionary:
                         if eval(do_run):
                             job = Job()
                             job.set_is_example(True)
@@ -1445,7 +1457,7 @@
                                 job.set_is_skip (True)
 
                             if options.verbose:
-                                print "Queue %s" % test
+                                print("Queue %s" % test)
 
                             input_queue.put(job)
                             jobs = jobs + 1
@@ -1457,8 +1469,8 @@
         example_name = "%s%s-%s%s" % (APPNAME, VERSION, options.example, BUILD_PROFILE_SUFFIX)
 
         # Don't try to run this example if it isn't runnable.
-        if not ns3_runnable_programs_dictionary.has_key(example_name):
-            print "Example %s is not runnable." % example_name
+        if example_name not in ns3_runnable_programs_dictionary:
+            print("Example %s is not runnable." % example_name)
         else:
             #
             # If you tell me to run an example, I will try and run the example
@@ -1478,7 +1490,7 @@
             job.set_build_path(options.buildpath)
 
             if options.verbose:
-                print "Queue %s" % example_name
+                print("Queue %s" % example_name)
 
             input_queue.put(job)
             jobs = jobs + 1
@@ -1545,7 +1557,7 @@
                                 job.set_is_skip (True)
 
                             if options.verbose:
-                                print "Queue %s" % test
+                                print("Queue %s" % test)
 
                             input_queue.put(job)
                             jobs = jobs + 1
@@ -1555,7 +1567,7 @@
         # Don't try to run this example if it isn't runnable.
         example_name = os.path.basename(options.pyexample)
         if example_name not in ns3_runnable_scripts:
-            print "Example %s is not runnable." % example_name
+            print("Example %s is not runnable." % example_name)
         else:
             #
             # If you tell me to run a python example, I will try and run the example
@@ -1572,7 +1584,7 @@
             job.set_build_path("")
 
             if options.verbose:
-                print "Queue %s" % options.pyexample
+                print("Queue %s" % options.pyexample)
 
             input_queue.put(job)
             jobs = jobs + 1
@@ -1636,9 +1648,9 @@
                 status = "CRASH"
 
         if options.duration or options.constrain == "performance":
-            print "%s (%.3f): %s %s" % (status, job.elapsed_time, kind, job.display_name)
+            print("%s (%.3f): %s %s" % (status, job.elapsed_time, kind, job.display_name))
         else:
-            print "%s: %s %s" % (status, kind, job.display_name)
+            print("%s: %s %s" % (status, kind, job.display_name))
 
         if job.is_example or job.is_pyexample:
             #
@@ -1766,23 +1778,23 @@
     #
     # Print a quick summary of events
     #
-    print "%d of %d tests passed (%d passed, %d skipped, %d failed, %d crashed, %d valgrind errors)" % (passed_tests, 
-        total_tests, passed_tests, skipped_tests, failed_tests, crashed_tests, valgrind_errors)
+    print("%d of %d tests passed (%d passed, %d skipped, %d failed, %d crashed, %d valgrind errors)" % (passed_tests, 
+        total_tests, passed_tests, skipped_tests, failed_tests, crashed_tests, valgrind_errors))
     #
     # Repeat summary of skipped, failed, crashed, valgrind events 
     #
     if skipped_testnames:
         skipped_testnames.sort()
-        print 'List of SKIPped tests: %s' % '\n    '.join(map(str, skipped_testnames))
+        print('List of SKIPped tests:\n    %s' % '\n    '.join(map(str, skipped_testnames)))
     if failed_testnames:
         failed_testnames.sort()
-        print 'List of FAILed tests: %s' % '\n    '.join(map(str, failed_testnames))
+        print('List of FAILed tests:\n    %s' % '\n    '.join(map(str, failed_testnames)))
     if crashed_testnames:
         crashed_testnames.sort()
-        print 'List of CRASHed tests: %s' % '\n    '.join(map(str, crashed_testnames))
+        print('List of CRASHed tests:\n    %s' % '\n    '.join(map(str, crashed_testnames)))
     if valgrind_testnames:
         valgrind_testnames.sort()
-        print 'List of VALGR failures: %s' % '\n    '.join(map(str, valgrind_testnames))
+        print('List of VALGR failures:\n    %s' % '\n    '.join(map(str, valgrind_testnames)))
     #
     # The last things to do are to translate the XML results file to "human
     # readable form" if the user asked for it (or make an XML file somewhere)
@@ -1800,25 +1812,25 @@
     # Let the user know if they need to turn on tests or examples.
     #
     if not ENABLE_TESTS or not ENABLE_EXAMPLES:
-        print
+        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
+            print('***  Note: ns-3 tests are currently disabled. Enable them by adding')
+            print('***  "--enable-tests" to ./waf 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
+            print('***  Note: ns-3 examples are currently disabled. Enable them by adding')
+            print('***  "--enable-examples" to ./waf configure or modifying your .ns3rc file.')
+            print()
 
     #
     # Let the user know if they tried to use valgrind but it was not
     # present on their machine.
     #
     if options.valgrind and not VALGRIND_FOUND:
-        print
-        print '***  Note: you are trying to use valgrind, but valgrind could not be found'
-        print '***  on your machine.  All tests and examples will crash or be skipped.'
-        print
+        print()
+        print('***  Note: you are trying to use valgrind, but valgrind could not be found')
+        print('***  on your machine.  All tests and examples will crash or be skipped.')
+        print()
 
     #
     # If we have been asked to retain all of the little temporary files, we
diff -Naur ns-3.23/utils/bench-packets.cc ns-3.24/utils/bench-packets.cc
--- ns-3.23/utils/bench-packets.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/utils/bench-packets.cc	2015-09-15 11:18:44.000000000 -0700
@@ -17,6 +17,7 @@
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
+#include "ns3/command-line.h"
 #include "ns3/system-wall-clock-ms.h"
 #include "ns3/packet.h"
 #include "ns3/packet-metadata.h"
@@ -24,6 +25,8 @@
 #include <sstream>
 #include <string>
 #include <stdlib.h> // for exit ()
+#include <limits>
+#include <algorithm>
 
 using namespace ns3;
 
@@ -34,6 +37,10 @@
   BenchHeader ();
   bool IsOk (void) const;
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
@@ -72,6 +79,9 @@
 {
   static TypeId tid = TypeId (GetTypeName ().c_str ())
     .SetParent<Header> ()
+    .SetGroupName ("Utils")
+    .HideFromDocumentation ()
+    .AddConstructor<BenchHeader <N> > ()
     ;
   return tid;
 }
@@ -124,11 +134,16 @@
     oss << "anon::BenchTag<" << N << ">";
     return oss.str ();
   }
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void) {
     static TypeId tid = TypeId (GetName ().c_str ())
       .SetParent<Tag> ()
-      .AddConstructor<BenchTag > ()
+      .SetGroupName ("Utils")
       .HideFromDocumentation ()
+      .AddConstructor<BenchTag<N> > ()
       ;
     return tid;
   }
@@ -241,19 +256,77 @@
   }
 }
 
+static void
+benchFragment (uint32_t n)
+{
+  BenchHeader<25> ipv4;
+  BenchHeader<8> udp;
+
+  for (uint32_t i= 0; i < n; i++) {
+    Ptr<Packet> p = Create<Packet> (2000);
+    p->AddHeader (udp);
+    p->AddHeader (ipv4);
+
+    Ptr<Packet> frag0 = p->CreateFragment (0, 250);
+    Ptr<Packet> frag1 = p->CreateFragment (250, 250);
+    Ptr<Packet> frag2 = p->CreateFragment (500, 500);
+    Ptr<Packet> frag3 = p->CreateFragment (1000, 500);
+    Ptr<Packet> frag4 = p->CreateFragment (1500, 500);
+
+    /* Mix fragments in different order */
+    frag2->AddAtEnd (frag3);
+    frag4->AddAtEnd (frag1);
+    frag2->AddAtEnd (frag4);
+    frag0->AddAtEnd (frag2);
+
+    frag0->RemoveHeader (ipv4);
+    frag0->RemoveHeader (udp);
+  }
+}
 
 static void
-runBench (void (*bench) (uint32_t), uint32_t n, char const *name)
+benchByteTags (uint32_t n)
+{
+  for (uint32_t i = 0; i < n; i++)
+    {
+      Ptr<Packet> p = Create<Packet> (2000);
+      for (uint32_t j = 0; j < 100; j++)
+        {
+          BenchTag<0> tag;
+          p->AddByteTag (tag);
+        }
+      Ptr<Packet> q = Create<Packet> (1000);
+
+      // This should trigger adjustment of all byte tags
+      q->AddAtEnd (p);
+    }
+}
+
+static uint64_t
+runBenchOneIteration (void (*bench) (uint32_t), uint32_t n)
 {
   SystemWallClockMs time;
   time.Start ();
   (*bench) (n);
   uint64_t deltaMs = time.End ();
+  return deltaMs;
+}
+
+
+static void
+runBench (void (*bench) (uint32_t), uint32_t n, uint32_t minIterations, char const *name)
+{
+  uint64_t minDelay = std::numeric_limits<uint64_t>::max();
+  for (uint32_t i = 0; i < minIterations; i++)
+    {
+      uint64_t delay = runBenchOneIteration(bench, n);
+      minDelay = std::min(minDelay, delay);
+    }
   double ps = n;
   ps *= 1000;
-  ps /= deltaMs;
+  ps /= minDelay;
   std::cout << ps << " packets/s"
-            << " (" << deltaMs << " ms elapsed)\t"
+            << " (" << minDelay << " ms elapsed)\t"
             << name
             << std::endl;
 }
@@ -261,21 +334,16 @@
 int main (int argc, char *argv[])
 {
   uint32_t n = 0;
-  while (argc > 0) {
-      if (strncmp ("--n=", argv[0],strlen ("--n=")) == 0) 
-        {
-          char const *nAscii = argv[0] + strlen ("--n=");
-          std::istringstream iss;
-          iss.str (nAscii);
-          iss >> n;
-        }
-      if (strncmp ("--enable-printing", argv[0], strlen ("--enable-printing")) == 0)
-        {
-          Packet::EnablePrinting ();
-        }
-      argc--;
-      argv++;
-  }
+  uint32_t minIterations = 1;
+  bool enablePrinting = false;
+
+  CommandLine cmd;
+  cmd.Usage ("Benchmark Packet class");
+  cmd.AddValue ("n", "number of iterations", n);
+  cmd.AddValue ("min-iterations", "number of subiterations to minimize iteration time over", minIterations);
+  cmd.AddValue ("enable-printing", "enable packet printing", enablePrinting);
+  cmd.Parse (argc, argv);
+
   if (n == 0)
     {
       std::cerr << "Error-- number of packets must be specified " <<
@@ -285,10 +353,12 @@
   std::cout << "Running bench-packets with n=" << n << std::endl;
   std::cout << "All tests begin by adding UDP and IPv4 headers." << std::endl;
 
-  runBench (&benchA, n, "Copy packet, remove headers");
-  runBench (&benchB, n, "Just add headers");
-  runBench (&benchC, n, "Remove by func call");
-  runBench (&benchD, n, "Intermixed add/remove headers and tags");
+  runBench (&benchA, n, minIterations, "Copy packet, remove headers");
+  runBench (&benchB, n, minIterations, "Just add headers");
+  runBench (&benchC, n, minIterations, "Remove by func call");
+  runBench (&benchD, n, minIterations, "Intermixed add/remove headers and tags");
+  runBench (&benchFragment, n, minIterations, "Fragmentation and concatenation");
+  runBench (&benchByteTags, n, minIterations, "Benchmark byte tags");
 
   return 0;
 }
diff -Naur ns-3.23/utils/bench-simulator.cc ns-3.24/utils/bench-simulator.cc
--- ns-3.23/utils/bench-simulator.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/utils/bench-simulator.cc	2015-09-15 11:18:44.000000000 -0700
@@ -80,6 +80,8 @@
   double init, simu;
 
   DEB ("initializing");
+  m_count = 0;
+
 
   time.Start ();
   for (uint32_t i = 0; i < m_population; ++i)
@@ -105,14 +107,12 @@
        std::setw (g_fwidth) << (m_count / simu) <<
        std::setw (g_fwidth) << (simu / m_count));
 
-  // Clean up scheduler
-  Simulator::Destroy ();
 }
 
 void
 Bench::Cb (void)
 {
-  if (m_count > m_total) 
+  if (m_count >= m_total) 
     {
       return;
     }
@@ -271,4 +271,7 @@
 
   LOG ("");
   return 0;
+
+  Simulator::Destroy ();
+
 }
diff -Naur ns-3.23/utils/print-introspected-doxygen.cc ns-3.24/utils/print-introspected-doxygen.cc
--- ns-3.23/utils/print-introspected-doxygen.cc	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/utils/print-introspected-doxygen.cc	2015-09-15 11:18:44.000000000 -0700
@@ -18,6 +18,12 @@
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
 
+/**
+ * \file
+ * \ingroup utils
+ * Generate documentation from the TypeId database.
+ */
+
 #include <iostream>
 #include <algorithm>
 #include <map>
@@ -71,6 +77,9 @@
   std::string sectionStart;        ///< start of a section or group
   std::string seeAlso;             ///< Reference to other docs
   std::string subSectionStart;     ///< start a new subsection
+  std::string templateArgument;    ///< template argument
+  std::string templArgExplicit;    ///< template argument required
+  std::string templArgDeduced;     ///< template argument deduced from function
   std::string variable;            ///< variable or class member
 
 } // anonymous namespace
@@ -118,6 +127,9 @@
       sectionStart                 = "Section ";
       seeAlso                      = "  See: ";
       subSectionStart              = "Subsection ";
+      templateArgument             = "Template Arg: ";
+      templArgDeduced              = "[deduced]  ";
+      templArgExplicit             = "[explicit] ";
       variable                     = "Variable: ";
     }
   else
@@ -153,6 +165,9 @@
       sectionStart                 = "\\ingroup ";
       seeAlso                      = "\\see ";
       subSectionStart              = "\\addtogroup ";
+      templateArgument             = "\\tparam ";
+      templArgDeduced              = "\\deduced ";
+      templArgExplicit             = "\\explicit ";
       variable                     = "\\var ";
     }
 }  // SetMarkup ()
@@ -717,6 +732,7 @@
      <<   functionStart << "bool"
      <<     qualClass << "::GetAccessor (T & value) const\n"
      <<   "Access the " << name << " value as type " << codeWord << "T.\n"
+     <<   templateArgument << "T " << templArgExplicit << "The type to cast to.\n"
      <<   argument << "[out] value The " << name << " value, as type "
      <<     codeWord << "T.\n"
      <<   returns << "true.\n"
@@ -1116,7 +1132,7 @@
  * The container elements must support \c operator< (for \c std::sort)
  * and \c operator== (for \c std::unique).
  *
- * \tparam T The container type.
+ * \tparam T \deduced The container type.
  * \param t The container.
  */
 template <typename T>
diff -Naur ns-3.23/utils/tests/TestBase.py ns-3.24/utils/tests/TestBase.py
--- ns-3.23/utils/tests/TestBase.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/utils/tests/TestBase.py	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,125 @@
+#! /usr/bin/env python
+## -*- 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
+#
+
+from __future__ import print_function
+import sys
+import subprocess
+import argparse
+import os
+
+def print_case_in_file(case_string, out):
+    for i in range(100):
+        print("-", end = '', file = out)
+    print(file=out)
+    print("running test case " + case_string, end='\n\n', file = out)
+    out.flush()
+
+def print_failed_cases(failed_cases):
+    print("\nFailed Cases:")
+    for case in failed_cases:
+        print(case)
+
+def print_cmds(cmds):
+    print('Commands to be executed:')
+    for cmd in cmds:
+        print(cmd.replace(sys.executable, ''))
+
+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 os.path.split(os.path.abspath('.'))[1] == 'tests' and os.path.split(os.path.abspath(os.pardir))[1] == 'utils':
+                os.chdir('../../')
+        else:
+            print('Error: Invalid working directory')
+            sys.exit(1)
+
+class TestBaseClass:
+    """
+        Generic class for testing tools based on provided commands and test cases.
+    """
+
+    def __init__(self, argv, desc, mode):
+        """
+            Provide input argument list, description and mode of the suite being executed.
+        """
+        self.my_env = os.environ
+        set_workdir()
+        self.my_env['LD_LIBRARY_PATH'] = os.getcwd() + "/build"
+        self.mode = mode
+        self.outfile = 'test-port-'+self.mode+'.out'
+        self.options = self.parseargs(argv , desc)
+
+    def parseargs(self, argv, desc):
+        """
+            Parses the commandline arguments
+        """
+        parser = argparse.ArgumentParser(description = desc)
+        parser.add_argument('-f', '--file', action='store', dest='out_file', default = self.outfile,
+                            metavar="FILE",
+                            help='File to be used for storing the command specific output (Default: '+self.outfile+')')
+        parser.add_argument('-c', action='store_true', dest='cmds', default=False,
+                            help='List out all the commands being tested')
+        parser.add_argument('-m', action='store_true', dest='mute', default=False,
+                            help='Sends only stderr output to FILE')
+        parser.add_argument('-x', '--customcmd', action='store', dest='custcmd', default = None,
+                            help='Enter a comma-separated list of commands to override the existing ones. NOT APPLICABLE FOR TEST-PY SUITE.')
+        return parser.parse_args(argv)
+
+    def override_cmds(self):
+        """
+            Can be used by importing suite to handle custom commands
+        """
+        return self.options.custcmd
+
+    def runtests(self, cmds):
+        """
+            Execute the tests.
+        """
+        if self.options.cmds:
+            print_cmds(cmds)
+            return
+
+        final_return = 0
+        total_tests = len(cmds)
+        passed = 0
+        progress = 0.0
+        failed_cases = []
+        with open(self.options.out_file, 'w') as out:
+            outstream = out
+            with open(os.devnull, 'w') as sink:
+                if self.options.mute:
+                    outstream = sink
+                for cmd in cmds:
+                    case_string = cmd.replace(sys.executable, '')
+                    print("running test case: " + case_string)
+                    print_case_in_file(case_string, out)
+                    progress += 1
+                    ret = subprocess.call(cmd, shell=True, env=self.my_env, stdout=outstream, stderr=out)
+                    if not ret:
+                        passed += 1
+                    else:
+                        final_return = 1
+                        failed_cases.append(case_string)
+                    print("[ %s out of %s ] test cases passed; Progress = %.2f%% \n" % (passed, total_tests, progress*100/total_tests))
+        if final_return != 0:
+            print_failed_cases(failed_cases)
+        else:
+            print("\nAll cases passed")
+        print ("Detailed output available in " + self.options.out_file, end='\n\n')
+        return final_return
diff -Naur ns-3.23/utils/tests/test-test.py ns-3.24/utils/tests/test-test.py
--- ns-3.23/utils/tests/test-test.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/utils/tests/test-test.py	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,121 @@
+#! /usr/bin/env python
+## -*- 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 test.py 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
+#      
+#   -h, --help            show this help message and exit
+#   -b BUILDPATH, --buildpath=BUILDPATH
+#                         specify the path where ns-3 was built (defaults to the
+#                         build directory for the current variant)
+#   -c KIND, --constrain=KIND
+#                         constrain the test-runner by kind of test
+#   -d, --duration        print the duration of each test suite and example
+#   -e EXAMPLE, --example=EXAMPLE
+#                         specify a single example to run (no relative path is
+#                         needed)
+#   -u, --update-data     If examples use reference data files, get them to re-
+#                         generate them
+#   -f FULLNESS, --fullness=FULLNESS
+#                         choose the duration of tests to run: QUICK, EXTENSIVE,
+#                         or TAKES_FOREVER, where EXTENSIVE includes QUICK and
+#                         TAKES_FOREVER includes QUICK and EXTENSIVE (only QUICK
+#                         tests are run by default)
+#   -g, --grind           run the test suites and examples using valgrind
+#   -k, --kinds           print the kinds of tests available
+#   -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
+#   -p PYEXAMPLE, --pyexample=PYEXAMPLE
+#                         specify a single python example to run (with relative
+#                         path)
+#   -r, --retain          retain all temporary files (which are normally
+#                         deleted)
+#   -s TEST-SUITE, --suite=TEST-SUITE
+#                         specify a single test suite to run
+#   -t TEXT-FILE, --text=TEXT-FILE
+#                         write detailed test results into TEXT-FILE.txt
+#   -v, --verbose         print progress and informational messages
+#   -w HTML-FILE, --web=HTML-FILE, --html=HTML-FILE
+#                         write detailed test results into HTML-FILE.html
+#   -x XML-FILE, --xml=XML-FILE
+#                         write detailed test results into XML-FILE.xml
+
+
+
+from __future__ import print_function
+from TestBase import TestBaseClass
+import sys
+
+def main(argv):
+    """
+        Prepares test cases and executes
+    """
+    test_cases = [
+      '',
+      '-h',
+      '--help',
+      '-b build/',
+      '--buildpath=build/',
+      '-c performance',
+      '--constrain=performance',
+      '-d',
+      '--duration',
+      '-e socket-options-ipv6',
+      '--example=socket-options-ipv6',
+      '-u',
+      '--update-data',
+      '-f EXTENSIVE --fullness=EXTENSIVE'
+      '-g',
+      '--grind',
+      '-l',
+      '--list',
+      '-m',
+      '--multiple',
+      '-n',
+      '--nowaf',
+      '-p first',
+      '--pyexample=first',
+      '-r',
+      '--retain',
+      '-s ns3-tcp-interoperability',
+      '--suite=ns3-tcp-interoperability',
+      '-t t_opt.txt',
+      '--text=t_opt.txt && rm -rf t_opt.txt',
+      '-v',
+      '--verbose',
+      '-w t_opt.html && rm -rf t_opt.html',
+      '--web=t_opt.html && rm -rf t_opt.html',
+      '--html=t_opt.html && rm -rf t_opt.html',
+      '-x t_opt.xml && rm -rf t_opt.xml',
+      '--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'
+    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)
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
\ No newline at end of file
diff -Naur ns-3.23/utils/tests/test-waf.py ns-3.24/utils/tests/test-waf.py
--- ns-3.23/utils/tests/test-waf.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/utils/tests/test-waf.py	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,195 @@
+#! /usr/bin/env python
+## -*- 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",
+        "--no32bit-scan",
+        "-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))
\ No newline at end of file
diff -Naur ns-3.23/utils/utils.h ns-3.24/utils/utils.h
--- ns-3.23/utils/utils.h	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/utils/utils.h	2015-09-15 11:18:44.000000000 -0700
@@ -3,7 +3,7 @@
  * \defgroup CheckStyle check-style.py
  *
  * The check-style.py script will test and reformat code according to the
- * ns-3 coding style posted at http://www.nsnam.org/codingstyle.html
+ * ns-3 coding style posted at https://www.nsnam.org/developers/contributing-code/coding-style/
  * It requires that you install 'uncrustify' 
  *
  * It has multiple levels of conformance:
diff -Naur ns-3.23/VERSION ns-3.24/VERSION
--- ns-3.23/VERSION	2015-05-13 11:05:26.000000000 -0700
+++ ns-3.24/VERSION	2015-09-15 11:23:43.000000000 -0700
@@ -1 +1 @@
-3.23
+3.24
diff -Naur ns-3.23/waf ns-3.24/waf
--- ns-3.23/waf	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/waf	2015-09-15 11:18:44.000000000 -0700
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 # encoding: ISO8859-1
-# Thomas Nagy, 2005-2012
+# Thomas Nagy, 2005-2015
 
 """
 Redistribution and use in source and binary forms, with or without
@@ -30,13 +30,15 @@
 POSSIBILITY OF SUCH DAMAGE.
 """
 
-import os, sys
+import os, sys, inspect
 
-VERSION="1.7.16"
-REVISION="9ca17eb492c97b689870b4ff9db75880"
+VERSION="1.8.12"
+REVISION="f00e5b53f6bbeab1384a38c9cc5d51f7"
+GIT="1427497785a594dedeaac09013db635791f068c4"
 INSTALL=''
-C1='#%'
-C2='#$'
+C1='#+'
+C2='#)'
+C3='#%'
 cwd = os.getcwd()
 join = os.path.join
 
@@ -53,8 +55,8 @@
 	print(('\033[91mError: %s\033[0m' % m))
 	sys.exit(1)
 
-def unpack_wafdir(dir):
-	f = open(sys.argv[0],'rb')
+def unpack_wafdir(dir, src):
+	f = open(src,'rb')
 	c = 'corrupt archive (%d)'
 	while 1:
 		line = f.readline()
@@ -65,13 +67,13 @@
 			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'))
+	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']:
+		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)
@@ -100,7 +102,7 @@
 	finally:
 		t.close()
 
-	for x in ['Tools', 'extras']:
+	for x in ('Tools', 'extras'):
 		os.chmod(join('waflib',x), 493)
 
 	if sys.hexversion<0x300000f:
@@ -127,8 +129,8 @@
 		pass
 
 def find_lib():
-	name = sys.argv[0]
-	base = os.path.dirname(os.path.abspath(name))
+	src = os.path.abspath(inspect.getfile(inspect.getmodule(err)))
+	base, name = os.path.split(src)
 
 	#devs use $WAFDIR
 	w=test(os.environ.get('WAFDIR', ''))
@@ -141,7 +143,7 @@
 		err('waf-light requires waflib -> export WAFDIR=/folder')
 
 	dirname = '%s-%s-%s' % (WAF, VERSION, REVISION)
-	for i in [INSTALL,'/usr','/usr/local','/opt']:
+	for i in (INSTALL,'/usr','/usr/local','/opt'):
 		w = test(i + '/lib/' + dirname)
 		if w: return w
 
@@ -151,7 +153,7 @@
 	if w: return w
 
 	#unpack
-	unpack_wafdir(dir)
+	unpack_wafdir(dir, src)
 	return dir
 
 wafdir = find_lib()
@@ -163,6 +165,6 @@
 	Scripting.waf_entry_point(cwd, VERSION, wafdir)
 
 #==>
-#BZh91AY&SYb6d  "dА I!  Ha\                  iM۾Q`:]e QWݜ,JUh7{n{JH7gsܜcVСnŚڹ)FdH"hݶ}Ts_cVvmjs l]   o;pWqVN*#%j^V 4#Jѷp!P@RR#% JQh4#$Ƈggu3jg(o>QsǺ{fH}O;|o{N[뇯-ש۴kvݛմURzЦ5NGZQGQL$ #%U%#%=Gmތ꬙|疚aS>^P$"yqx7bkh/ik%_w/WKzxמ]qy|=8*ٚ+1bo{U乽%ތ݃{Wi듳_N	G{sRŖRI^K݁τ6֨oyu=s;ݝ  р#%D EL!-ZjnrݶE;*v'/f; 7v 9^pzw׾}NIh8u9ha>fyw  }ڻԺ-u+yl/\=4Ծ֧:;yw}旷]7knl}4=]7bκf5#$bZmJ}wK\{'^'UnU4{mޫirEMlu>32P(#$qחy}ep>M˻ni﹮ )NS5;@.w7gx}AJ {3-}Z1C͍a-ۻ7qj\zw:{_v,t}Ϟ4t]U_KW޺Rz}݁w;ޭ^M@ @ &&#LiMh@cH# zS@ @!0CI@)	=MF$hCM   HBi 	Ҟ(Ԟ6(!   )DCRQ<$M44  z      $@&&	#A4=FLLښde=TFDhޤ2~b "H@4AhFSɢi#DO4zPzi40 [rIjƭnWY	%@b x|WY`z>/fLUŞk蛜M=J|Tg'92{15W͵_-Hm"H" V(:f{=Ns-Ԭ\D()<#%qZzDOYa҈I'ͮǺ; `!E*"#%1r	P("*5H &РȊ"*E,DRPHEn-miS]űhڽjV[k[$A	&Ț1-1JKLيZj`B%jTVH!	3Ce#%&0la(XiJ#$$dh)%*RZ0	eL(5BH6F)H6-EfSkYHId5%,TIJ٬TR͐#M@ƙĔhdRc,&dTaTHPE"A% , LPfCARKLH6"c&Rj	jAdXbąS P#2"M!D,LXM&RѤH$""1#%)*iSba$#%lFɡfH6AI$$JdQc$d	2Df#1̦l%DA4 I&d)L5M#%4"R4MjY#%$1)#$afRQQI"TCbLf44Fє6J!)DKjh(c$cLfRdHJQ	24S(EB2e%4P0HRl$P&FT3l6dIKHY1HhI4Ɇ5XHh	Mi!ٓF$iiIjLID3")H4X1I)d6L6KB+1YAdؠD2FiLe5*,Y#$LdJJ"ѤYi1Fd64H	bXґIi4M$aa"$i2%ٵR&ԛ060Y$I2RdYdi%2bj6dFhHѤ,!!,Xl	QM"U12R&5(PͨKQfIFclҰ4KLMM̦څZVERlSe24[hU%IY)LنFHJDXk*$fQDedRXRmZmQ4#$AZ6ņjCm%jl2% 1aJmMcQIVH[-6Va-eʚ&6Y-lڌ)ZSRmf&4&RTadȥ#$Im-5K#LJ0Ba# bbdfmI%2IRK3)4R(dH-,"ScYJiI06$2S5%&)I&M!`3b#%-#$f-JZhRke+lPYb)FB6(آ06ȑR"LmR4̈́)Fb5S&*6S&L͊DK	j&*e ,)42Q6Ԍ̚,(͐Q2XM2dk)*,JDE,TThU4dJ#%M" PdƂٲ	$Ԅe2JS!-	F$LڄE,0hTQFІI%L*J$l65Q&IPI)Dh	$U[!IIBQhM&U1LMeL!4EJK62(5c,21"ڍ,hddڥMELT[EZMl%a(	F3B"l0e-FV3h0lHU5+FcV2mR2!Ƣ(IJ2cYFm$bVJ)Y6#%F-mlT,"Je6EPdDډ"ZJ"+F-FEjV[e XE#$e(.JD&Tǻh>5Rrx1?;^!-"ajj'hrM6*`ti~O(>}/:S`<7q(9l	hZ2i?mTY1c3o0Ъy= ~ù'5E֠0i+%C߷qJrtjc[b-J!,E+9R鬞<)#~*UQ!`v>5'qܶMb/x.quTdJBV=6_[2?ÌKU#$]'.{X/'f`53S%CY}s!^eRLcj:6!E03c5#8oahBX,DgEni2RZJ/Q[œwXfb(ԑh6bwaBVׯNny{Lg/(d<V/UWHj0W,6ﮰyLxd#%,3h6ţ-2o&*Mor<_ÿ?H_z^QDo2`XK?>&YeBɈf*؄!*Z$LȌ~1t|C|Q͹h؏]:);)5bu|Zwo~|*ȝXI8T$>|5VD@H~uB%~\ҋ:mʱh|> f	WC&8CF{sah""ߛMޮ]urйqoͰ8"<K!`)e'D_m_jzڝbە)`F_{gVAHdW9X}}.HaUσ=6ed\"LDIRz9r	D1"jL~V+$uHX#'˂X"2VGAY8ɂ=/@~>VɱQCRwY7_LKPTRz^,b9VpY(3K`D?k{l<3`T塗dTD]JG/d*oUI)Gd%V1$yN`Q(1Hd^9j|ڇ2vtƦ[vipD}-]>ıGwgih>*QɗUp;#$@ֲhVqElǾN<BJYmIREyF#%̳y6㎭+:<~ Q˱v)B@TEeN(mrRp$^|1*pw<eJ>8W6s;~QOٳ?y|;M!8^3߆f*UxWuSRgSD3I:|/Rm?[D<OaIr\b GLWN'N<w3>c~uy8f_D8!sL($H")2GՐa7D'd#%af`k{h#%$	7Д۞')YW{}-^I	#qHdOϏ:uSqfiJ(yɮf}ǻC!nK{,rX߄=xTX"~{:]g\D3mÞO[q#%S+5{#%#%X]$Me(^kVNu"gt8Ûu}郌Y}qN;bSuiыO i#$+I݌|i\6&/֭PTGѹ~Q|W{?bgY|ZͿ5c_ߔe!E//l󴃔8`H`>P`ߗQ_OϛUP7	#$>,1u~`enLq&8?:|G`IID̞gSѷTx2(z^wϛzޮ\FpvBu$#O_ѻic~r0dEz^QFj}kY7Ǘl!'h}v;qq'Ay	lb@a{n(?^lr8Vi9@R̠MMRzvFoWn+Ղ ~	rq7%*[E9	v9ӷQ݅23-0H0j{xޮҐc1/d*Ӧc}||"ǪT{<8xs0O̠9}',<+p'k.B8'e{;OģÛyd	)v=VQD=Ky0~oseN.ct13ڕ𙅏gЏ&+Mbe=P"`{<MP@M4A<s#w&Tv.`z7IlD<U H"J%nf<#ǘ[	tX-M`q5OGTߌ3B|Q<U,dਈ#$1l²k#$bŒh#%Dbϒd_gɆh_%<?3s%>[6o/N1쌠n(Ȫj$z*,,V6{Qʕm[b"ZP`\ Ŕsbɕ hl֢=7N9߁-ļ턋t\"#O6v!2LzSTP*\k>6 jU(SyjfXzaS]ޱ.|`)Љs*1HHR@=|z%2^hI&\<fTJ=G+.+ߔ=U֧B]2@đN\tW#,@J7 v]dt>{Ͳn|&V(>6kq6^}<r)ݧdy9e.b"p`~ҚRTTfa/ӓ4yO>kv{7gb.w7C"7=rBN(o8r^Rz3:Ӈ9bwbm˙>Y6/a;(8<C]\~9te[?jb!ޓrES:A2|itPk:yz=|e;<	~^=x&	T<g^o#$3OFD=JRo1!m!(YZw]eQDAko	7mBa&˺$"dGأR03JY(E"]kw'Lzs*NN#3Ki䛪}8GB!ǎD'{#$ؙ+1;y1ϢY8XV i"Zn)HL:#%DS79A2myI#%3MmO#$fᨃLz;aֈe?M,VL|&0Զv֕'%K̑/c8iˢ#$}r߈RUB#%#%.IO;c88b\IpbPpeKaRV jDg,RQEͺJ " c%F¢j<hLZj,\}o4&%TYR1,*$|<WA#$S罐U~_4Lu>I82Qrͺ`TQGtJ[s{'$$>fx"yvGY6ҲL\WtsrY^*A曥D8!*jݓlaN~Ms[B9_.[}+A˔*)VgуY`rmPZAv=SU789b$nh$_< mI0p0-iWk)LݖToDp''Nvtf꜌aXf3'])6{w-q#$VG3B@:˻	uV[z~x}9FQt!J|m'הQ͖v:{y3U$OYTMKEX<H*R7PD7A0o𨦓q<WVK!*)Q:n|qO?~gmy$Rcx7/YǯCHw3KI%䦵-P|iAC#$Σ_fg#$vk{<>U#$AJ	BGM97yRⶈ-c^~i8~F vnˢ9hȷSÃ$k:TQM-m8{W=y黓ڭ%ȧqG5eߔ*#$~\C'p~VU4{:09mubu3RP #%W9mC͌h`tHֺ#$Wb%}?ȋpk)k_CxYQTʱ}NoNIJ=T4R&YJ$wv:K4#$FƓMQᜅV"`wםyBbtG+rGrU~ yAEuw3üΛ(suRtNrQ욧	@l(Y9:_ElzKt{LYcX9>ܣ8s>Gz;;zu(̏>:~{+ldI*q#$*Ƨ%(q0ꖍbf)EA?ZR1ɑTWvUQ(^:]$#6aJl2]xm=V,_dNU@HmDI;ꆯm|6G#DN56|\_GHQ{t=ed1HeӀfa֚!ïYݯ6ACwl}#x	$2wG8wxUU$9, `!0L<yꐋnz2_#%7F(#e_+ǬGsZ{NDBFN~-ڎ8hHE!~Mmˣ[uS+kۛ_UmZpgyzh+Hxy fD&X,KvF24 V8E{=(Ĩ 8g:(jC(Ykl'gsrϓ!9ρ CO|x`fo?j ?L ihLGssZ0qJnOPS_XE?ymզ;-NpQ+)Nva8-rg6_g_E wr}~sE;,oY^V8f9i/ӵА/Sp%zH=gw?,nIgUOvtc H#c?آˮҙ>4pb,<xQQeu@dâ#$<aLt1umU[@ve3<ř7soB`1ŴܵP[df{.W1Zu*3o:(A"p^ZazK] %GSx"MsOiχ] %m`	vgTcp`6	z	7<D-=0ǽHa#EX2WjtA,tϋ8iYXYCBT{g?dڳOTKN'sCoMjt=Olq?v-5U5@ΆD[CdP[W78_Jfz.W~z7ҷk(a_TOq?l-XϊVU-ZM |Q#$v!Gyff ͞;kbhwOK ʚU>~{&WN)'|m.R.CMSθ&Dp+7ECNql&`o(7JXcY0K	([;:p~&~LدeÄ8tgו[oj/AewL|٦Om}O[M'.J¡_8NoMq ĲL0Cw!ƱDiicKE#%iі̕2odfҊK5D185e&a~nt||.C` ^1;WH#%Tߜ?z}CwCݮJMI	#$uI?Ey?8㚶1H#$<DYRMS So;~)Y懿{5bBA%.1pqX/H[g}3TJ/Gm qIhahkrB&39.}ZHAuqsn-Ic*d];Sx\S^;#+0q&BQQ+#%њqDYS&9Ig]{׋cmN	fK/.:kYPe6ehE[nxR#$ʌQoSwL$(z;5/W#%ӫ¬op"csly	F;:>%n#%#$klFnG%fBdF7=; s-p@k&KҌVRE9fV?-sm|\[%So۳,-\s׾l/Ԑ;SUȹ5WI۰΀I\/8{O"Υx!֠*#%cDCώq!!`_'Џ^[h!i:#l#(s:,v;(aÆhzIbaõEH=!a;`#%#%[:̜|܈bP<׍5hPʙ B"H%:&H@h/99EU֜o1@o#$oKfHz_݃{F&cPD&_◀LJq\12C,u5^ܜY|sV1!ar<;CzC	`8!  c&"a$SA"<8!&fwJ,~p;UGnDVvJcRҫЛ\5Uj..2"b`*H [ue登KܷǷ=]m}K__Z:O5B֏Au專?V7UPm/P0|M3~am~˰*@;ju{Z=q4^Ew#$6"};#:D@+ J521T׵gsv%klú_YwX'#%#$F[W Jn}LY$-f(YJ-=T PN&Rv:370akpΏ+~TeyUNwyǯ"l&OÞ#;<*5՜i'^w_ba.<$?)ؿG1!90#$xz_zdd17Y(#%Thj,8pD@Ǥ#f4|^oSi}㗷$$lc+<6g6dagYcpMa70lA,(ثE(	c!aMY9SVE,8&'I@CapV3rih21&>w^)$櫺-12.]'{::+b Hł<%Ln#$vo'SF7'OWٳtSt^َZWw!\v:~ 30<TTYu#$T˞v&#$K#`|dR#$U>g/$ȹ[3.Yg9}%T`".^7]`Wnw$zքCF,C.n=(J񟸿nd7`L#% 0'Ot(Z~e/<:xHMmgeo|FHR1#Z?v!fQ˶m=f HMD$b@8HQg!UĴ5z!9r7jǔ:ȳ32PFH¦j0b2Lw[4SKd  DA**&a-d#%eҨT	7516Q0<R)"&ܵZHەJ$[#%Jn"*ZdMXh2g݋#$2;p::-hbW3m -3q`,o(7w|rn{>t~^lkd4og4^.ZoxA9ų-|>|4=Yt; ̋?bry;χGͤiwn}Z$/<'L98h3Q}OQDmLh?ՊޯY6NQ"s۷w|z˜952#%'%MZ% xe;c_^11pU r|w=8ʒim,mG#x 9~)~CfXWpv.X}N\}w}z~}ߪ9ǯɣkGIs0`YZu@<K=LG=qtw#$5<V*&gv7KJ	TiBP8!!`D?8*>Ԫ0{$ıiY~m>l9<&;wnʩL:Z\S)C-`J(BA	~4Gwb5$?zi#%$/gƽMϟɏW$t).Y	HJ5Iՠe6W1,JO1ƯM,oVx7kF#%?O}`J	8b)*[j	f+5͟+1(Qq& 6ő~XZ#<^k=`fX/>DP<=3w&#$!3$dj˵ѵWsWLq ;gH~dk#$($U$$?4Ap0a(h!!C}˶ZHHy-XSYiNĒϛ,]@1blO^Ճe5b׹?6|2@o`05?C0:WǪ5wC?%Y|sc!R^(}~m؇i)}3[}_{Y5Tֹ?ϕ	4B0>u#%fʙCg.x?	rxMG@H\$I?'aE`#c @<|ڶ	E޵[؃O6}`|g;N29a}#%`yqھBG~x(ud*7>A]xc{]SĳKm}τJ8u%]'>؏S,wGtWUbp~Zq*]B6${օ	`>JC[F( `Ãn<r$|;X"x8tq6͒˵74X(#$Bޑ0Mk]pKH/SZIO;}00ܥQW-re>?1m?I}	HK;wEB#$L]3ȐQ`Fi4?={ _<-VrL#2CZ)nGQx|四md"3}|K8siPٷ0!9i'n2Fb2co~<s/7gjA;ӆxFUTdOc?+q#%)h UHK^AKأV,\XJXCʏF]mT\ԩyw7qYNtqLoqiOԬGc<FׇHw~1#%1*X'^n]ؒ!? OGV6ұ^~uv'ʵ{zosg68gk+#$XnFhD岼z7B7p*+>K5[A[wןNs_C~7~+#k;Nz<.#G'#%)p#$ߩZ]4ف]#<n-J`>{jx.=L=\Oj==v`l7@:g--̭K8nQo9G<GP9DN`)%GUg|>^8˧X6*ڦmU-^[:Fvz~CS*+<aV4[xZȓ7Bk&gDw~1u36AvWf7}tm͆F	zlʚ}IeCUU]U=hs!b|߃&b(~`;{%\r`ݜ_ߺ.u~uJ%?A|VVj#%յc|`Vt?.Bsk#ʖu]BZG}7ACO5'ʪRjζ=$ܛky&]y;F裭L8tƱ]N%i>~xE!Ok2>>}_Fy`Qb+?Fu>߳%5woes9mJ%rOX;?%92{?_=3W8~gq!wBs9vdz?;Ϗ01<܇9'؞΍)vPOƈóhw㺫lpi˕rves=ɳ4f<$'B>v`~i׵Ur4yVC#%`BbfP@ 	7&Ѿ+/pׯ쓊s寫bG~ɒ\H}vu&#~ݕ~m#嗞UlxonʆYK r#%2$¨$}AWe|c$85Ba[@#%#$NR'QXIZ]	>=UDx:]fѸ~ӽ8-͹Xo$#$Siv!$|w=+ 4G"T~pQ_.3U[]|۫stҳ뜭$sSkԎc89a^V.;EuٿqEF>x#%G2=$8v[WX~ܺwxKjyTnt#$|Mxȁ#$t;Hu5Fu@Mi#$WhI/c>aٞ_T=cq#%j((dRۑFLSƯoe%hzw{qWQ\^_w6^XҡAqxnuW.#$w_]NߖoEaO0Ve8_I.X~2~GGgw+xAÍ1$5y!2ei?̹LV҅?*$t1#$I¶%	2܌SSRd)0)g|0F&ل"42dd\#%aL 1[RT)T<Fv,'ݞ;=!`93z}6XS?Y*_c79̜w=|EYTD:pL*r_|%_:#%{>2'тe-0gpxSmU,c21,dhқ7pC_[N㕺_r=Un1H99B8R\?vy;wyN1p[5}#I_~VB%9΢ꪘ]U[鄄c DEG|ޱgw ~:34UeF>nvӢo&#%?7(sg`00?ñݯ|?/#<pxl##SzyK8O	Wߣѐvj>XuQ9rLsCCs3ZbeB7Q,=6L/a#$RS)&\ F0k#%Š1Mͮ@#$,1A Ȍ!b N2ld$bjV%#%eˑb,F21q[Tîk.6&1ȑ1E޷`	[JJX0`PHSR)Ddݢ	2$bHE:ᒽm|.F fk<`eqCns34+1;IB`& @Nbqxd"j#%Rxd#%dv#$йr?؁Ir1/r[0SI˯u0%ApXOR!(bbYp"Ǘ{LĨp1]z3˧wGu|Q5u5=)ٯ]'v͔3~A%fγό0_O'4WOp٧N5!bA{4dPBx{<izSgig`Me!KO_L=U v\E!1\{^tbˢBDPǄ9EZPk\`;;;RlSmznɽI$Po*2&,߭"}jl_+rq}#.<y׈Ƃ=N@vu$.n3@VM2zil I$"(92Pt#	#%F+ EFߔ|URhel+.^/C>|1ux]x6e١{-lS34P Z~{9a- #$˖z`|/ԫUj4{mnխSF;2ZzƋTrabC>];%4JJ	czIۤbT7Eӣebu%A#%Nӥ˷]t-0%ڊmBe p!~##%2ҶFY?ԒgC .P_?v'jc_qE!BDXr޲}8J+bt&%x3cD\n?`+Ǭsm@ml|3$<	ϹY{]H-=Nkf)sIi40¸3?7WlDzY7:(d,g̽ԇxGa2^9,&\AAXbLCdio/0==;夰LF$R6bAr6	frhP$tӋ׮bomɕ j ",/C͙bRHk`JtIb{~8;-mMeEyTY(b  ``/. )( @Nn`SMIؤzH׿M~zRtzA398S`e^8;yiC0sA9xt"?obˌ-sEI4'2pk@zxCGo0]o>~Oq"nSDsMh#$|ebί떮$k)a!L[<2Y[SqxL$o@PxיaZhi1|e5êaXRp'-0mcCaFIC[Rpw\eGpBVB7%L4]U4Bbaڌ'&[e3y~L(L<&cR2ln8CQUN&Kg}ՅsS'lK)C0-*1w-ޟs{Ara̽qGS5C&7xή#mW3NX"lɰnBa;II~D>Û@m4N[`ѕG!Y!#%ry/DǜHKJ\Alq[wgLz'j#&\fw**'SֆUmSfaWMcXZa2ls#%o52LbK㩝|UxyL8牼l=g%k*)!'t{	ŧ:bu&(4x84#$eRF߃|&-l%;|iwU3sP>$?"RM×a9+ܝBo@L&{@lܿ^n'AhI$$j:tecmxƷ6m&=ri%Vknl7		a)YLg~:PY\)mpQ\s`}1JcWBnsNv䜉;oS7mꎽg#$Ռe6J4Vk<$=3#$}Tm/̜d#$"`4Kdu"1}X\#+pufF`Y9C5o:@Bu(@̡$D<kQ3(Jws6eh,/Z.~u4@Cf:r0=gQ]0zc??YmOjDOt<" SCB>U6qSȵ,2U'yjpdXt#JpaTCgA.##$oS5n2В`BdC}&Hb5!##V}y$kɜdKN2k[9殩qv'U|fl̲Ti/9jIz}Rwp|>MYU&U?ܭ3oUjyvzaChK<BБ7m4eCPM!UWV`/*ά(/|vS|t5xNP;CQ7dBbA	Cj"nQs`۳.#%V]ʶ_hT(=GISw,q2J'ЪC,MwhQ #_4'O4p+A]徴`,OU|-ώ?Y~G۲AʩR:ZuX6mp|suhޕ\ٷVqr[=L	7;PNnْF#=!@#.>=}U0I6*.`"IfDLrj4^!sSX}aQ@}~оUfOF<#ے< #ʿ+X0.G:N똲ύ;_5aæ]i7kζU]|iPt">KbIjEGtE\ˢCi#%q:qܖD$'#4uh6b8lf6ZI`6B5!"/Jmᝌ3Ȃ#%IH_@'us<|#G&#%x"T)v:qY?S=֨=y:4|t0?OBޛ܆o,ixZ*tXoEG[#$xzC?zN<>\'hƺn8Kb%m#$ko܊;OF#oBRO",uGS9$$Prǭ889$v#FWj^?iU4j}iٲ{ٔe낐8oFJw2.ϰM;6;Ď.Lw#~dY;{_·e8~oDˀ^hׯFDE#%5闦$3[)|蜳#E>#$+4ײUp*%NIA?B$q|C4q|G*L,CbfME͐XXd6`+MNDr=q!;B:k"B}竞-֔ےߏX['dO,NkFqGB8(~8Ly`ϯ_^_c2?n/CSXNE?>Ǆvͨet^k?qɧ	]usfo{ @$AE$75,OF]&AO#$am>nցGxxcg\'9vɵ۰]8ZsP\"$Q*Rhqa#(XعW<6Cף͸*zн蔌;^1)c}aΪǖ[Kgݘ}I8y~rSZl}Oin4I¡t|.1&s]8.$ls&.Qk3|wJ0(RWf$OWI}2L3fVlDxp܂R<Tgh'ejjͤ}ULo8:FvST,bM)ݣ|wH5M>Oddm(͏%y;x/׵]D!ǜ_z!w,$܏^c|<s=;Ft[m&D-}j8ǳ;[IvF"2la;-`-"!fbH-BI;lO	gfrܾn]GX4εWtn*Dp翟5ѴsgXͺG;(0XEo.|N!ۙ.gϤƒ^ݧ :*(̑N'<Fwƃi-#8߳s-rn9.&˨S&S<Êky/do͝=en-9{>Đ[Mq=y+H+jFȾs~#$ڠߝP;a<UF)Ob-Dxdabt=y0]nEɅd23 Y	sܑ8v>#%{mx}W0ۥIưϋO8&;mVxAle8""[0I]G訿Lְ&VaЍ9TN3?>O	!(wum߱s'"ݴ&w6{7a?#-pSB:edFHJ^4DUbYv-g6lg@"}|0u	z֤<9a] .U^.*m!}IUHW84?Y+Ҷ]mw*8RTl#$xUXd[I)'c);_	UjTDU^|ltYMzkp,+_<-`UPg%Q#%#$/DҟMX)#%[IԲaH5>5:_-5_)a~MeZⷫWdE^fAf!Q2ѱN<	}&_znsxus)oO#'ߝj~eE^	=	ș%h_|gD00f+QdC5VMq.wd03#%.G/vo}(Sjum0Q#%%3P	N,CeCg+n.#%̢+]Sфب[ɝttESzTL5XVc]aH+o<792TqXJ|uŖzmTg[8˘q}scQ#%0v#G'.dˋ|sjxyG4yh8ժx;Zpsc1g!t<)cMyGGXZhΏC#%\JYJ(κe..Kh֢pxpZ׺FjՃZqFTWqnO}qfuG"f<^2I]-iz-+{7]<|>XܺM˵Rc<Zlth#$><#$Sjmv4#%$QZ[UJ(hM,|׬j,n{a]nxne˭YX%ZYuѢ)mi78}q(l}C̽]>{In{$+y(F{d*)LjLrm-FKt1F{UEY8-tϨZvtZ&֋>y<κ7OI1&:dSN&ΜzWѺwJHdW[!|Rp3݃hAsl+6!_OLbYʸތudɆ?s58,_t:iX1kү{]΢o#Dfv.{;eoX#$p:힥`Z(qB<Y+1W	ͅaCK呮@b]Eou^17Yrc٩ u^rySe\40aStppS3"7	i\1rZWI!*`$Xpt_{!.-;"d d:Dpzk;i&dsL<Q6HN̽:M>x@)%W_Ro;S%uö 6Xk*ɮ\sPR#%vTm+!lfa}VbȕB;\'HSzuw1-Na>[]jyx/&~Yyk4%!tޏetx[Ip#!+vh+^~D(~9Bԡ%UMNMsZkpug+sZ]8N\nsZQ&jihJ5CBxvv_O]̑Ǆ_YW* (ʉ|#mׂ0Ǯ9e8᫐+9e(q,n3^f7T˅rEMuRҘ;?ɏA#%Ec#% LV.V|prrS.pS~OOkpG%kD]IP"CcQZrNӬ%Ʃkz<DY٪oN{`6vҳ,P(f6Qq.}͎&U+鈎=J4e.b:pE+ͥybPH]V(h(E-@*0{Εn<k]}?8cs	=!Jb; 05xVDUd/\)6HqpuRl4YݎՃOGF0t>"seIdC_:UoXS#$i	$.L^YIUU 7ezpp>3sIڹX;|<t啑բYFֲ+d`@E3U#$~ֿ4X	{S@o)i!*\N[7n/kj>׸JMTaAmXsMTڶ[˪D+ouuA_W>SntsȊw1r}5aT_umYU+I/9YU:QIrW-Ig(	Qf@d(nk}9:w#M<3옜X29B#%n׳#q%v.88른D("#%j^{L9tUu\Q-]uR*q2y_= X	Qs=J0镮`ES	+7^&}GX3tnWTq$狹jVQ!@tIwNsKo_'.Y/Kr)?{E7'kLJ%M8J=OoTֺㆆA)pY'Eyms#%J#$z b [zœF՘;d.ܔOJYosמ_پsz2==@o2cbk	hk?bM}BIpr|b72zペMn dCr/ga5TNce8l뎓#G[˵\^``!n"2f3hmV9=ׇ5K'i|LĶ%O_ҕ|\shը|l8ui#Ttv]x8$F]λNFϺ>Ei{tO6HO-v9<xG'6?`ٙ	?"8tH+ezk@3yrIT-287L8N ~#$gJ][)b	pUphUfWleUCPH]15I;SHqS"]3 {ןwd{Kt;;CՓvۺ\C!A}1-0tidH$E;q=-mZI	)(;m{:o@#% IҮ*%=7Kཱٮ#$@z,<:@ EPuv 늘UM#$FpV4X^n.`Vz:^0ÚS>Xj,H͖NhHC~HH5TX	OwHOܟB~Q:DJPq. ^ʷ<UیC˸<l]<KlC$JEJr=/;#%f@\l[-)6C$QB~Hq1WH+2T#%Q7gByAތk7SSazCۍ&GցJjǐuX-D#$hDTBdUmjvK@B91f[`G{WXϞfۙA$1$H@3_jIGٕiʨr>zw2| DH@w-==dLk-HX# `(slRSx	5A!TJ=lFp4U	!ff4t$+D#%&	|*ުisD<hES-Bo7Q#%<,Kpm >M0$rhޑpcR^;YZ]qH @飔9Ntp,y#|2NfD1">2S9A: CaI%pS2U;[nLJ*M=*s<5c_ֈc.s.9D(-[ F!GԸmP]-'0iji>d4#$aD!/<N((?fEhTMG?m<,P `ȂJKRtU8ȿteCŐ2 Q2Ab+u O!hb?~nkT@r V́TT9DIҿ[hQ^qzq3M3Ha[2!L3\{+YGvs˲HLۮ ;L2I}e+xh>ye,Q\Wz5iNwJ	/$Mp4Pa4HT#$!wc;DsKwhЁxwY&#$#%z﵇YVUω#0QwfLSw@a}nI:=5[ט4LCZB	F 'Ė;_Y7O; iZ(<>Lcsg/o@J#$$#%S5#%#$2.6PW"2?<71d)Y!9Ta&/bPmbG-*&sh>MlJ %ȫhBȐMT9K7θ"qY	MCB7| rW؁08gZdiMENL}KtO#%N,OTr'|]ޛ,}9A{Sb#$БP(A)]JJ&硬]ՖAq?8:*3ݭHTW?T;uƘ$i2IX8fvT@\%8:a#%&S&%*q.njvDP?0e!vWkа]-r9XS4?KK%ik!Y90y&	)#%=ȕd/wuMI:+=Xcy}Tgٍ7ܲ}"4$>>gsEz$4ܸ"d@0:ÎF69"gx h}{YWքF8vHӆZrAr?\Dۋrtvb3<{7}^"ι^f nQta\pm˝9ZW-W%TXb8/Q'9eD5[]v㲘!Kb?Ǚgh#$̊l *d!.M.B*z@[Gob#$"È[F>d^x׾a%&Ȣ،vrbq#$:T/w0d)6uQ91ƌycd/ ^$MK<v#$	*̓c FrўlmUaEKɭ-sg<?PI099AjMŽ9 b:?^&x.vtzAUw(@(#$i#_\Y+^';*;ߜrDMyn~RtQd)\HgqJP03SΞft !U^	r3zyF#=V"s^hl:~>ĲXGMNC!0L0gךJ`%VB<5U2u~sGqcR<2m!=z\P	*l0Ma':HZeeϥR*p*Ģ	EPWݐr@OZ4T$v>QkM%yѴ#u#-Ϫ.q"b$\b|.H9%L5ы &)^ `o`Y0g0z9F*@6Q21{<柀QdS%wY΃Ig]N#$2(cO,S{{kEᰃ"d{_z%c#%<LCq#Kj+%>B_F_/ْ~vb~#X eil2#$HV#%~n:Q1z7<g?a!#|I%#%_;9z17n:cӧ-BHh 	|AKg;Ozv;4a4bOg{4~%vvX$u@CU-MjCNKMa_1GXy|i=Ṯ.=;+Ko1I".QN_HH%$8қ_ߡfmե"h#%r/<Q8byP;݆nz^\vGgsvw:?mR$B@AjK!xM,8}#vF2BuBq4b9KE3tq?NqTӀ=>yCtHDʁ.Qed00O f@YŊ]&YݠAaΥDX!R2#%J1`%􎈗1d١lmW<B 4"]ܢbڽ4t^t{	P[(2E*yӛQzקdׁLKu=`<5N8,E9t\>fUPʡx2M=1,IzҺEGLں9ވS1cFHRd:LҖ5KV-6xj	D9S~/FU+"ʬQ몄%a$u^!#%Bd/QbGae5yximeOPė	wk{C%ˋD*m5i`(1Dcߛa"@BJT౦K4VKlk ':~Dm,%-Kts2.g4oG@5SSQuh\vԽf`!{p0=S[Q,0gҁ:Rq8'JAAMMu`s*C\+HP6MջFV={5wtinKArD+Sf)D!ۡr+R	YQfZxz[l$'qR Ự8L;g\HÔsCN˝@3oo7/ClC($*I4vaT9HA5a^ʲmmmkxi[ ,T#$5B$/-_&&^1#%X$̂ktp~]4ƫBRV5eޮ1$e>]!#xIU?+4f#j{8~l3$$dAݐ&8)	'niu'y[>VYf2<L(P8HDaSdRB9ew4~1IY yD%a%T(#% s] d+[mgîq{7kU9mhSԐa	 pNqSeou|o?dIbUYE@) n9Ca+lpN)JB&B?g;٢Cuc>#$A9Ngfokoa*Ƞ,"pOJb$ P%c7`[PLaPvorg6#%;3Ჺ&y"*z|m|7gQ ߸ujv\'y7:MbdHQ*2%Jt;qQz:Ikzo(&;Wu"a`T»@#%gRA}PdȞ91ȍ)ݷuC5ˡdOd7_Xfm#$*T]{b#${	5s܌Ř^pʊM٣|h[#$0&=N	|x7\m&W<ap]Ԯ.Gr*:/\ :+chIkoLwLi4,) o CnO_H#oF͢VmϦ7\D|琁	\ga'dsD`paOþr'J{<={-=XyE~4A:K	"%JQZvIkav砞u>9XS5T}Ҡ+,۱&)>s}T'(H ޕXMlD]v:QgTcSxi#$1B(imU{Û2mgĪex'mrrv!	UGycI<ZI\辚!	0Fh9+pBZN$8t;5sP}P|,a&dI:4cH^6fE"ڑb`Q60j!6a?ΌtDT7'>c$#셬&:Waćjz/S""ЩNVaE\r9@hǖ#O7a]Y	se4nêЏC3?*V"ի=cI(K81ւwL9F=^k{SP;H}&7tCWKYíR;bݒ6@Aϕ΄OPX펕JtPLϹh	BJ0Qў:2y$薗ѓEhlLޝ,ŉJZp"DҲH#$\M~׵ʦZu]犝&ב"'H`|aFrOa-Eb| lZGoTܛ_dWnDfVT k	T ^>~)2l/vH`xIq~:߻v4v PeYCn\n,}6 -谬0ya/a~}UͿ3&ǁ۪a#%k9"tU7O`(p.Nb4̻k,{{vG$j*wϗMCχQRT7GN?X38b6=2z(dr'apxMBa1FpP~v{N^1>[ejU0Tb	+`xw5<'|o,8ϧfQi,PJJv޵FGeo}OQ!EFö	em皹ml@]ƉHq~Ks0\πp&Y<83	}erc%r`W0@A:\drs_\ϝ|w=oLG/~џθ[R|?2rZFق5kBqkB?兡Q$ B@S"謤*|k{W?uU,޻-uZ,B*-R4E Fq9[U#u֤'QTܒ	.PdArf'p\[剏Q{Lm;F3.WIj\$.?{ߘ#S7Wt&s$3UupyxWTҼ#$ød!I	#%lyCz WbJAX"1 *Pi΁(Î%d{g{T@!T>H?5'#%#$.*OTT 7#짇N^}t^66]*ɲҢ [h	y:9(ő;MW d ($η8n;&nA? #7mJ4OEscMxa%]gf19ֈ1q)vq+}\Bn{ܯ!PyP'_XΞ@p:OKrH2a jw|Hr	w2Tpw>#PhX*@e]]5!#$y,U)MG=:4zypD	eDAs=4Wuy)O:B̽򈁐 ,G/t@L<POlA\㳡TBه}xi:<Ǆʢ6cm .Xao恛CACg#$8y_gQVɖ$$6ws:+aNdDg:fFVY!ޠ7nlPHss<#%+s:sm\a˯N H{F0nEwwc9[<!'Be%K#$bPToUsl'b&Zܘ:%#$G}u.5>5'pIS@Qnik*i2YP<t?7'=e=⩋+=17gkWMhWxyRߒ(T;O~?,_c4~,|c\Rb7D1ǡJ3c	{mhꈫ *rR]iزVOZXv 	Pi<8#%Rv=ھXt#qfg^z-V GU+g7Q3G=(z@l[	 _{aW/#kY!/wM:TAԱ/gCM4%=skk88hz=Κ!q}Bl^O-i#[:Co#l7ƽgA v+!T	~<O$)AR!t@<1I^0|Ή?S"ghɧl|ڊ=gIL)XtUI˼?y#$fB؂JgRB2R-(T,ͳ좟u(a;4dy(.F5=jXd-46sevL6=غeLP2x0Dsv4rG	W?d6Y]֊˙9_T͔ʿP0J١ۇ/;!]L?oo'U0u}yq-͔olJ3D+WhR JY(DĨaCL~׻GJqu}gWeVk*5tҕA'ݚ)r6[\C ԰Ͼ"ڗowH^5FA~Rew|S>s3X+#$E_jۜ״C9შ(UUS~U+/3./8E	#%AO&*PǇof2	BuLIGWpYdRIϬx5s_<3휴qDf?2(q3ެ$qJuUJhK>91Fð+8hhï:vz`T$Sʳ^^ԐBG^/ _>7n	XւTOCJVEد+sz8"B1-Jg>a'7SCm۸Ret[3P|Q	as¦D$~(tP-V.PᜣJJ`<#% 't>6_^[;"/_|B;N-twCT@y/ϩ^ƫ'dHU	Ô(A^$Q`:{TpRR,,hg\h#.Ϭ3xb	:b"G#$$+Wi=/'Rx"Vbk@T"h#.eTȩ1*hB{m!S(Zt)vfH-1klam#${0QLiz3#%Ct:AW.ޙ_bZ1/9`ó/JɧӎwÑ8o9ᙔ`"w9٪@0=褎AB)љhk5=}}>N$4; OȈ~,t	}'Hk;kZcyjG04xLiFB1bA^q/~{KnO$C/5;D\ިA\fsU&nيAac߭oAh2__lAG>L=2ʇ"FW߷Y0vs3l41]!#%3B U Tj垺:aI!<*nu$\^<TRý]NuZ~:( H(/g^gv:*m0!1qd5Ʊh63`uV 3ǗL+ve`(y)D簒̮VbcKCV,#!圿|O@!tnpqzTJ/1-Xyz/u#%hdp?9IA&VZd%A!\.n8eW%RCVZH˻{-_F"`N5D>E#Ksp"iMNvfwdnH@ߐHC1 RqGG}?dG=@P/zrKu=\{y\=yۏSפHƴs?V)DrQ~{cWlj-DHL|$>؄M3ڎKΗ8kum~1"IB6uj	oCMǠ~¯/}IT/hcfltXY#%#(|$8w Sn0@wȠHHlzmGzX, QS:f֥QP}_٦X;U# ^B#%J|x(9L0p$1Tn<u-¿?o4H $<J?R>ò>5_ݙВn8{e=~i#$yIC0A`}bg>4;Vab1C~i& 2if"Naں䐈c#$윿,0?j}C!GckKT7~(Ƿ#$(#$3|;"'}6X_vK6AOz,fnu	vq9g9#|n#x2sL|&]ϊS{csP'@}TrˮNp\`@)W[+2xlSPu;#$z-3ՇWv:41>R5DêS; @_O6 9chsvUu8aYݛIa\koaϳ/u}-KD ^BIenv_og#%I "}j׫տD ߹b[BQ>AJ0օjH!n= C)AXUmqO3'acUu|czpcv}ӦܤZF?1KpRLڪƢʤs{́qv:{eF=WuCߦ%IQ3#%ϭ#^ݩAW+]y䞌DL%%0CҐNWk/Wﶪyz+vgWi}QQV@eQxeT	81tMX[#$Ug_+w6Qr1Ϫ>]'{ĸF_џǳeXȝ^׊#ڪˏk8z;zw6-4¨TysN}kFtdG/pEqbw^B\{ܜl#%C6(hc{2qcɐ#%6l;%N]D's>F&NipC-Ǵi'|-#xC,<#!aY?q7xlo@0B?6@+M	?ߤ:ϓ\rD$e&׻ĤkPHMVJ7Q\򤠺	&ML-!D\$e	XZy$3!{!on$$'kf4dzFS:gePmU=JQqT'ӈjB)b0WQoTO_O#%K'^>:1K5!kV[+~/ڐ)S\<VbAOo (L@tj%CGe _Ep8א=MgE`هj Y]j,`Q)#v6θS?wz^Ji!5Z>#%Wv"3m@a8#$k)2i;mZFIUD7g?OD뚂+d uM-PNl3{!#%dv>',yY#%hkTR(@t	uaH[id-GWL |Fo Α\ߣuV%bφ;1@ѫ#%FUX1xg<NѼa*у\#%WRC0Zo@p#d TuPI]6Ubha;jْ+kAA0	=/{]m-'Lήntn9Z'K$bv*!P2qKb8V75FV4(+M,g=S d t^0kYŕ449`$wh<jjz$s.Pǲ\B:Mɪ6%hJ<V, -Wa(ꊞxq$Kß'g~,Q\~Pkeq2Aj2l#%Db@ۅj]*U0ᲧlÖaz#+P&-gZ9\$g39MFh._!Z9 bZް[yaA+TC*Ʒ~lF1=7g§`:ZhQY>{iW2N ttgqto;ǕcMQpH (!je^[+ΰj!#%ziJƴO4Roq;xbVcs6x9[e'gނHWIiޱ۫q>%Q8]uT\1<3WX#$r@#$ BWP+Ο36JJo|:yȚS 373w7<@]wMѦZFT4v{XKk!3Ex5"	O䂦ď<(#%D2Q+62d|ĢPz.CT#莯d IdT3c}2Hc۳V:8`K4$ӎ;[sݻZq4vEe^jmj 2C T^Z.ҵDpXp!.b;?ߞ]i97OR59 ֿ#>6*(3i[T}}֞_~,žΰ(H'j<NL |!g,W<kW^;6߲>>B?ORHz%z[*՜UE Mq< 4[wޟao5D~>3	J x%+z+c`؇F :2$#%Bd  ߙ_,D?S	#$l:,J,8q_ZU瞺><o`W#%MBmbC'!	PaEPunT;a4<{	s-β>(>MB)CSԾF%(39c=^ڽ w!O8Td8XiĹ{˿7c0Tozv{Ɖ{]À.#%{Ie4<J^rOVV4X##B u9e\	!@O{]ĊTC>t!+~D?DGK~bҀ[ټC#%$VS47yii*pX0ʖ˓DpPUu̉c,5#↺w+KA%b.J^W#%MS,5#+4_q#$Hwf$d$P`aeוRQ@EAUYvSxcǲ9 yw|xj_'vɷߐT9fS{^)f啨lL:[\AiJ0m12Nk2GJKg2`e#%Ph	E6{`|* o\3ҞWVpYQOQP:W7 dÀ2	#% Frd%,}st1m3hY{@w?sǍ	K0Ɂ CzTύ3zdQ{8΅Lof%聎IGꤥa^6>YG;"/0mViL75qj>Ѵ/48 BD|/w#$k>5Ywhcld8TU2dsTn;([T;(B ýԏCR8,pBu^ZR]xLM4$1ҴHY=LFXuz٬cbw 8?^ONC={tdddfz2(;)lF\<~M(dvaxi y=_Lj'U\tHC)Z7S	:t,11	GDd}V`8 l@80<~ZהB\d !L?uMoA !Os$ۯb=p\ĝ|3M)#$/{8t	4i1\Hv#%2ӹ#$>qo"*_#5OY"7.zTM^%di\5,(FifG$$	óD@I1S,nVFFpZ6ttND'QHF!/RMi:ם$?5k24/F{>k9#$",9?W6s[baN!uסQJ_o~^y2|u4ki9'4xrrニt'@{;{f?יc¹ݜØbT&D4+[Mr=ZO\3rv{VQ?o ʂ ?4܀aaϩpy[wO{뻋UosA(|Nz,Juo%4wƝ6S`j7 KCC%H0PtR#%0]4U8$/D?!Kf BsURv¿[pSVSqVNI$SI:hRenwn4ɓ(BНq짼jyy<Y`²=ad&JuQ	Y6頹ꐀI!e6`EݮpݚUiD"[^_8}cO6#${'Z	-ZQ{6,\jO;w a$<#%#$^\91|#PCpS\]\^0@4ġ_XRdxMynk8Va#%o؛:!EZƗ FGx%	pdM7-stCOi =ZvYSB0 w7w~e^u׳Co}a)BjVk{^c@#D!C,bYM9"$`>@ݚs:_4|C'T<ž`;M:zS 8pttbR`8Ba2Z48X@ :<l:[|.m<egG(|IMi8iKg$$$I!Ff"[CE2(DcM.`f{HB DsP}_3#%}A{m#چ=eV=/ލOlifVKܦ[	I;Ÿ#%vcCot\Ĺ$7	={O8coqu>e_>휈	п=eS|Qeo+5k3 #|=2C(7_+fcH}#%!Da0n^@>&&m߇X)CC#Al_ꡫBO&X|y5<ܪ'#%C}/]zJf/MyK7ߌU7Fw}Sڙ@pXD=<aBHwq;f0QAew0ZSkI$Xզq/OGGCكC^sPi<t2GUJ,o;_O×(T!;ڿ~_'"ƿZ12_ܘc;s+ƨiK!2Q;hոbPtOSNioxu6f#%} ijUl8@®`Qjxay@'x8|"&w}K5xBA$dHBD'N#~  Q~`xIg6g<Z6Kӣc]OƎfl㣌-(+m#aDC!7y5#qwlI$e:WLs:6[!"yþl3m;K|\P$PRLHv#%:d3b# uhj	 qq"f*gӒ:&CVB/7Y߅2LyHHpU(nae;K~)L}tMK#$'B3Z$kr@l*9!B#%~aR~-"QX H$^wm;rvm!Q#$,jiB(_owǞ~H0:@s۠|%%p͹~K@#%>!l4@Ў$\F  |:S8!S@.@/J0=`ނ@^\ab:Ɍp @9-gYu\P&li6;@8֔9Nk:'	qo4CIZAak')ɍ Tv\-U4KKLeUE,X!'U|Q@VZ;foghB$蘓iYm$,=/ƈf5ês'xf(t뢇ņ<n3I#2p˗%MېeB\"v˛7q֏#oÛg.%H$#h>ίn	Jol6'xD#,$0$qyGD?/*_) {;ҬOeg;=~Q>UP_w8tLg(|U$hdKe┹b9lselÏ(y3[R#"`P{l7;)Cch?6k$"AN H#dy{ĀPϵ>,!7h=6퐪Bʍq	52>V){porD[rI"\6l^^7{?<s^uV4S^os͛=a&lM`@8}96Sߖ*@e\q. &&]=AN;"'yw#uBf3MRMo2{O7A!;D]$ھ.	%i@?oW/Hp+Pyc@H0b$텼B{9RI1ٹ'kk	9#$?~׷+L`L?q6y[#$+PTU)h!#%@z+;@q #%6$#%pnputFA(G=R!uBWrz$LΟPpB,{QBV!0DS&dȿf` >9{\;a%k!߬/uDl·rL9*x*_MځUFB?gvSS4m.yCc[xff 0QUKdb3HR9pI!ٕxcS<Yzao#$-݀Џİ"Lښ`2*B'D:/7%s=(wa5P(7\T}VK'u:9_=Ym#$fI35$ 	N%nC0wk'J8zmkx&2	-BB$?fqstZ/6n5JL?;Y.Rc𓷨a{ED$:]٪H$$þ=4IV):>2*(rTd?Iӻ7CokX{/Hw'<KxUal#$#Ԟy١+qx j#$~;w#%$tm>ۡpˁxgܹo[[J3F\=Tܠb%d'owĥ踮+ \DP妡cl8,W6.wn$ ]N#%$=cwb>yT r)rVKLj;]siٶ}4#%N&~a,x;g'/w;D儌=@-;Go8__qbU͑Pʅ;vL DaoJ~"ͥ+%BAg2Rp3f!CY$1,@tCN#%܍E[~Ͼu]M;@̴;,x8=pЈAD8#+s0%\S<GOIӷ X#%H,VC(3Jգ Gld+#%awl8H4":&$a˩%#!r17C$"&0$hIĚeb,0`Y5!JM_@Y؝u;	<hM9PRŋ;#%LUDI!3$1nBDL%4IqNp3IfuY,v#n/hQӬ3mPcG^ۆE+gȟu~v|xwq Lu)fJ#$3Y4+w>4k+y@(BdHA#%ʦ7_EfI"A+'dɛ3kbX `x#$7|Ua tPTyx=e]®euىoN/Ƕ/E#$tS(C{4*5H^OǢz<#z89b:CaPa[4}Gak-aPѡ]'lmρ2X#$c`?Pzsߧbxˑ HҹeCdD4A3kk0?^X8it6CVT!!:uOQ#$lv*U6I66D{gXNB1жϸNz mkQ3JCNOPKu둉v@eXF*LuF2h+$:L.s 7@s D1apǼ`= /Eowa'C=03P`M~,BnGH!a֗t!9Iyi$171.LRB(ѫn}d6#%n.U#%!#k3@ >R؛RsÄ/lLzÉA;&18mo C`Uck~G> AfDb +805raSP?E_-Z:_'~(y]ZߪG=_Y|V\JQY|%-Ӝ䕙S0Ά[V.*UPpy9#j)xH	|e.nr dkNe*l*U-Т8@"EGRieby!ABYg`IОvQX56XGnKǚTޠ7|J_.pC**+MNPw6N#%԰`v;KnrF7J`Nַ	ٌ^)d[uZ%ELѠA{rtzv{u_@g|Lm`l"ڨva@#$a^s>od$?o|>JnO ͗p`Y"l4}Ne\j\gXW(OJCrT;NƃO:9{NL>k?a5U֖-sZƨ+JWk1VK#F&fhYuٶNZPžj7GꮩwZ/HLäI=#¯`:bsu«<UΛyZ5i3$3gWf<d;*z#%T@X%C}6|U:FI33r;0CBRT|{D#$t#GcG\˝SvaU;%tԳm#$tgQt #%2 t	F!<LfhYHO҆ X#%p9N!ff|E5#$a~%3GB䃄g:@9l;q%Y {v?7o.6Mqcb!GϹ;犫#i^Ll)NH u@d:EK3Gai}S}3φ)ba#$,Ύ$27m?6rQ	IwJu$^ѥh/Y(TP6d#$C#%L#_G+0d Owk?6GꁼqO8UUl	 #Jj{	͉#`8o4$-˫vB0!\xDF<rb]3#$)p	Jx=r/_J@oT!-xA-䏓oz J<XH2I%2C>g tjURVlqÉiOi#%C6IIOu?O!bͥ(P#$$`{˾8Q%*7FAB~]saOV9:z4S2Bx,fD!P 4Y!p6B8x>с#	y)F"P>iM'sp\}ݧ:)%Q'-Ҵ`*6`>:vouuv-$pdu'?ӔmKwgۑf# сPY(veceC4KRYm`|a7~m޻dU,#	$O{wEF#%!I3ҽl#$eZ֖q3*b&ي7*nհ|#$ZBHibϡ۴.fÑidK&)[rrI;OsOO)rD5ws҂.C9UWa6LO"Iu<3aI/9uǅF1EvMĄ FqsU5J$Xq	dd(k~'i;<8?u׾Іb,7YA#cؗ8沪2ޯ2PߙÜ5WI tMƇqCm}?V|wv6nweg8UXٗ23:ι7|Y?<wԛĹϊͻIE50$E<%#$<	p4#H{3D?Z}}+,Q'U;%ç ;6~\~#%I;^lI5NY_:iN1:/Y@Ұ 	{@Śq$lL?u@X:rw6N:+#@[T'c0Gʄi	cz=67= {|߂ٸQMmai'riQ㟇&Y~z]KbG32GSM#$;/(˔!D#%#%5 pf MWay[#%A='C̣.X|=e;$8St;j]qܧrrLEՌǬԹ`B@#`Bu&&><UBIZx&"e#Bfѐo])>{6k}6Xac48"mR@7D崜s];Lq\ w=70	#%61$<-$JǨ.\Cb,/{sw#$LɭwwnU4ٔ%Ly3sPWX$p:&+$C&iarKǇxS<Lr9l{aG=-Єd	(qǉrHa]aUtm"u|Ejü9	gZ5L@xH, H)gcgQǓ0:4AÞQpϻ^##Vɒ.n|"*>/]Ŵ}SB#$qYVEc*35S<OhL#Ab8(P<F$$~0Sx8lgT#$u*Mw0!,n6B]I`L}xW:no=ՃGOa4#F[Ơt$Rjl'䩙q9kh!e`wn&v|4>	0+f[)ccCBsHD)}!\Ȼ:{1dKOjWDOO1dыFP~b!S	i:UI# LM{   1&g ;H!8!7&bJr#%!ثEY6Hyӷ݃ɨﺧ QM:`FM2sL3=/W#$ld2B ;(EAsj8e1 8d0^2VEm6q< }J<rW$X)}>yƆڙvQ*gJ`nu؆pHꭌFb!NS1n2*6tEۃ'΂Ƌ̂WX$nwb'C=w@=7͋Nt DPR2E LM`~*H}93ure}{:cc~ɔuyէ/^Z@ T2pp{L@4$H46bR#X,j04#$!<U!卡\)ItP+}>Iqbcp>c+?I(\ΦwЅ(Hܥ]yζGh/+ak(	aGwHNxWxJ8p#Z#%װ`|X1L#!SBBf.)"B}ӈ7ʢCS	%͂P[}ҡEC?gOV?CgƵ֭y !W2""BB?(9$h77"@n«jf٭1PbZ󮆚MZuzOdCA$(b#kR.<N85)s$aI\jF*} F#$5Bǋܾ4sXuDБa#$	#%<Y &'>#$F*X3"``H(wJpXTJ!O{rvB0F)L(DST<5ԢFDR'yKnm6Q;o+*(#%IKД3!4J=e	hH/0:'OE޽acPu%lFz	c ou? |#%#%/U"GխL"HH o8X"䂕V+kb̭[m#%qB[:ZKvKƭ!ζrPAsL94`M"O'e|/5XIBF!XQV3-(abʂ!i>ij:"AgjC	z#B0,XC\!p2yA`#%չg猒B3;#'m*>Yz=va6(Zgyvm$VK2E(0-#%*Jjg<<baUGXH x$c"$*4;Mh#$v	~P*Dݗ<ɋ{2.r蹚SAJC+à>'ZD5ЇўK#%J` gFهlr۩!r1Cc\iR9iʝ绶'mѠ!īIjs$x{_Rrٮr#$_[Gg.,%Px$Y֨fAȳuyp^(Ps]&j]uE7/|OH2F@Ac*#%GYxN҈Rkŭ\g+pZ7Rjl5LH%E>.GVdTMmʶ24dҢSUmoI<fzRqËJvDF H@G 'f#%uC	AABeA $qt3xj2JN $l5BLYN&\nN^ǸY&;R³#$2KB+́D #,3U /ۭEuj 6F!|F;fWC#$%(3o戠B.Mڂ! lVQқClA$d$1"&Mmf"%DP#%1~7U.VrX@	C1G":_nnTFi?`o":ka=$pI>XG+<go4!\ٻ#%a"'%9\LJ#%YT",#%bE$(9Z߾rϕvT#7A 6ꢍ?%]ёDݪUMq})Ŧm|GSȀY1)to9ӑ6^.&"{ٙ{`T7瀖+7PcwͶv:#$GHqa̝X4]y~T?)%xNû`G8CՓrrS\/&l[*?{:X`ͪ;6@Qme)qЋ 	"@[xeÛ`U8vS-&`+vto:V'I%b5	#%n=xghZةLp{!:BY	7 $@! E)v=/M (slA<{%C^s?O7:̳ٔAhXPk?MWwu7d/wG fXfۼ<ϗ9zeM_KUk@=*씲ĉ.n6hn2:1>F;#E",`&q{IhU_@6xEOFug,,`jq)U&M(zֹZAzڮ=TDvBd"#$:7>JѦ'zI0q'u'4q;s\](Ѽ#$eT&>Yt2a漢a~Sz)I6#%\V+	","2<0&77דv>#$9.δL#āCǛ|g=#${aBLz#GxŽ6nT>Cp1lsno	@#%תV#% [pƞ#%1 tDQT6/I7iU^#%z~ $i>X;9qMP1	$v:[t\O˖ iPq`@^_/#$3_w`wJ1&3+@ߣcr<[E浸͜'+gfvrC5##	υ7;GP7[*s.˔˴ۑQ$#$85wzIUE6#&x!͜\,rj~~}z~><zoF0Azݏ9ʷ-47&#$75A- @lapL(TFU#%#%GٜD,y3lDjXL&MUH&EyH9z!QüHUnĪpM&G~"̽w¶Д;AF6+t9B#%yEɓcWM; Y%e`)Rp}$,Evdfs+8[$  atn@D$Qd|Wg$;[t<s P ~"YLdyKm!dd(J1i<CEQl`#$'Pt_+" L<hT	8Nԝ>qR|P-3,U 廕_!R]A`J~YW!h qEn=y' 냘9҉$T)DH)%IeII`XK`D-llyiŁyW#2#sFj4[M5j~Z\4\0!>#ְ.<s}vmK6v9em.(O!2GV&`xnIhY&""^0]*V~\B9Ԣ,[HBE΄D+7>wČlF$sG10W#RLE}nw#%g;O|N%ht̐0pqj}=wfQN{$C=b溅BIm}.7-"ǆn:xra@@Bz脕;9來i'70} b΄ 30ܯ3Nq$<ٷ87ِ@ZϒK0/R{FC9&z,`hhN?aCc ddhM?gBsqI	8%&qysRxf{;2K:XBA*Tj#%5wqY(#JA J6]E5*e5>F؝37T0曑{fr8p~nC6o]I-kJE:F 8ǋ}Da$:TQ[.-6 cO	d϶Ac7MO\a"CEJ2).m/o/3$칻~ٞG6֙;ēng[eoS. v= `I}r$Zc,0#$>ǋ3戞0)ATK@%'H(0!W6x_upjTդI=Fu8MO$wʠ""(mQ"T2%ʌ/,<ɍgSU$,'TFC2;+wDX!0wW0c]#$2#$ E"䆜a۳&藫`fCkm>l7`Q]R>ه ״w#$1hz&>Be t5L`jMnbPĊxK6[dj^4iMz_Ө=a;Ua	YvUT#$qb7)G㼷<$^%"c˯?CK3OI8cr<\/S\MMmaʫe)vPK(R3 tU(RJc1'Kh^y"mf#,f0M=2uoP͑F`tUWb+hr2>V0Bʁ&õ#oSzApM0"[JsQ36CnB%^:zy澇*zې~&UJ`neg5*ݺƵ+70k0% B':?gP'CEX gҝ= 1`j$Xt&A	:\0e]LK5@z`:%jb,!gF,.;0=Qfo'Z˄ۻ:bVPbVyjNx/,a 9tfoxN-jEl#$C`nlSgєn֍1:bXA#%X y@BǡC:Xh@C4'	`Ѐ?#$`p8#$ޛN9fyNdў9h\6T$!bٵi8ɇa}$pO&% su..AQj~`#$}Г2=]([M^?wCE,h{}h6$Dݰon{xQjӫEv,Cde B b#$Yla0DdÇ(0!"qALh\2FLݠ6Cߖ8Ӊ/oE\?C e[bnwÁqbhfO|cy!>)F1+X%($}Y?D\ MA#FMo\DVVF֓jء_PmE#%"0j=dH/iҲYNUsF moJǾ:KZERL	Ԇd̤R[,)2j`Ŧ!%4KVd|tJ6iVYLL$fE&$M&hRȒ(YI4#$XHdɘ"Be22YR(0hH*F1pw@c=]v.CݩTaO7_!bSȢBC%dXf#%gkȉ*&Q\ *LoCa%h{e8pg\طCN{g~mҬJZ2ZExݶ? ^? #%pkt4^K~b8$Bm2RXM$PS*Ia{/[7盩(*8,/CbgަnȌhMpZI%|g;XoR9 N7wH`Ms2xh;ySե{>Tsi	Tqx\q]92;2O[}"Bw1ڨi##J	TRB4\?oC"WWگr\BOs[-3|M\.PX`ף~VC2>75s1):l/>DR]c*Xslɏ87vpfX%A-۫/:wWٍԙ.D	/Ŭ=9gK-Uqǎ'$ix8YM]\p]jQUG';"!*[*)a>rR`8uwFZ\+Cةt6Ľ0]$E#$H\WZö<n<xoyn{{.v'e%+#%9M0?;"]h@OQ,?>y0zwp7*y-2T-`W#$[[߂ћ"̿aIGGl<̡<nrgퟑ125g[!$	IPS%;k'7O~_EDf~8	yJŅfGG9+L&\St/o}s;o۶sv'=*:vsު[\J*,J-8ȂD~xT<r	iUU:JPФt~i3/HA/Sjm`LebcO=>p\\qR%L2t :|#%#p(8~fdĺ˱=5O7O*5F+͓e3 	e)gfԃU[QRl7Q# [BaKL썧>)ٶv4fuvpNm䡇2 TBZ.B!w Qjdu߃9L>.7?uNpc:#8.nb#$upcBNW`7kd<;.q X(!v<QQNbmP4I/x罾7AqΙy|nx8.*r0V/>ziftmth-BQqUwp.9P]̳U](ΣQo!%90$\Z9ջ/m;cP8*_CrSz'-C'9=\ZrY"O(zxc7jB(%vT5oQY^0\i|BO Մ:'a]	#%	O_R&sW3z--Aka:+l<6&PZa AxΛQxv	len;Ӫe0r3)'#$#$O`rXwff*Ivv:6ʈa.Z8#%Wrr#s&%}#t7Y@j9D-HLfzDbmSQ0*\5EÏf8RU!OĨV!ѫyLl@ӊ(4d6RNѣlPZnq%U#%ڣeF:pJIڎn^ze49<j߾_<'')CC/0TH`;:jGtqN!~Jd3t֫Ln~~]cMκg"|0|5,Y.u4x0AJOS=l[F&	Q3G`jT4".a:xX"JBBG\:Xb.;)QoN.	58AuDSE#%@1-:a(ݱ@o|kn7c9aUN+w{f<5mu]3YvS­-vuwMPː3oN )RqXv2ysA~հ;n|HI|Ls$S&hó8NH"o*a%b&-w/%;I!&Bl,!+)جtbâ3ubJF]l8)3Dm#A8"KSƳ;1FuP,K*]tW@<;+t*E&-3@3#%"MKZ󾽼\jca m8#$!Xn_t#$gqаRkHfu#$:.ۮ%i5!謆<PaCXd8$k۬4ξN#${a픬<zɌ,js҆8fw,Xc9՘`4<'VNh5YeaX,x~ǎ(yL`q6PІl#0	>q-AYf]/Y#%wߛKOW>0za<6e	|ϗPK	]1 A8+ztY9J^dWJg#$U}\FEdg`pX,"iL*ʄ<k+XzUI:00C)(QE:aty{'>p|Fu-"zgL8f.`FZVqd|BI!I0d7@3\#$3;ҞܒCskqQḳ.dl_ZEH|~}̀6Lonh9%EK2h$$i8#%GB2vф@G097\JM^.#%N!E	#%M"#,6vr!~	qow₦%#$6bfpĔM%;JrtxVy뮥*{q!OBCpɪSwM;*xqqfa#$K{P#$p#$Xh#%TXDX P "gKEth)"dWW/ĻWɯFֻkddmI#$gpF< )T m$%<#%J$`4B1I䣅nV	>eiLC5m2|3wGػE+S}_"/[OwB/w#Eݴ鉫wK6\LnpL+a"2$ Vo8N&zw$9&{C>W ؙk!.qIr 6Ajۧcvfk_Djف Uld )CȈab7ڛjsq3KZB\͇	-xxs8_@Dvv#$ A׍yxKLƊ3iL,>pa h+ƚ^1A.ꡨJ})#~NQw}mA>acwj70@n ~G9H,|G32FU"cѾ,,Iۜh»/9r#%'T3T@:I(pׅJ:8%t˭.C" 1>qQ/KRT#$H EI&ڍV4%E-36#dƴY֣]mߨ:j2$](W8b.C:(XPE-PāBys> Hl9ZNy6#34넢( )M|0mM{0PӃYzu85!2U"Kyo(@^zA?Ayؑ4G5R0dj4Gw5GfA7Uo>j^=6Zv^M,/RrBa0;;0R\&Eb*`T@8a2'MIJ7wVtA-I'No&cie8l`n	 ʑ/ ;ް(򖐲Qh,h	6\{Ȗ+PY/_! H0` gq@&:m-X1/tρו,{(!Tq/l9g3bMl(BFOٍ7B=|tz?V-BǦxNÜ8-6dC'%+țbKf:syᰴްꇶ#% r2t|OѦUu!&L.HQvO=;-"Xwᔬtlĺ0jɨ];l;cȜ#$؊#0`pس3D! ,lYz,<I:%`" 	 m1+#% HtpA{-]o5ez0Y[~ܔS!gƟwu`#+KUHM*s,Mw/	$r|ky:+hڤhAC޹!W+Np4ZHڄ?|US&wg׊T:u+L!vs٪N3g]8ps& ٧JIsdZ06-³#%糠ɴ<ONXX"t3i7f\N!*lc%M3g	62YTƋxJCZسH%1x4Rpe9sz2OtMl)&XME-#$sqa(f-2j^g/x Uyz$a|u4vyXB-t挜Ϭn :R($F1X51)Ffc#-*0AѼ摶yqbue#%XD)l R (b#$K=#$Ϧ[fu2PE	%bR-eF5!λuWfurݤWБ;)Bb*B `Rd)f3%+֮k^4e4Ҕf+*XkҴL!!Y0dZf4jCZԕ@G/ClC:jJT Cd >'2@D Sw:n XyM煃˘P~<S0a49;t(U2IxH&Nhɫ'6t'O烺dq?xT$y#$/S )DL#%Y-T-6#%@9h%#|Q*4EaB!Qd<'=s/bD_!;IHƮZ֢!dR/-NEIK	jYkCw=CʥĪj())?P;%{T(, Y6h>=Re`C36_:Ai.낲0k$l_xhIyPnHxGxbiWB`J0D #NYCןW˕gqT^:682wb,d%S=;b<mB^]]#%kIf)f#$`)ZbFF[6X;qEJwt>Jδƽz$T4Vj5hMoZݷI*cfV5Mjױ]hҴPyXi6V[MkնlEGtZlήZ*f7YYX&Į2V"jΜKIXf:WJ9N\3>_zmmXګ*/"GMrwάtuOLVJE*CPZR׶kZx鑳hXRZ#dy?WUxm|lM/7[͍WM[V $!| !&,3k	Pd1fhƫzuf%6̥[SYZSE,#-DLR%I)Q*MmlRY)bKR͚delVFK!Y#%h&$Pʔ&b2JdK*ZZdSjk5JRbM)PdT`m&ZEU)Ud#%و! "2`#$EA$WQ~=ӛk mxhзz@dL9ʰ<[rŌ#$'YK	"HCW:AD#%cC$1c`]~?!ձ#%aj(&c]D2\Q%PiZ&yVGCз0?_3>$bȤXDR%> QH>"T~0$e܁V\(tn#$|˛\ x"p>#%<޼,FI%GC%#$bihMi$9ܬm8NSn|kVVl(0bJSÐm~p_ٺo,U{)`ٝ 		o9E"&VоB%Qdi=pTK®J=S͔OuNkj!Tt$@u/{[׬訨 ] [cQU]Z.JE8 \k%uPIx,X]`u@#% H0縩IkNW6!NP'ec׶_Adß}8a1xoM'5'{\\1'5#$ktH]~6j,%jtz()s90CtD&RBĊS/F`"'ÇӇ,D*-m+;d&cKm*x"I1lQj1ee@(cc.D`߉$|-c@'T0B{Bڏ6"tf8G\C*jbXU(!DA4_U|uiO:̲ve##%pD@©l_P3 CfӌU7ع[RrF@S~?bRHods:a@bK!['5ItbE(%mҀlo)2mqq$#>gk=_[{13zQ>{>݅_L(.~ #%20B?NsKX@)yGdV#$8ksܬ-H4\X!2#%EM"=l>	xP0ݙ8eI=1WԓC0miilS`wM|;mq:pBP-aF9|(uOGte"ScF#rBSρ8{A$dI"gE-J틮1w[U˅ק}>zĳ-2)$#$/|F@ V^t`)i;;v{iaH%C#$._6țkeC:5V@"rzuw2MTlni{K}LSᑛ#*tƌ{s	d"$*BЧE'=Jʩauh8͙bϸD"n#$CHWivگfS_?h/uqw\{-9IX9\Ճͨ9~<TX"*1húĬ<Z#%=),N֢̅91?!v;Nuv6Ȋf\#b'*CZ&R`MH-r4㖗ddv3ܾ#%sT56mFMDP &`>3>6sQ^C  Ҙ|4_[UGQ8WnO,\p89#%oߜ#J}4-UFǩk>Y,3f7R@y`#%[Jƪa(Q@؊H7LxEQ)P0,#% $by+Awv"ɖn!E"=1$,J)Vg[ŋmUX0GiQ95QN^!'&CIqR0aVscM4qrguj6\X$#$`LeBOոP!+P!D#-`ǘɕ8+E0 kߌd9# jzκRO!|Hi<r'p4n|tM_#$G`#,%ypU@MDP0G0l^lVYMLaMM88`P5+0MDjA#%8Ae^QPX]C.\P6jA*3K=ƪ"Q$O%4C9h~^[a``h`Q	pR CxV	snݡ!ݒTu@$U=Ίe$EJ=՚zo?l4*W<z")K*o\00OF`#%*H<tQPV."sκ̖0S3E6-+YG Mg#%jlAgz}GGz*TZaQJb $b! #(E$2sLh#$D{QAtN|#$>k{hg#KgQ8yԒȩWKE/e2?I~C?'z`eȄ;2b >lloBGjTҀgpAa(1!RPh~v>Lc1TU#$^XTU7ETUC9`T-kV *Fc!?j"Q$!S"߄ݰR_,q.PY#$EX:Au!8B?ҕ|h;lȎHaNL<2@tQIa';d1&8t&C\CY9n	&FY̤0_=,G'B/TcFe#%jK<Y^dfR,SLR#"ŕc,+#%7ŋY'ʝ)m'f%q2ݰ/))zZFjS=[Μ(M2Q:d|1X* '6׆G&09#"c4uϮ5IF&uқ,{T'4F+n3&s#%*Kb%%4ĺ1-`ꜗExaӓT#%¨'8?`>#$$ keגէ+zZif$,W	6cd[%Ij6#$dآ@S4hD"P`sr*Z	d݅`d>	3jqtL#$ BQƘb1XO2Y]1"-Js=)v|{GL"#% q+?#%§l)?BnBdI8)]hY66UEP["<x:S2-WmvrL))U&ڣ,5*mNP"L:9q>^] e?ȳ%J%E	!1'hIh+lIT,,*65,K0-Φȓ*MC/FŉHxo5a[@Q^GDirC#%A7ObQgb]r혿>9(stP-0h	#$l/cH]9F:dW^@(v<B|D- ()k)[)4SKe<ѨMHDi^7(~-%CՃdځ#%(.Q`m3ьpQS~1xOD9ff4Uk߻XMXv)8X%ECuᷱ	KC.#%#$KbJfɩB̓1PIxY=WT;qI4 }xe={!}u5m#$njRJh'ߤUk"?ӲMW&̍֑@?PG[@?/dxZE#%G#$jQglMNvɓ͉&A~r˴X4\!`^bUj߅fXvWrRK#$!ИM'L\ 5yW@g݋|<P#%T0*JIjFڌfkMؓBTTUm2f*()Mf&fZSMi65k5"ٵmJS cAV-dL"¤,L)ٵku7fI wiӆjHm$BF@N ]'tY$~b	mA	EȪBiE;w%&I#$z:z#%/ckx@j(lMga]$0Dz@Q*-D?,KntXMGOZf,}ޕ_( ̦#%s9ixZB&(SD#$v7P<g*Qi6ʪrf5Kcu)8a ]O58!2C(CZP h7!BZ	>?5#%<|>b6^9oЙ,.kƟ뢃a1Ńҷt〢u͉,մe$C\[$Bf`V7qh%p|9&C< !~;#(ZTKKéhf5#$|h	C`"0)~^sN5k1wZgm,X	IX|p-lb9ahS,DQ;r?cvXIH5@Ho(V@޺-&&A,SG!d -b)eBe(1B<a#%Ì3R$BꥹhZ!r'p=71Iڬ(Ա{('s;R1Gdng"v\呔0yإb'B!@@ȉA>"HB)9Z8;NM970E͉뤰zy!T<RBEA\s'"|ɖL LAC&z ygϒ#(vLbq	(5cz.I5#$N|	$EQ Xo͑#s2(rHH?VNw|٬>؜#%b.DpG719r:9ТѰ뫼R;`^pb\6qKpO}SЈs䒥)6OB85zhne)m9u+ܡT'<gqD̢Jk?=?<UwZ\PBhm,DlQo	&86EBf=3qĶL텉N.Jr/;]3<;3kTf#VjxsF.7kBY$PJ2H2+,R_w#$;Doў#%K1 LB{$D`QY10ن !7}ȍ_z`ar|NpN#%Ҷ]}ߓDCS"&9z;d>^he'..OM8? Y<Gv갟J$,a#$q	LY(\lG(B.C5O-oB#%D,Aذ^ؙ?Hk[@x'mU%JR#%["~mNQLjd~qk1	YR<]>Ư]qzF$b+JfAjM&ơBfD5b[ -2e5Zf]s0xURS˲ue]QTz0IΌ*2!&66hFΉK}Xa:9u#% $!lQ擟lڃAAhֿy'*NdԹ4(i"bԖA9/$CullZɵ6+]ZwknڢP*#!#t ސ7,uR۩DutY#%#AGK&*}2a$*X$-0D1 ><_]4c,$Nٝ.&ۼx$V1KM+^'l,p(Ot#1aZUH	\cHƞMm^A`gv\BgLRS*j4N{گ.MKxvx{6?~Fx!v<y420ZQmIj^,S:U OFϿ%&CqQPϿV00w'06/ic,,F^Mtt<e{X/l6_aBhM"UAKiD8e߫X/g;X2HKQɀ#cWoW_m!P@mR< p~\5̽	nJhpK.)?ƙm-AbIf 2 ,m$2I#$ad([봹u9=107ny;.`,:dJVamuܷaъEۣn^=R֖w?C(Ubgs$#B	0*qL#3gQ'~qCLy,S5ԝo!"/Oi$Z@R;i!^f$nY-iMʶk7L P	R""*963ѯC,kf[1dOnE8~ֱr!#w>Ȅ[HX:d2:jeRZ表UmC"l>>eCbw!B,cmAS`Ae~Wulɕ4'#8+߷=0nKN0s~>mi. nDyWᶛw'>e|#$]Skomm$i]ܙA)wذ`?:IWEQ䒤$IXEC`ۍ32 wxP#%]lԃ,Twe+f:sspUIL`g1 @t/H8۪ge\O˳;VM1։[jeUP5JըDQsgHyd(w#$ny^r CAB #$Æ^	zb5ؿbd&	|ϘDf~7yV9@f$|~f	|DGx 40/n{?sӎp64_ƆZ2OZW,rdagq6-A1LlX-b'#%3{ICr|L=Z!Ю`_0rّ9=zz0 $(7A[c9@$yU]>+UxVVƭfkRmj\Re8qǍ}۲@THUB87 @wVrb"#$=u+j+vH [ن L::uSl׍vJ&Pq\q̒C(#$v՜~!;1#$NR|?BHQ={ho+̩]	nuJo#$`TG9Je-LGtF1Ӽo@9-FD3=PX)7a~w{~`fBᏰ*mrf/"Z	hVUTONg۵^$f-=" r#$,TDr?p)AB"-{iqIpX}xaֱK,~tm,YVmKbpd`$籣f,1Eo9sBM$y}qp,4lڨn[VV-.!`-QUJqk.]TuB9s	FyҌ.uֿ$:BaZ#%	2`8`bIE+(VzKF5nVr`Ӈ	Dc"2"D%-[4!sst5CR M86`/9A#%%"mg7Eʔ2$FY,-e`~VATRsBmG.eAI"0$@L%-Lwey{=)EW dT#%d#$ySdc4$&6BMTSXĆKK׸64vh׈̿se"!Rq D@W<"eVaXz76	91;ɛ"Qã9#$ eӼ3ږ0te0CeqgU&NYa)LQnni*iʧpaLTZ~e#%R)T%lnu{Uyyِ+9W+V%!1	DD60!%lCjX$*]4f!Z@9dÆas`97V1 X"f"s;a6k(XW4CɌ.mٶa_;Crՙ|#%mn%iΞ19KٲjJ:yA=Ɇ&$nln+:gB[*TpApp ̌`Cc@ŖCH:{aЍb|uwNݠbMP!aRQ6T01(pɣ:C`BjN~8A;M2i$2B0coi?#$@D2BGoJP"Ti=#%$^R7#-KK0=P}qޒ0fJ "`s Ȕ#f lD,!%3KIt06DN#$puG>?pnە!Q{Xf%B秹CVNJTI"O%GȒYQ;φo:{7ܴ=zfjS<Y9Kpz3[ɦYZt7<67m$8Viq#%g>SwBb#O4o81=x6eSt7ǎ_7hR"K7[#$Fe2IӕK=7y{D#%ufH,#%?sH~HO@Z+X y#%Fez1 xU|m'}؅O:*Lf#%z#t%@>PǷ1;)D&Xx^PnFg	uQX[#h	ܷͮ޵C0c#%#ai. {H9  BPt'!3t25QdHLkbHMEQWInwr36[451L5wU%eD ब "`%0 $HҒhc>63~8ǉfr>r HC%TBi,Zsl̑JXIɄ,BXaB?Kl;6RFPI`ES5DFVfe6+QlmfF6edBFԒT(T ҤxqX=#* #d{;^֍\hC#7@`6ԫ__3Km%3j><f̩^"Z/m$V*)T]]MsmXvҭզ-Wm6MڜFbQ!7"ك@g`vׁ!ӒZyӰmIxAN"}l/l#$_UN͕Fs[|h@!Pi	>Rgl7fQ?,#$E)v3piVVRF3HwCEP^)@,I2:3gIăDMWIt9$~mN9*ɭa3#%Yn	܅quyR̢g98k2դ6DIbHI<zҜ>wث⦄Y1v!POWސBB={:ƥ;Q_xhž{9L 2H_z5_n[cĖUY/s붷QTkml TUw2&N\ddl=(r7.IG`REZ"#%(QSbOdT \H"2,J:SC X$0i>u3$"HJ./=pŘ@I9s1[fNidId	%p(a2?he!  ѶxO@ܡ$#wR c|xXw`ZG1s?Pn!*z7h}NBƵɻwna؅  (bA	 /̓oC_ΨO	@i#$~4?k}mځ?#%23(TG3Uqu$/hd3sjmbQqJBGSPļK3B#$}~rueA@(i4j5{&ؚP6B#%̡MjE%#"$tJ \p#@%|!HUn*sH42Z0 bPQa@\bJҰ#%!`0}9\.E%+Pj	sdmy}֍bUHEIB#$@dPY^qs2jURLA#%e[3X*m*jƊ	,h56hwkh֥d"LCWr˵sI1jZX;]2k-x]wk7]nw]\ۨr챨PVDDX~R#ڝ#$%Jyyvd=npKQ:Sth1#{#%n *8}"uGB"o#$I  P]j#%cykU_R.B5<9#$SѴ#%34¯Ne犵B\~Gkզ4U2I$;T1lYuJ%.`ɂ"Ao]&|";`CR1bA@2@uw@5#%)a(bZbE=()*$g@*¡>&s#$J | EmڲSXⷀ.HMu "䬬iԙ5ڥ$|[ (l#%N L%Y)#%*BH\kM3BBS2I=Qa<P>}o{&oÏ`@by@1-@G_p%#%@N@3,SBJ-#%*8nݸ43PWDdsVLA@)a!?-iIka&A!Z,-!դ:rQ,*PrXc!HT#$q$RtuI0raަHNeJJȣUPE&!j0͡.}	"qUH`?M2@OO">@1iI2p0j!a&O鮵6h%QT`\ `r;lkF2CrVI.#DSH̖5|OEV6CPIF@$n1l<O!#%~dcHJR($cOaOL*"@B	M  -ddRX@W_ei RADyCy0j[BIipȳaO	j7ivhRBg)Ma%W;lfj7Ǳ?ɘQt4%էFG@<Yd-<!ѽ=ol!DAO`OY#$ |P	"Ug}#$2(<+%#%~Qzut@[\3a?g+=a!-ԑ)F˼1 CQk2ha?xFA8?\Ѓ-M`0CIhc|Λ>*yc7IP?z:5ӣV*擢W6")&9b#%&uC%Iy8;RT]Fmwx[y܁K\X< \oeGBjqx^+*ldOqP4龩FqڴS:]08ɻC1$L1:9HplG7WM_i3^_k-3,C3JϫQ©p+X/7يLqR5O5SW]Ǘr$ٶ텣kF_T>˚B H	qpQfX)"#(HPOJ_W><ǇΈ w1g'TLp!#$);aL`hLȆ Y,k}rC%q`QU]6n{GS%&#%К0MsΑ Qp@	sQ+;_y>fꦑAƞ2@KJ3aWVG,Gop{#?ϔt~*rʨW0-lURxJ<9k mYde	eM$-YpyԌa-K3 H0P#$$'Yǒo}g;NJM#%gWƝ&SìQ#L1-hPBMhqr	9,I@Ȋ *	,Ҕ7N\Dt0EA`7Ew@4}?8ueyzyBI0d9:s0$j*k7)$$MOZ7B=wQH4ph%$^w2 DjK=C؟&("PCHzA/܃rH!"B*H#%ZU#$"?]2?\>2@T15<ǇDOlt#$YAdyd_:_Pa]FώBK2Ⓔ?{'lYNH&@H+ч$)}q}vt (%:Yykn8g>y-<Q.#$Q	B:`,R1!b|}8ӳ*"pw(#%mg<wQؼVC%GH^Gj}7) $WF9\'Ҁ׬?8l@BwIΗ}PT	%՟Gƈ/Gq,WN=1	h>^"~ȫ|3.d;+.I1Gv0py s$<2Og[9/v?<:kY-j_!~ng6Kmt4#'6T![fi<%{abHغ}<PPT-dXhuYNl6B3̀8;P~ף/t;Ã{{ ڣ@lSeF4MR[L,ߵNF@c? U$n'PZHHf#$#JJ656f`$*MC |2"$}|xn^u[l}4օQFCB_:JC:	gJi%byk CvV?c`?$,dE0$6͞)AMTig.wy9B=RrjZ+/xyxS7r-SoXh*W{GWNԩ!;gwJmB@Jiff\:S5zT#$bJn@1B%`"KĬE2\	(xhrׁLWMK4d!Ɇ>{E3nTFxW:s]t#7SBx8u.~u:<YxN#L[rφM^!y/mgzj~eaFi=g3i_:H0hңW֜X5CS  b@s+y͘#%9*L3$eTs r"idK&Z-fGBɻQ#$Q6m#%"94Ld20ZdAN)i#%1	.!\ՓRP:0NZkK%\*%(B<aYQU3ĲC@;-;4xi=<S{q\KWZVJ:)Xf4L2l4-3H\6JȂS3#́!DFT#%pY(37(`ʹ)k2Z9D؀i60{JkSY$@aSE#$#S84aY%(pI8+'Q;C Xf~)߲lhHh@Y/7rl0@!qP#%Μdc*R'HXłr#%dC ūW#%^& UZpi D(H@@dqLu%LnѯT{-#$Q+la#2k3#$Ӊ3)X5!8x7Va㭨kT0覀xXX#ե*݆UJ74hK[]32{H0X_N|Rʺj%"ap^QrAvBXŴIy"J!lB(HrK)=ҽ\i*TUfb%Op2錥*fcz{֣ZƅA!B0@#%OGW2ṃq1t~UAJ(kȈz@S_<{PGv+oJ >qF@0ZL)ܰT< H>(j	)&X,g%%5Gc$Lq 0f%?I"(QNJ lfBKLO28#Fc߯|߯mwE@|&CӳX2=%+`%+oPDS{r-c\%/U1Q-/9+a(wfrba.=z6ʊ6'ݑr'#){dD%(a-?qG@<mkˡ{T6S[N*9T}Ity>e}&η2P F Mt R?@G#%[YdL3j'Aaρ\"}Q$`]d&ARP)֨Xq\// +.Y<:]PW[]hwb#$P@#"qsh;9ėKF B#%#%d:r'a6~;rb[$`PACP,[_(xs}%%a+	=F\pUO1-PL.1mURq&2!2(<E6׍nkr⹷jj*\6i/B#`IfVB#N=fP=П }><-H(#%D[^n$bjUd4Ձ}0BeP?&IV>o o2ZcYoLkEEh>Dy(XLD 	P$uڮKmxk#$uDxb̀Ò`#%&?_L	z@IKآd>,ǩUiJÙqr|T;7C&tT ~T-Tb6RYI6&iPI&kjMJY*V-SͿ]#$ۊP+#liD]ɹFAG(pu#$8pI#%%BݦBba* bh8!8榨͵5M,b #%/(?	`8`!a+d	aӖ+,>y91^[<HT$z+A/Pf4udkii	XQiI˟q6avH|7Ct:ëDXk.CSjH@Lc8((d1V#l*T@QEDTF@"s@qQ37XI>{xQHK,֔kGg{}2`z0q$Έ?L5}N?t5_vo#MLbJ#%˝##EqkO+gLH΁w$;C+u'JU)yFES9IG,HAn2j!5?Hx#3=wE.jG!WO3##$gHdT0T1a|:ɖ<9#\q8TFpb}>%q)kBPCNP88d$cC	 RUʊHJ, ^,vKm\,`oznt|?n˗/	#$RtO	~=W>H$)x2ߥXuʲo-/ꢓm`SSTTE""	1Ɣ9EK:J_o@j(b4*$Ơ`1tQҡc=wxAʬV$yzMm6}t-9ݑ_&$.&Mn:!33H`;q/Ltj6J'Cad\JmgiBgGyv	hi$Zri<fhg	&Nϔq9:<\q2:.Wwq&G0u:8ǖDF؛ xRB!pΠ10Cr2:=8@祭_%"0lŁks)܎y{iSy%bLn8K8y~ZřhbְG1gI-M<p-و1߼&<X#k=W<+}irNck$GGwڣV1AU=deRiM*sA|d/::bT>+&2=Nڹ/N/9$Yia)L4#xH^#$PjZZu󍏣[dLKIB܁s-KcG-j*^g\ =TRFă΁&ctDCb;։L!\:7rr5^Ql.{};C{B`gvm}9#$IՌZ=#K5DU՝#%XyQ#%K44B'#9>QXj7BݙsH$_cB$J kmդSᴳ8]Gy$㐀ٔ0l>[5]6#.";\8+IICM*6#%$EXDdDAx8LDrmˍw_wLR!"{g0j*XfP!{k~;k(#+NUM, ف3vԹZvST&P{&Qw`P~:Isvq<s*w]Yjd=n{6>noW^QqR_UHیdeG2<w*G/!>4nj!vO6bc)IؒaPm4Ų$ŤPV9XҹR_2u{3o~\##TTGa$ԫQ(3V^3ড়A\G6Ź)(qqCh+%e#%l,wԮo{aat鷖W:52\6KNAW{4vQ <Oz;xc#%꾙]n+j6"_=Gᙢ@Xx=k2'6 _<#$]i$)OL%F	),bhc0g	U8N!2=M6Vc!8`&4X;@xQ5װ!=zSduȡa.iNFL.YlhduC|]rӱ8!2n2؅>2Q}h|]"}MS\pn/rU	Nw;ls l$C[hlI]5 DG?7<wfSf7t+n5yjе0}TYR<Ildgubs7نm>/D7y`m#Q.;CNC=;/#$ $$fo,GF`'yN#$d.CeQ+C"i&VlTsVY6ע5]qj(x $FA541KE8	MAMİ,B-iOv,Lz9Z a39C˕93=Q(ưUd_7VUUVIc!IN멽͚TΓɄ~ԩs7t4+B[J9a8#%rt[2=XJRNOcL31eilؖULiĲd<xyKan=A<<ƚ0BC-E<6D`O3z&Z0c锧gI%P|iʬPRE	,ă.`6:xSQAf9s^5Rc 4rNZ<[MqYr7zطNTwz6,91s"&pLt;0m{xi|Y<jWǠ%x"<LZupreX T54ED	6Sے,d襑x1%9%gL*0#%6|=h˒pن4=RlcC񙗖='gVebkĸf2%n\!4	x-aͅmXv2D+>鷘(W}7=<AܢUjև#$V'y#$Aeg.2`kzFڝ_om18uZzTY馎)OA⪩݁G962w7d=SV{fLjDz(>Y'o:q<n)Xi̻C&ai41j(*WS8S:B 	np{qF|2mC.G1$8w%Jxg0ؘMvb4Ҽ<^п2cAD$N|HA*M%@$}ujt"$> YU>}GwYLLRHE8sAK[X$j-Sn/I*Z! jggm@km٣my;BV\$Bϭer3:⮖j+l7w麨%[eHX=.. d%UWy&)&dFAD9K*,|wWro19k'|jhobu(D#Z""5Q%sknoUx$	 4L]pg!,lIkQTƔi,lYe-M6*,%&ɓYlR4#$4H)FjD(M,Қ#LPLHi!+S!" ,s×H/|;X>|{9?9PsA<x{⚛j<]@bCƵq tAoʠy&,3$A_c|i8΂ޔ_ en~QBB+',NXh8Pl,B)&߁׿2|vqNXu"I5#[䣒C+бнEiSo zAHfF"L:ͶmTm>޹#%E%8`Fc C$b?;~c8r­6poe1<Y`VUN5rxBd@1ѻ@5$NY2Qxñ#$H屑,6hX<p\bLpP<)d"Tԅ#M9]=j't2:Iމ+slP4e3Ul[n̉%r0riOlNIV/)f:Q ,@l:b]6n ڳH ::: :1"z	I$p '@94P,u>#$>!A><:P9Hc-%P`>R!U,M0<sg`~z,%V"m,w3+3y {t>k[9J׫,㤳`{!uo#$@)FM*ܒ=ZN@><{x7a91֮TGfNwޚO<R_(NK4`BB@meXVظHepO׍dBT.EdOb-Y3j@fmAsEH$`r\;3%lgqZI=9LzvRg;HQ_f#$uPϯڍ:}!y ȲEP1ο|~&y)?8x0w#%̥9o	ï9;u`&\9lDKF++| ! `Zb6<z:US4xaiv6':s_?.fwBEƝ DǛvv,MrD<	($*ziN?𙬼k0& 6#@!NRd 7lJD-2fIN0%Y,4z޸= nC" OV{ % ֡}-r(%%,Jkw- ^dx8f]!hvТ[(s괒%Z-Tj:Ý1p|ht#%{nM#%JrOs#%rs Qd'N$Ʋ%d=@"#$s\!2Y6rc7̽2^ ,e⿯Ӆx]:ARDUjYaml~qsS0@\#%7\;ux:o׆C⳽.eo[@H;X`r.#%"B9@'L֦%HJUT%sTU|:󗧕qiNK3{9ncZ""96εP[!<lupA4OM0c<*crBL!KH3*U0Z ΰ#$1>GGSn#%4Ĝ6%p߁:&OBfHYE9/H~(C]8Bw7u~3rٙ4#b$XQ)[¶yCJ7VS\	ɂcԝϲ#%hiPCpD,vz=S:,r"jo;Tujcs3ܺ)?qzۋբpb^GQN`C;F߼b#%a%Ձ*b7sB4ύʗus	]z7%Ǟ4Y]bP+o	tiMK:!]"N؉y:qę6ȄpJ	3Э$.)!4\s@<b,(Ev/X!L<nȘA,D\&SKYdӮ|aD4R|\:sOrQH&p0SC3&QU^Ep\1j&a/]ND"mlsi~#$!q@g'qӁ{g֘:{8ӈt8-Jw~{20pE$e:-1ne-SQq8d1i>#$-G{NuLT#%#%#,3In&N-x|ʗC<.Nupttnzd,&33!34T]	e,4p! q3>An֭fe#$#;K2SYPH]i24&F;1beB$rd/w[W'oU#dIP3bFZۢؖhɰW\4SA$(4(~nZkRڡ;=Y}`ð1hI4MiW#$!.s.E̷#D"B g&Arx9bETcFѓC0rqUlSDJC,K#%QRu۴f6b"4M56nfd24R.B<!*T[gghN3I"@3I#b.1#d&[,AgC;3rm{ø`d`pɐr?y?o/j=#,EAr(wY>#3әB$$D %Av`#%gRG~XK'ylI(/ gKdx.`8x;1cIF[e"[.F8li3ףſvXJz?'|kYet@,7@	".S +I!C!,35;I'CQU}v}!NOZ2fY߰˲cէwA	tCgˆL@Zf$;Rokv!<_0m{>v$ImwGPK)?80xrQ#%E	T$02EJ$<i0655lI]\6RE"^wШ*DQR*\+@(P@N0ad6=hK(4]mʨ2=9"D8v@#:ӛ{8w9 P	OPs//c|ɓvL0n9b(iϴn>k6`fi	(sf*BKpzd+OѰ9aaxgp_˦&,Ϛv0sj}9GL刨n Kn9"TG06P^2ȧg~VZ!;wƌ1 =uP< @"ґJVW6-BeDVSDWN։@u%b2	!$Q #%'UsQdOQ}jM[rzs!s|K$"ء-^GFS~uQddI]l男.p(.eBnܓyxĚSMPtTP?, kك\bFHbfФ̓8賺Uvk-t)  2LߙT	#` vES@OwTPR޻rzaPVVv,e$mᝏsiȨP+g.<2#$[<bZШF`B"G#%,	FsҘ=6OP<ttlv lC0#$4CznƲL[)(byߝD#%C9GdLv9`6IR5_\|2>PЏq!($("٦#$UPc>ׁ/oiZ>z ':`>QE1#$HPEJe0AՑl4lڔW4ZMY+Wt7-vo_&6ѝ]b~\+CNH<;DcQE8^[aB".e>ݳ:P^Ea W.ICɿ^d|^Paܖ+>Ņ?18vڞS=y8+2-n"Sz7A4YEheS#$HBiVy\2I]/Xuwmc8yբ[ `-D:oN'| I	$ﲓdyÇ8{YŧJ6jK)`!0vs㹷zJ* W/.),.ZN<<g;zv&zCcPfpN "#%;α|yMP^MA-!*pr%iYa_0E-9>Y͢7jAJCf+~gQ6=}VX|S/h̔W".{Q RV`)	77oAhg oJH	k-yBčY	w(o0b8Kf`22zka#$<Ki,FP)#%R$`_0M!C5iz5N=L8}A:wS) ]Q1)! AKMiYb꽿~5*cIQe)-:z5jf~2Rwfp"|U̟qzjiMj21m$w #%u#%C]_`Ēt 4:߾tnfIhnED'A~' 'T`)sBHZ@ U!!d}ӛ0`hABY~PhMl4$B+r(V< u19h@(QlI5RJ\TijU:TE@]9wd꾅UuQ)V	`Bh		yg9'${E]^L#?eW0©ԐfHMnDc%og#$g}vc΢pPC~(#$!F+QAbdb5FI"@',AbcXX>!:B1e$è~zZ~>%Bc~a>%ߺ@TWQjjR	6QV64֕/{f;hI#%a݃-3^4=d(TmQZ8AzQO>fQJ¤&Cr1(?X)<0% OK@`,F&eVFz;Fȵa<zmox6,#$ּl&LULZJeC5XY=Lqغ#$l#$bHŐ"0٘A i-٩]ζT(Z9jTed2wvLXP)-SM2ٖe+P(1 sRn:@e>?®QO2}MVzda{"@(b MUNm}opf206y3O[;O)m7>#%)]|=#$N/HNTOx#%<ՠ)\<|'#$`BLW#$7[o:iq7Y[KqamĚ8;cHܗʭk#%Tp3M3jƈ?~;#%Mn)"JKws"y&f=;z("T"Pܢ:njbȵ9MBm/pNj#%f!|	DcGH֡`daQ`%!udiؘ&['ZQML%FWs40WۗSNCpl|sn3"mp:3q/BԒpOՖdo;e} q#$H#2W(NH|j|Z=|w:m0*txç?>6Ԩ +2s'@ Y$kPHP5Ll,cȜ[LOJ㠢YGY97Do:W"<ɱy|{юaXpP}z ^IG#%))Ndwבz#%ҮX'>>xmiC$T5whku4?o_??g?|}SsT	5CA!J? CD2gj#P'07#%HBDME?2@	2|_7`iwnEȔcͱ3]5	lw*8-7Ly\z!,Г|uʤDbA9p2}^j2Dޣ!ը?%L`f#k$daSV?7-zwҧ[1Ra#$э,R,j9CMGќ2zF?IU^5:V-IC:k-y5;N3:QJed?ҌE1"^,-y=rU44+ SGRv7L6</6P	fF']xm4pWTn0u]du0`~l6odh6^7xFu/6K#$^3xdCJF3H䂐pӑ^7YQF)vתe؅e#$ɴaa:/$RFku<7di! m3XҌaml!y""H0&;RxPr3@/;olPN0Y	AX#%#$ɵdړjH*1MUjkoMO9D?~:-j]3Dpob.ʀ,H(zS]?I)=O"y1;1c7sizx8Udk	KǾ]q,YiNwr4kE(mX8_o*7Rvc02(GL0@%d$k׳#$&Ixحw! A-c|&&ZY+XL`4ZRx#$my6 @+4:h\Ytk l@ݦ#%zo>vnkL-7$xt(MV4Zu!'^Ӭ>k/yCٛ^l!u!PkM9PO"(@(adkjjCe&w:B$7s!p=+emִjOA?؈'7#%bdPO2T?_唌K@0\[Zݪ&#%vֿ(*Ǿ=?l~=٤G#ó"<W Fx>m~~a(>_O<2@lP\ Q4őeRv,P6h *3z'Poҏҥ(]bdg=W<f8.!#$-[:^]e,sbב0a	2#o{'y	Xfps~|2c7>/VI[SM/%T?rE8Pb
+#BZh91AY&SYO)RAF`@Ɔ"@l 8a<_}#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%y:Xzr{U\hkнwٯa;s_{^{9|_pYon$%COGzΝuom==(}ljnzO}{mۭ}wݍy#%#%#%3```hz<#%y=/0vݕͪ:58#)#%ޞz#%bv-khv""]۔:4%J#%%Q]d;N}a>:{/nzKM΀9mm:Wro}[U޶f̗6mmݷv9w۵y{_xu|T{sTv#%(P(n2#%yU@>̐K}w=w#%#%#)$`4]^{#)i]}}݁fKfhγǣ|w^n[@o;yJ);`w{݇cQ>9tW:m7|;9ڽլqۻw}{ӰNv-josg*|MNV}TUx^wۮmT}axz^]뗭wŬ#%n񷧽y{#+#)ѭQl)FR}0#%sж[ǯA}{9wp#%p#%m׻};绵{^{w}cn:xC;r"ګop>ڟ*{n#))kɯG>ZW{^nv˦]Y}}ѯw<vM#)lP<vtZ^9{NC[uw;z{Sýcѹ8Ҳ={^}|{ջo#)׾ocol%Oth`esׯ{<;Azhk=:=y3gž]#+#%%T+cݵ`nۛr%uw8iy|v۫N]jH[Jw26͞u=}{a7^2imsٙ1o>wu˺{}4û]^^%4#%4#% d@M4h44dBja#OH#%#)#%A)A !2h&*~CJoHS #%#%#%#%#%	#%"S)IdOShhFmD2C@`@#%E$Й#)MSLC& #%#%#)#%#%#%#%!#%#%	@C#+y&M6zj4@hڍ=@#%LA"=)m*~jj=M!#%#%#%Omw&)HOWr	e1V1bbnB DR	WQ5(Ka󖼽ضs:N*%6 n|Ã#+BHe*jKe>73f((o*"JOWx2&H	弣@bQ!]6ښQmjkPB#%2BEx#J#%A	(zBʂT2#)QmUګURA bX"1FSR)c"d6T52Iba4mJADI&ɌAfcBi(,i"b-)%*S#lH0K-$$`Hme5#i06-jjI-Dɒdb)jVa2jK&SmSlLl$YI5̍Hhlf%#+KI2C610BFfb&	R#%Sf !S$ȔD,R@Kɡ"d!"RR&H6c%)6*-6ECIR0"dM"LbAe6IHYH*QE3#)i#+EbBH؍I`lI)QQlIHS6 MIH	3Fa+2̃BTb$"HJa	I4de)fihE$4DY`EHd6ih#)Kdlh3H$*$ʂfmi%٢Jki&ii5&JL i%*6(AE%AdA%()c@02CL#)&5EaC)dY2)%$$(P-F02e6I6k35)P)Hl*d,bMLɉ(SdQS"L#h1IJIl&#+$L6ɲRI,FB)$e2#Sf(&D6ƒf(i1	!eF5+-&DIdDRQc(!j#+-dZJ#)2S$5f#Le3M6JRS#6ģB24]B	R*XThLʈbj%b(lXYJBi#Y	j,k&Cc(-&cRdņfR4iՑ*aX$)Ujm!Y4¬#+dEhRKLDefa*-m	6F#+4jQHmbY!Dme1%hԢSjUMZd͵ڴF#)MdL٬33SJE$j֕JU4cm*e)6ZM#)lfd5%Cbҍ%D"!BP`Sj6ILRiQ&IL2(RH-,M4S%2cYM!(TZ,bcl&c)d"aJQ&,BM5RQ,6cf!IX	&ٖSE	#)Jm3hFh%L,IbIHl-RjQIRJҩJi6Fei-b		(2lԙ42͋AYM(MM5$dS*2e-%%"IA,DƌihɲR&"jHHj#l&ŢEb+M&&hHS#%X[-)$ԆY3%,ihѰѨF#+DE*c()5JQ5cXfhCQIYRQ%d4EUF12Z)(TiIMTJJQkb#)REJ,FFcY45T)(Kd5bE&ņB"ŋLC4`L3DQa)Kf"Z+E$@Elj6IEHRaj҂JjMElkF+%[&1JHlЉ(J6J`у5Dmhқm%AXdTHVeQmKjQ6CK+ŢbjM6e)DE6-VJlmV)6̣IhR5h[mFT4"MEchP-٫&21b֊"+F-FmlEjVmDH6cQdEElII"!jMfZ>w?&s~Ƽ^+*kI4La?."RS"U"bb̧bU4ȟ9e?t|sx1V#)5!,1gF"ȓOʯl wA-~kmI2hFփHYhyDCD훸/ݩL#=lX!]ӎv+GG=ޢCneaIR}qn@d!cA'$TbZefJpB75TƂnM#%lށij5%;/vwu#%r#)jI6eU=te,dY}ToT'(CPS:r@\iZIhT#3`peYvOQnfUqT:+]{l%qhpPDrPa]΋\ɤ)5H/$tI"ePSAA,JPc |Q˕SSUӎpa)5LAUWo|tQ",.FU#)4XM@n##ԗc;7Ыy}Wy:uMG;]ʼXñ{OaIPTR!M$c;f`iu%VQkr􋟻Ǧf+U_bLPYN5=vEkTVlЃ	w?okKHe'k4#+;d !#œТ4]nʎ쪖,-]&yaK^okzTNfAc]L7obMnUʱb3PdDAb,#̐m&ƻRO<\HKU#ͭUJ.XoE?q.mcExex\ji5~'g_q2T-$،hcԞRu$$"Ѐ:&/WK-X^OE)|ܨ*o/FC0:|,kJ]xJm}D=o8#.>:4Ny*Db+mfB``*Kyu7]H\XPd-7,hJKr$(A;jWZ7aUN۸#)|`#)^-;{*ȂdFˆ^JR<jݣ<!}l6ӌL5|U)Ѣ8WЬy#%\1ȳ#Shkw3C:`[<xZpݤ{jz]2T9ЪEk\?m,<R9%)l`Y2(~dژÍ);1]\w+#)ﵓ8Va{N@#)#9__>0{quyd#+ԧ4rt݈ʠdAY5=dM2#)&Z5g?De\?Tr$*{LՕeQw$vX+Ϣ?->#%a}ZHJWސ퉡:ԣ@H틤@{zE|xRczM<%|<wc'nj+OWߎ^P2j<3۟jOt$|k@µS7v2bwT}ZT-CA$$sj^DvN+<CkKJލFp\dFz;.(UTVvin3ΏavєVcMc ޻UmeJj8U``֩V#dϕMX{Uu;m2QڭLX1+tsڝvpem0S	ljxσ]^{;b,d~p[4&Hy7tbM#%4߻F8)#+.G.Yd/fI#+Cy-ظ4&q~j]1#)*nSvU/u4$k't]~yd6E@nr~pfiFytF21]XGM,)^Qh["Lį/ޞ?uo|;J7=--%,36.ݱQHSJ(za̭I/zWg%#)Y#8cmu}}Y?\&}'wуjBS48s~ߜ4RFȏŞvpݘk֮4d@ G(s:3,P80)J^1v.X(20`#)OSF[n9z퉯ƶ=+>jQ#=zF.TNuT((T%"xqlS*C?hT4{:ըmw8fىQS@UTbcQto9Qӫt!ɹOǤ"_^6,"9MyBԈ]xc:88هv7Z=_?sÃPwFe/=7#+/ysHneE! BIpE߼B`{R-: uvcCcc#)]Lª*o~!$֡Fȓ[^w5qhQr<k\T5Åq}wNMޓ|zNfq*X$Ge;װy5zwo\꽍!F6w]orT#!)Db3V(aBfzK~8Lޖ#+(&ǐFef"~de[$US$x*∭;gvdg5s_ފY<:Ls]p'Om2/In,9KjBo3-d'ps7}X^iJޡL$Oe]#+'Ϗ9>N,>NKJ%R+m-{^"G9	h7<jlPbz6@LxW(uE{*fk	A=?tRzEq9#a5eQM٧k',Hmz,/*	'γ%FU-\=rr3oY	$:Ajӭʪ.3@43Dmw3`	ιV}RsswQ[VYR>#4DFIm/jHs<r#K7i6Խ[K3S[|M&e\xwHVOLh%4O|ޏW:QQGUұEQ5#+e5T_V}%43F0V'v60FޭI <0%N&!ȭRn]>CL!~mHr<Z!\|v)o3]-CtDVQGQԨ%9׆Ĵ3lll~:`0<(+|.8AYCO,yzF}\aY:Ԑ΢4AᖯaifmY4(ORcƃK8QijfwgFSʷ.|,Nƻ0/,TdtGM&19w\T'r8{jEJM.psn&nMWR2dhώywPC(QyAlahC]5מ0:!GeJUM&?+`!{=S#)g#۴+qQyU>q-k:9,*MQrfo"_Vf·{,O]7<$5z+jPVd">|bmh!Y+JDLH@tj2'2AZ¯VMt]<R)YR<\Kh&	kLjV4t>g6w64æMۮ;#)k!FmT6*"_oyd(f}Uo.s٩-1#+Ĵ(icTqLV8szOií%CzٰQKe"Pt.#NMDdYdoM_=~n`KҰBl_z]j[OMf-#+=F/,%{Fn:kq{qpU#zwTWEK|u!ʨNPS1u&KE!JV|ss5/d@Pc~߷>ZUTy2#)Su/st~*YNiK_"Sl	MOsn"4 5+6iz}osIBob̽Z{EC^Y&wP9R8e2Jb.m>Vp98^E}*rIwMXo{ֲaƊwC}Hs˩k͹Q}t=51s'?Tȳ.}Uw{`㱙\W&;A|[B?L+z6麊YVv&<LoDS66R:NlSķfmD/Oq9ZR0I7v4 4Pάe]fߍx+R6P,LVQ`$Ieë>%dJl,LJfO#+Rb	@QNl~IUxiKR\Ձ\SLVU筿<g~	#%Ƞ=*e#)i;:gaYo">/Ա#+滯\HpU*˲	SCoCU:ʫLn6wmPIg&a{EyT3yyn(Si-Gsh"PE_#+1*,y<+W'ی}qVϨ/v&WBw3.A˸뮓ϟ8Ϋݾeb3曯psFu{|Z(T_a&za2I\[[,J[I#>{_glbȒ6?f>:\a#+U5)\oDX5(#d9Ʊ&MnɅoF9`mR'V@>;aB)vVs%\Z}e?C5#LG?*:ic^o_b&!	dڈ]o(~x<Sպ+d^'ǆ||={꡷U#)|ۀ	C,'ON6Myl]>	ϸDSG6OkeE!8u4eO^`3#)K#ܛծ&do7FG;[^aT,XI#%p7x'W\qhlLjȷ  #)#)~H~S%)<pgvm݈#)n4b}ߍ~{i[pBPtgzW`PHTmˣ:E]ΙJ?U[r*Lj&,*ZPTN>y6ڊWнV%>XffM!&N9&lO:Kk_?4>$D#)aG^&U#Y9k.g#+ŌRV0~ɮejooWѨG۫xBCن/EƷ䪧iږ~>.Vl?j4S˲6guě$lȫ=Eݼ*j@qaôf#+q#+W:1AEc5O޼Y׊{`sɃ:NVʹS}']AP"ês/yew"a =j0C\2oWWާuQ鸪\	AI$CM4CCW0azsMG]/6gxk}̳7΀nUklesbBӎzL!#W)GG.S>ìENҒ7+#)-|b]-#+!ͨ{cßKS>v[L	H0\%SւbaGpoPYHc0~MC3秷|?8l_V3'IGI׬rѡ^	]6&۰EDK1db{w2Y?AMOb<L5i8zSr8Fgώ]uPT&eTV_^}Dю>vk]'9{{W0m}r\׼GǬvYsV) 62&sBq~	,MRjXgv]Au&:9mԥTl#%1"f:?#)~Ƀ :op7!	|c3#+xÍO_Ǿ	\t7pJWowp2ÍJi(DsrmّXLoe}5,9݄)6:i$B	G-TMQhY(!#MɗXStò)&|绱_TlÍNQE*.&0{ϟ=9,Vuv}9Q43ik:S?:2ɧVZ؅bd(W:e1#)lDIlncR8-mq:wA.C`lwP%#)1BD=fw8q%5}T7̄vQ`>\#) byd&9VXa1Yg=˓`!}YeM#{)Y臿y|kǉ:Muܒrg/_EԺSD)VG:/!KbdjFZ-Q'jM/ݱsqs.ng+dbݩ^^.f)нWTLGs\#Jfah%7JtZzY呿vKxkLy78&:u	#L((kʚ56'6ehEفCNʣcNL|yK	$&܌sS%X=V]g9T_?>7Ҿr8tpt~V~u-=$>K{cm2GANJ*io}]FW^ˣ`QQAH2m-Wn!K>Efg>C7npEj~ioQ?bbba )0Ev;$rܨ !">>E}/J S}rW!{/d=te-E[yJ=sX7|챤hL$qC#+}*2=BNI?Q[0;qUrYStG4DcH[.P|Q6׬1!D6m-լ薂Y>8IE+NqN:-"0O}{Q1q3$/>z6NpG~?SϷ!-;3]hj}̑]H(NOR֟*c0p`8jLLFHsf&/j#)x5RƘ	gjA5nW][W6%ުKAZICd\#+{C)L)AaWuW㈾`$Q,BC%JԪ\h7,A" MTHEPa5X*y{u9mB$;贖vBӎϵJ)#+[W]kIOSY]J\*܂/w041fԫv{[vCdIj!bwc0YTC/іhIdxڏ*4\7-Vwķ.SDםux&eYd=g&1Z5Q)wJ˴ae'L52ZT-I'8Pj8˖~8C?٬},}Ϫ9l;?X}jB%0h'#70agf#)iS0V9?>/j[w5ff#+>RH<}.0@;XHj-8%6ipJCoI+r&%@:%EAvc0) =(<0D}_7jaU" &&_,z5y!z>@%`?Țjqou1/BlH2 Jv桉ibaE+V{kIj8#)O|e=z cH dҴDH/]*-/W/	E3DAW,*+)Y"Ae3X9bi$4)H]Y9UYPIi7Dis%z8H'lZ1N&$B1g:n9ÐB꽱L:dl51y5-kt,CE/U6xp7yjߧ*<Qr!:	'ytébGbZaOw/RdOƪ*(d];c|DFxA}e[}Q^CwJiK~7L}@2l*:~Z&C^	o2HLq#%0"ٶ{Mگ̢ad*QzlABK=1R$EHR1>y=?vbC4Ʋ$@-s#>i[Tfۗ&UeP"lKP*Asy5ӃO?>JWJOُ6A#ܳ/yKc/_="#("'؛ˌlʴ}985Ж;K`crꆄX" -msi"6[siA#)4H`AlH@h@q݃0uq'0m0%'5a;>zgXRs}_~lnGG/ȑK'nN:sfbr5wcZ5V(?NT9=:;{Envw^5SWϬծuF]yGXܩ0h8	&Y@NȘ}q8C	JVgIޠNd,'W'%EIP#)F]ȌĽ4}~{`#+"f󚌭uy-Q#)RI8emtaItٳ;_Jã݀w^__TalݿݜOyo|z/;>Efh|7Rgj0czWe	J-2#)SI>]H,O^:1*&V5rk5tq80QǦRXT\sOzɾY}M> ACdΜJ#+e^K14Ne7,X2'PM*wZ#+k?oT3J^Bs/~Go#)9t3G}׻mǛaPXS-IdjLHfʖ%If&ңkjJ$PPRUQR-PB>ayl<OΫ#+TPUA8'u-B?$,Co1u+o߯^,~e@ '_.x#%#)(aLFa_L<׼&$Јܯo+FYREQY/ȡ7ح~zۥe]MI\؇|.E\!)($ q_zas*A-KM)aQ#)BѪhyI!dՎ31%|A^;mkY4_?LvlSm-`#+]b)lsșE#ҹ,QMP$ tyV8ۿepw}E$]Vo{#+HNn$PP#dp:R*(l1ԫ/#+\&c;8agIy숪RaIhGn&VOLE	DL.=҇C?w䫦~}1><?;WxZ=>:>i_쿧̽}=1iҵT}@]}}~23t 6-<m8P]"|՝spFx]`%7ܾRV?v.+d4O|6R阫恷=p3}e,vcS]|=LȐ#+4C)QOr0#%pnP$6bؚj~+B}l;VZ\\-ywV@n:y4foty1A~#R {IKRCy7E^7,#+|=WOSG30=sSp"kkݐ4'Ut"7`a6f!9N:Wj`_ıI~O}aS?:r$Lz5&O{S9;`mDz!p5!_}ű6IC$R>')ʓE#)TΡ:3Kpϵ03^P_%5LF! 0wiSt= $sd+63z .;scLH^<;~^u#%-JdC!	$y1ϩN9?[3#,(?J$tԴ[lElyN%oE6HVEfLZc- ?#)T_~<7grϋ}AέKYw_s~[:5*=/tM>N%6g2HkG_#+O_U.[?#ڧb~K~ʮ7Isϝ[{9O_=:k[fA-x%F8?bLߌe~xzӧw"pϿϪ}~Gzwjsj<4>\_N`c>2]ʅvEa#v޷oIT?^_7rT-/dkЪ4շ9<8hl2+!]J۫e7V#)<Ylƻ|s峍[^r]_AcZYQۛ˧諆箞9O)-\ϡdlȺtH<8m1ntyoo{ujJc)y~My.YheC9sjW\tҳn;^ʄW3y*UCOqS/<fsvJpgF6=߂p>h!RZw_J>/ϝpߟz-	+l1Ų	i=߁Aw}:Goi_]y<iL]?[Yш{~6݁W3ҦYJEAUxy__/L~et#):wg*?n.p*冕kyif?}oG.zGv0V1na?ڒW#)ϦY7;[^8ۘw[6^eN=w߿p|K!쫫G'[7t|GwJ,^$deQ&ɜWܶAP,S&qOG䄕SAdZ5h#Y{COoN]GN'{'-=>MiT<"n{5ճ}Rw?LuuOm]v~͢kZem,t[6׫5Mݟ:O&#)5nQ)`vGj]Mjۯ|~!qt6Bm=!|Tdf5 XfC#ɇ}=|y'rWPO!bz#kmiT]T񶶩NW|t1)u]y[=v0Z#+	Lf&l-VWj*BYPT/KWRڞ/ݭueͮuLK߲/:%VTS{vl2)s	Qnm)HdIZHn~ZA/ۿ?~#+n>wS#)NCO媢U8Ot!˷OtWG9heoYWg3O;P(܅["sjb=[Åo:#+\'>4dn#+L6h+\4k2/̷-[9c\̶~sD촾E9B(Ϻalkح\5LҸXq`.8C2ui[7F#)U/vksL%	Bq9Hf<S93tڳ);l:7?yv%V|~3Hu%\!."~Sɷro!SZ^ͰҷGm|UO9|껕ŵ<ky4#1~e}(F.2IKgX&>Y#Ӈ6q9jWW2V"Y}Az`_¸H32FnB"TvikZK9EhRLq4h	UPqTETԉm5ַkVaIeM&t!HZĴԑ#v1O=,P)PRo?18f#o"S&Ӭ_gY޳!AI3MKyg4ItsQF&jaeF#+2'۷F<4H({L"eAR-pylQJM%&p_wS>>#)ׅFļ^LKgM#+٨S-z.Gg_㲌D׋u8#+.Z''2YD4[ig(}#)ingկ֙d!shjV_ztgn==}Xәl!lRyJP^5/ ypy'U.o$8y{8#Kz>G诫j3vw쬘TzHJ>9pf<;5;AB#%z{8Vvla1taXxeBJ`6Wuԣ@]ۦjfׯW\]S;WTmnS6"+#+1h MLRn5h(UZ%`ȥĈ¥biq`𬵥:b4!9^ԛ)in#%4X:mУ:8o;ӍQlpQG!D@b!XM6u1ث{qWƢ9)Rٍd>&:EJDQxS"0,6-B)]"#+%F#+0 (VlἋ@i(oapdD̺T{1٤ȑeQӕD:X`-	edBg&w#+Sӂl83MjJ(3#+EEc|>^~#+SU}z=kμǳGO^&2\;tyg_Fߟ~([}U|#)U#)W.\S[C35cow5_6~%5m77A2	:)LysBF;yz+]fǏFNtyfMYwwe|ɯ}rѿgwkR}u~iAV[_|gpTz:ThP/aytI;72#X\.>I(Ax9ciĽMzFJe:y}/sxNW4a?5㏪yUgL\u67@~I(yp˔HS(V#%Qxpc(e;?Bk3w*CN5?)#)K4"yS3AoEp=&M=ĂeCéٴ#)ƭG#)vg8bp0#_DqzSal٫bm|h$psmg}j[ѓW9[v>i7Gs8Έ >a2Hڕ4U(0#R"j%k)=F%ea\L@}='ٯզߣë2fŪfQH2'*$[43%v	z&Ft0fZ)-g(y+4#ځXSp##Ǘ9%w-QC(EUDnS#+.{#)W[-;oH#-fֹhʉZDzaL{Dm,6@A_#%c	6clG-ƊŢ4`iQ=`ؠ=eZMGrG#)6Q+16C5LH2tpС)%:qq1Zf{$C-dJVQT+լT2PXGTjۘi(0ex6LҐb!0;EuճTv3[v#+!X%,˳5׹?+u8.(Z~FAQ	~'~gRu[kzӖxA+wȗȎx7xv#+ Q"nǧYPi_"A%-btvr6Qk0wcθvIBn3-B~S19RcXp\Xx!jKFXU"#)uvW-J@JM"#+Ѕi '??ѕU|#xROٕ̿x#)>˶Vmh$\R767m>F;L.Iq6Ai`phh|1ҘH5Д"mT)bVC3JB2W_`:er9qUTМk]խ4B񫷤K̙dQU BXoTMUD:hiSяiW2";A]Mnw#)r2BQrΆ1Xth NKFFU^,Lj_*]Ѩt#+(EM##ԯ#+;業Le"7ѭc;"IB?)Wj63sr.t&NfYx[jy#+O?VCT v-[G|812j!ca\K8	ȽHKJI26lմa_&:A ݤ'em2M7\A2B#+2yASxڱ#f*U2iF#+U8(%;3[,Zc4+5Z;kXzq&Xl63#+H)J.ɦ3I:$AIZ`6aI}7D#A-wJs' v2ᠢg7"%aXo-ٓ$XDay&&5#%ّj;NZ4#)5&Nǉ&iL$$e_9h	5N<ڗSHJo uaK#%e:f<W`[;n p<nݛY]D#)\#+'"#;kSF|oGXO#%Z8K:V3J4Sft01!ͳsT+#)J$!5KM$NԶUv8qqrdTը9(9;34|#+"G>vq4 LVE]g	yւ2c=L=8򖞊2Em22۟',F6htJw,q>&3G"9_"WŕkIO13	ӳ.y%]lm&ܪ|>g0QoS;䚜d(NL4bμ<(1#J:a1eXL΄!ìMgNzv]ynQ`&8"=v먾4:wޛ	Eo3Q!y,]2̈bV'-8v`,VM0~|#8J-g,G+eeZGSGx;JWU{Ro0X8%uHDrokL^1<5Y?ŚFp?}юLsv.l]h#+c=bjwjd(.Y4C9\8F27g6]LY3#\rW\Th8k1wdG5b<w1[TͯK	cT	wycQ?΅T`pǩ{i%Ih*ޟiF֭u'[VԍŋymW:U^NgX.cF	}~#+_ ye$/^_LyC	c(lf_q\!n|[`ڏ]$O/g3D1&g|5	&+1^b{BlHFCӛ&)N-|p@o6ny;YUB:;dVyZU3z5#w.O;\vY}H Ы".L*~-sod%/Klu[}&I|$?ņ!f˷akD%E,@IEQ|8VvP#+[жwŰQq 7||#aa3HH(#)eșՎ&{pv'l6"obխޠ#L&Ւ_GCS)&ЅJSi$OTWGnC@: |o%|ݬ!FЛ	$ދL#)k3C?{7I#ێ=R2~gHzV!E;x̦KM6ݗODQ'Azb>]_JI^,z<Htfdǟ^6cYHu#P\Greߤ;fӐg'/E'B#Ĝсv~.qgE?9}]0$oQD/5AiTo*uH{&XagEGFu@+Bk+ײh#+5闦f!y2ְd#)MN~;m-t:l豱Q-vbFWUheg#J1T҄(rǾS&i	FB1iܭmI@nǛ6cV`\$r4ߞ#+|O&n(gViߌT9r_1#Κup+ ڐ-ΤTR<%WfxGӏqwNN_{KhydiAblzU/vk?"o{q\W'~؋j߶GiR"dq#)|;A-6q~zҋyYJ"q4;PO	"A{4ĜA~cؽ6cEdXD]bۜq6C~ӗl,%Y?-]|a<,W{1=ƫ#)&yx|mU%{v-y͘|8y)#_(l;`?e7gpM1=}'*L(8p9q#)tP]<q1s}}uOӇH]`2![Q/˭_~a"vm7Ȃ.ϚpǔDc+SVuK%=JSoHwvrna]SCq߰TC&&;J9>__kк榐y~ߵ{we#)ĺjb4)f{/g|Zb"o&jPq-z71OXgr4lmK*g۶#+0g0${Gn-B!9[8p5}DF(2X#rGY|r9\Fq{9͝cҀ5(S$aA=GΚaUTK2\!1-4զ#i.Z8k4Yǥ[Qg:),sDS3K#)3l`|3ޫeeL\+*DEDóf:W$IC2ΘKdH/;v薻0vԍ}[Ϛtz]f/;jls49#x#* !]aêfYKx=a	gĕ-]H9fix|hx-LLK6wX]OBL~9!3<Reю)DF~:|ɽeEXnS]Q;:+2A	VaЌؚTxSkf+پ{:FSKwY_ԊE&L8/[دJf]tm!BN2тD^:;P#+h#)i#)>[:j(	ǫ}#)U/AꬿYDßMzvvQQICU#+#+>TU|(dHpG@7Onk·Ü$.#)'E/7R~T-\PNRE+qey=R𝔛Wвْџ9\gT+J.L	EBpg=#|p/9N)ZstWezZXo|1L]y#)a1tsÜ65XR/~YZmX-5Eay-3ЎwBR#?mNc&H؏#+Qbnszk7ΦOZ7㚞`DDO/[#)(~9B)U	D'4ΑJPﮭBW؉]R).2ALOeJ*Y^;V$<i2#+8o7&c#wDHc'_K.<Ys*+NeF@~q9p-%磍׿ˍ0%߄8_T1tkq+JhVۥΡ⤴1ϭfTYEty^O<8m=|KqD} YD3wr{i;R2e7Ph$͖ssnC/0	=LfֈZTy{aJolc_[!oLB{89ƸU^w0*aqǟul|~VBw;9d<3_ӭc<OhngO?4_kSU#):|{Gq2Ge~X88TCeX<9{ZQW=:yj=};z}R5nQ+a7՞'-d;ly*CE:'m$5lLsel>=c[F<Z-:B꜒Bm9TŞ}Y7Nn{N[a~8O>MV_BSG}}^#=GQh'pe{#=6ҭ.9ȦǇ;mۧѺxR'l8pUe8_4^4B<rؑURC7hKTI1U#)cUA``c<䦰6[<R#+(}<qo\i59_h"mjr<爯CTtc^]G1|=+zopvֳS4,oіj/7xm`ߖ)'ȓ7^$|&90y;:1$=o1]g}}O]>s兿F9i&+2/\邸\9BQZwRȠ,CoG{G_T<b[mf=HKc~Q^~X߉.\d\6wJPn۾<nk8p7AK'Md1<bb}:]a/)Hqb3hФR;x̧#+*`d;wpZĘ퇶?YNa򖟅n3!]G.pk"ChO~5ƽ~üYw/}>P@BVGQBHuĻ:a!D;$DP-#lHs3">GkB8q*4(oQ>o>(oD{-锦va@߲\pT%>wkq-*Z唢Q<|%*o}݊.7K+6EW}ZTUrpr`t鎊=wGSfRz%&?mq}9z}wF*Tseuvjouvub`- }>*qMMۅ|s	Ӿ=p#L+s|!Z>JqnjQ<q]?Kwcs9ழ#W\?l}MvjO\\\$yȼ,"9&QPpAȻ@gGW5hF%|OkHz?KƣUؑ+7>k5}kJ?y[ǕN%"u#+]vKD*g(C#)R%$)O\+CL)t&da[zX'^Bݸ>9?vM.ЉբE4W8(+儓9]&y[^WlhǝԸPn[ά#+%<4WaP1]c外z[֎/ts/3n]#뷿ֈ,,f)L\zkv(IHG9WExGtU#%"rvS(D 9y[ڥhGbG,MA2E2<\\C0-.Zo$뿠4va4ppfhiUPKdJ!ٲ,v.9#)'!D5Gt2eWBx'i(at7ខxזECdYTc<7WՋUw=Z0Mm<d9xKQU:**j=NyBk֨ś4#)k0vef2tӳ5. <mM	c}qx|v+I}w->ԪSeynKX}வ/(x@weLG7zV6{p9ˣYyLgpsRS+V=e%>ReHR>N<5b_gnox{PdGuHg振̳_>VJ;	Uv2wķd7*R{8f>ڎ<q5,|l5BݼwRW<pᑜ_8kkiʌFPan$I˄KCF9uso_a/Q#)r4{ӭU͛45bD"##)v0HU"f<1W4UKa#Z}N'yWHuV@B6ǯFV?&z/kⓚ"=x2;ubٵk/lG5ӕ-DL%?^;q=N]m7}jYjG@Ĉ<KVA8:>'_BF4rh'C[hDP>-5%-*C;$|^,Ll4;2oϻv}Gn#`tf d	#%T\9hO45dN$|'Җ*i[q[%Q/hm߮#^cxMyD##촇T,	;ԣbvm[":vȗ]Hz.{.1\,gS,[U<<:=_'Zu=.[j#%3g=Y]1-q~#+"kJh1;׈8{[X[]u&iZ:1RlMBgWaǻgFhS;ɹэ#)M7_Yf%ؐQ)ڻ}ZwHH`9W։Wn3N-F:K߱	?di[db^'w'	o(z{qȓQs$ND8*_[fխۭR5ƣh &T+ϫg(jktNƮ[vj[E, 36Ԙ\O%֚@>?g|<,TJKt`7҆#]	Nx.%8*i}{n$=0_#7d|T8#ID*?ôj&`MXbp92ɦ *pa9ka(S9hXX*diZ!4|ٗ#)*aa8x#)ῑdJJjhgM#)mB8*Tf9sIz~0^7A}(+K#+i_KE*<~YTVpHTV\GnmaqB?8Ю~ZjkEhG׹7t6L1Pks#)\_oψ˓GCkwv3|KMM=Zjn};:;)&|"O7ziU"Z}	>,%>ӕ`yz>L3^-YnñjR*6d=j/쯧6ָ='fXyb9{zOHQI9ú5[ϣL)6<#++!2ūAMWCʤ{#!h~di0`Ϭhx!0j#;X>O>Mens|V!AD㲕\P݅Q=L/y͕:,D	jR_i#%ea`+e(#)Ln\C(%\<vm~0"ocN#`c1>e[TwitX`#5mnYظ,!EDf|#+`TQ&\Tf\.Coۧn6=#˅Vya)B>RqG}f9lU!i#+b(MĠoStdNA*&F#БyC2MB)3w#19S9XBX#GĊ6"#)}:5Lcc1KEի/x_s~ANMGC˧=,5tC8 ,pt6YBdR9qh(b[4w8`؍7F#ɁjY15@6g\gYaTUKW%\6<3hI10OsLMݥ󎺆R.zu!vg_L>	v?.*hG7vH#+<^my0C#)ѳ=BSpAdB#+2sW8yD#3iCBK|hk `E2Ƥ@_; rCD5`#)1"0tv+jNC;1{$"0ǫ[i.偂(M(#+7F<V_o,{l1e	xj\ySߪD48gU&v#+TuQ{1iʇ. c6}9Gd鱆kWA&)ExΧuex:#)9]cfd@4KǙ:Bu]+W=&Db`^ʻ#|;J^#)@FN$Q(&΅"ߙa#+E(M]8u/ur~Mg%.tovfoqKdyWC$d-la,#):F"-#+=yCuU/ƄQ,j&R*PЋCSfv8D/齠f^N%܆pB%toO:f.VI1_p3b}d|;$0ZLF C2;JaxTU"?TSIjd#7Xia3FͲL#)	_,>Wcg]_vuĲޝUU fQ"o}ŁcqeIzX;!]lŭ>S48aᒊO(Zk<)Cc}L_j	Iɠ7&)8JleZe"(s	wvEIfԬ~-έZ#NڤJaV@4`RSPLp7/#%㝱_iQ$S$I9X|u<d-ԣ{ٔf<˾QD(SKtz,9j,:m~]T&o59Ja0h	qxubxa5מDBߞN蒕px{GV]0,'w0^'-Ԋ&	s\E!+ᖂV#&^FҔf3MhL<8Ozl1Aڥ6Hu6NUai䝆N׺o5	l#+8ӵ	Q#+Z1P4TҖTi.%c@g^oyۑRkdx<4>bi+]fC6Fh#)0\"ͺ Ҭ:0ƱwLQU;Vñzm/u>QC{Tե-6x!:ߙܤd	A*7\,"o^F;ՖAm)!~*$^63hDJG~EfR߈a:wEf9~vv,QJ;jOȚ>v&	q$HDJRp?ApsrAY=lkEUUhv!h~R#+DrCG/? _eC}3v:j@QipbM0@vX[3gn^,;΍e9Ĥ<^{p[E*Dܶ[>6:s'ʽ$TX9Ia3ai+D^9[hTR͘:`TEJBO`mfJ;yOU7Q1j}qjԆsk;f0fpi/0dU+0q܃	09r#+]TPQ~)>ݳG*=Ӳ{S"Z4J9_|yzMΉ8!{Hm_Xf*?zc> LCjGI;P."4#%"30SB#)#+ n#%:ԉU.ـ#)a,yJ[iIFLD:^+dP)@4;#Br^T.t24YL$ia0QS#%!*[_#+sv$.61ŗe}.9341F#%FmOeUQBM_ؒИybFp8	LH/GE$%>`$󺖤<ZxWL>GБboL7Z:TH5,q?rUmCG.[Y{qYkdS(,YHJXDoi5`,j:T{;k?o#+GJйR<#)c`<*!]D\ըP7(ˢk\S#)"ޅCvN:UwGѾNgE;&#+wl,݌Ł}ϹG~ӷcUl)|*#3mg!#ėn`L#)ZX(	#)EdYiϣ~ND1#+QU;6dOf696nvtB@k-PwŐ	A`Dђ(E*'F_t\Dك}#%=Gh2##%DHz<#Wqڠ=[I.+P7#7Ws*+#+B#)v"sA(-z\;0ĭmG-#+6Z#<F|7uh\W `X=xS3=P✴<NC8*=)2 B<]7Jx4=Tc@|jr`w1JJjmk[_5Y*#%CJ(4j~dD6Rkm}gMƩJ1 "jİݚ H/fԡtH	Ca4wΚd:rCK\S3wтơLgbsV]Tܨ7)rʿ*3dzNER"({Ŀ!#>|,D׼2M2uCwg#zj.ZXcii	&+~(5Z|N!ɺs'@9{MpCF#+W*8n1P5jH(Hȵ4g2 (u{,[(ۭ+Ƥ'^Qu61aL1LʜÍ_UYB X$)4Ióǟ3mӣ}vGԝvFǁ|:R#)	(Qߛw-9zn$)!FoPUT#+P#+>"HQX`ײO|ƻa:9T̝cg%k̸4Stΐ.F0V-9HBH	cx~O'5{uRR=&I%[$hg:Qz/#44r,";\Dg/|3GH^W(($N`Ay:yGT3.	UCR=q,ko%L$RG#+ ic;xʊ#)6Gx'0{lBGP2<6	#+w>oe7(.DR\ _47 "pj\Y#6mWU6zr29ݱijGK`WfѲE[葋KU"-r.K҇l'#)ۛhĨ uŁHl>lTQI!w #+(%Kw@D**L#)pfݴѤp	ހ5D&y$9	N-X:wJcr}ufCJI#+(`%%LR=0M&1O\lUB0~zJyU+</Ϯkx=(J~_}jܻ=i{1츭NmO(#)(l;U%]p;pl?|Y;t5mh9}/t3m6Lc̞ #+&dB%F6h8{2"XdȍIqe`K&-hb0PZ@DX@H_-<KWb#)Fh{y}-*BjV'Rދ]_}t.GEjϣ#+8ϘA6C]}<5LHXwl&&H&BFpx2\:!F<7Iul/;{38&7tCW3@<Mt6>Cs`'a~1xX玕JtDz0QsFx!04c0e!7mۊleWuZ+"XzU%$3Gk膵Yz)j%6&M"eB"qins~^Mxvmj]o5޽|ND8fVôzRU!t$+9dCRbr!ҋy(I<-CmOtxɦ-"mhm(NnU8&ş+hSdDi`؊0sɈDz3p*&{sNW)y33(lhE.=U|s9V-5#+[30DcTyyj9x,a|-G"IGhBi(3..[o`1I 46 $P(T:?be1Y"#+:AIIbݺ!]Um6w/"r`hMwátY	}KgΞ[Z_v&)+C4n_}pBq`HlPf࿟y(ʔuPUt:kdj?x#n?z"(UV!\Vwɨ"jbkߝMw_kukt[јH%}~JOšii#+~VߞՈpj8//şwW	9j[NfXSfaͅ$'2hخ}M>~_QT"Ǩ@_{g)DadurC#v녎\کaz)ceV#)a+j=&߂mw=Mk̯MtYo~w[J/UyY#%p:φΛyӥI2iy\FaE}:Q*qye;ݡ6ɞyIiϮ$SQK}}>SQTc?d:c'ѡrHV@aƠaxg<sR|OʥL$Oʇ'|F^>=_uc7,b(9ο+_[jX%Zu`T~D^}<ƥɴhfs`&&*LoޮnWz~??YxNxxUx9{?~5$TU' SLI/!޺W;Z?Z%(xN;:#%ǢfoAQ˰/};#+>#~ΟoH[#\;)O\_cH8(jz/]eV'*Bk=ħ<Es}q?n'F~,[?:_ʋe^8 p=oɠG5?^i[O:>yU!IM4ǅ%a[l#odQKςzqp۽30P/|`:y[:TПomjs]&g"7w¯uO?#+r=Z{6#))1_'Vtv;ߪΪ("ߗT494QINvTݙ9W!>5&Q30;g^7ennLYƸIxArM#+2L#+g}	ޖ^ro.P7zcתmlN9 /^p+ZPJ¡ٴXD`s+NXoyǷ繜	 fQ(bh@ΜwK%nwo<Ls^|ۺ~03v,0.#)	{z~NS]M|~c_-VefxQ},MA(/[f~:WyEKly]71 pDZUNB^.#)NA\Ѷyg<Yv5qNtif{գ#)10E6X9E-<ߎzu0ꎓfu3O`8ˆ@?e}II0LƤ#+o|>hQ__|SD_{Zh?$E2jx1tKu^.ꯟ얟ͼHZd?n?6rߡ2-f0-9^#9#31NgX&~"SK$_#)8N,_?]ߔq#)Na=S0I#+=^֗kI4oe~%CT^onDTtXK,+O/2̝</>#+u|Tq|߶uעΉzcS#'ej&?4?賻^Jxo\~_}1ng}aIh2*!S`Znɐq+}\Oxe<>yx4/a.W/W~FCwx/u^&Dp>G|ڀ[&8:=Ozcˣx8|_^|AHhц7LR=l{qx웬B$YwA}sQ^~._<3;19]_2szg;\Qdt,YvN*d^QS#kfFȨTvk,;&"S[C	vwbiǞ%0!C+ox:tz<QC߬:eҤ^V3M0~S\!$F3f˜dTȟQ:XFتB;76]p_m[YO#+H5k)w#)jyey>NU:o$C~qo3X5'_'>z6/%w"ch=`7[/SeӚ*bf\=~]H3dp=|CbQbz\Q9i7G_gqT3"Wl++gW|˯نGZP(=ׇ$#NiWy&yZ_S	N[/){>W?5z}~/[DBgYq<XNɠ̺:>]kiRNmGKC>ipgaby!Aht傭zH6EcF30xnD7n!2}KGgvJ'\<K>:?c}54a__MU3d"pVdދS*Lt-4چp|+m0hlӔ{#)YI"Ω<"R\`訝lGu#NuZm}][o8zdO#)1ghX­ްŇ̚ifW)na#)!EncCֵQlW"a/x_Mq`P"Tqt8{Y`_'0sw*aC<YӏZ]`y>1k']sHU_!m9=n>h#"WVj|d\^v8<%M(Zx)m>c H0]VDgqx|n9J&:>Kw5Cq$F\P$̲K86^#%a#)	I^I#)!8Q9)Ly#+(%8#)\ǇJYzXnkC1j`STl>~~>'VL38:ic$ɴ5LcQTthȚ>t~[@o8#)J2_.B	qhcI&ҟ@S0l0#%IKd9,?lT"VH)/oJNZUs6k"ywsF6Ttgau.QG`Pߵlh\	LS=_yWJ;'h%}Q'G`"aODI#%M&BqN\~ \GE< D-9<7⛷:"))c`_W?"$kZ(yބ1@:ʴ/#)5@Y#+>?qnX#)75QD띗y&nP(̟tbk[$U˰XET㖣#׆UANtgDd,0tG^mlG,slS#)&AD~Bad_~^t3Zi?2Zl;4S(3ecaa	c7		95bw>ɽfdPaoU|;>_G@O.5S㡬)cJ5V@Z?^(wH޵V=?.YB+8qL7>t(vxfJ* =As҉rLi.rSoTzn*+'za#d3#J"OGze'>#pP.ȋ(rq5+tRh;3u"nS*MoZkeI	]6ڢE~׃T#pac[e2.HEdPYi[70֍@$dV&L(?q0b-ٮ8|^4-E?%#%CE<q!ǔ;/F7:K_*y	\ޏ.6[#)H:s5S;>7WdP"@8MV%\7P<VW;ۦBc3b;qb4a6rGDmeB	5µkIluQw=Hw>Rv5)B0Pi-Ƕ\u.	ܮmR`DK~ErvÞ&qӼ @stmi+%z]fYiK_mX]Yצud$%ֽ&.&ڙQovcRh -=QQk'd*'2R6Grf \\]7?JCިy#+Mzٻroؼxu@?l^	$)كld@¶JtM*g}m/?!6婶мr܉PM11qgmzƜoYڻRMqǞxo"zTN2r	p9]2[xPZ)P^8c)MF^67ysCR>,35Wh#+ii2*+ΘB:caӢlkߍD#+XS?׳i;9\W>t>M1P;)NVk#+5HC6VT'̕,U~d]P_F0,ɼ46WT44KD|a*5.<=gxU.o^f^H<t?s?f<jw^f̷yzw6-4*=?*1O׭}oGu&3Uӟ8n_=}S$>ڈ-Uq~-ҦƬl.1*d*rv)Wʚ_?VYmi9șn=}fDJ;t9إ*~Z',n@X0إG1tȓ^S#)f?~KiCt'.'zISt<A:iǷ><q ;m~5)7mpD(h";}۝	&Ys+[MqΒmN;!!Q(svrDjHئ&Ga3tĴ7ނQc*f#)$r|ɸ]W[u` `aS5^)$mF/#+-,^)j4ЭR:+'s@wLO^lfs"ĵ#+/$/ڀQӡ4\HPCfDNuhw;&F`Vx]@:]MB#+%vsTx</#+0d\Dl]#Waf8l@tf*\AA^)ҘoѽAWAr1S靻iu%tˮ[|`NmiU%bCQmf[路CeV!4XQy0:Ir tN{dU,|p)J{G=24G6eJ4#+iv3v<ZDC	CS7fѝ/)\)Z5VNPjQ>uo<o!fk,9o4_hQE0+#m޹QjѶq$H҇ҙ1Hn1P4m=l'`y0R5kcKtlN"aٖ550%rf*#u{FU/u9-fCWL5<'nÒ%4'4,V'*t]J&m<#TUFC%HPI;QFb3u]f-G]wª8]ِ%YOE_c<L[jQĳպ]37NCנNHqtĕ_,!;aծ=G۾n%Q#+2YaN_Ue{->i4XI#+Xdzέ2-+sb\Ņʮ'yCa7W9m/Ο}L}KGI8/C#)ɶCϴ4#uaтcV0!UYm)SYu&1~#TBD,[V6ǅ3C!頳]nRcZh^<zthLT2lKe#+La 'aD%>R)-)vY3uy7:bx[V>q"&2}H-L<-tvh8rܘ?g 7#)LJ8_"i&6Jf=\[kkUe^/7k6ig/\#+UAݽMp{fK}TmU˙`RxV.][aʷnyc;47,.A艵7VeپKRrmp1\ƾ+,컪'F)Ⱦ,*fjs=pqu)[7>wKPeMZ'"LvgEuCP	p^~/!Ltk±م'WXL}}!Zټz`+u"Vjʍ<S9|4ob>x	݃J~~{/q_i|n\N@_oo4co#%%9p*\SVK䬲Y?~\;W_zTwȰ!a`Hh=;\iaQ"E:Bs	>fyI~9g&CTsp$ GR\K#+ wj@a#	%Fq",#%.:#)?cͮoo΋;u,ᾓUGLn]@;ঢ	NEO'P;%zڟI&#)68.jU⍥ma]Ucyʉ8zzv`y?Bt5Sl4|D,.'b%эf,ѮJ# !t~MT^q/OO]NçF=qUX1fw}vfWR4CXɹY'KIw͌F#+Q$:G0(c;We{fr>XT;6}\OvL{&BA`'>`o6AbT7@Dz5 yA@!0o2 ٣YNE)y[6Ds>^)3)X#Yuu>|!!~j.TA!-G9&A#)@؆#%``5ZݠIӱ6vju'#+)U1O.r8^qF6H w~&ᨳjkDW&P]a(vH+P#)>/ٗ̑D@%C6*iHWBH@YO0|4~@- `VT֧PBHHв)5c^)cY#y7ǆ(tC%eLx-kqE<b@	$~=bFs*<:{ND7fo#~55>կ4iq?>vA&4@('[_fM̈7~&ѣi;$Tl2/=mDZ$#+fә\7#+yD!UB3[A5#5#Y֦1?ǅZ:(5fhǂ$u&޲Β$&uZbDuvH݌Y#=}f^#<Csldddftz9yF ~˺aȳb0y6?#^YOa\$4}:;OE-'bOm%)tQ7q-i|*k)a}9ӫض/B&H?)ҵ~2$sy`.vsb&0l#);Kbs?dJEFE|ASNSߍUAJD@ x,ψAx;JL.dC1>J3mD"U$%2	ԦzJ#Gi	%.xda(.#)"4Ͻ,#)!5S|{ilh,BXA4((LIYoq^̛"8!5?UT"'6)vA??{5z242=֜˩*-PGF?$M0@=vnWйJR2AD:~),hoMܲK9kӌW8֜Z3\[V5w++v>)R1Mq&VC<6#zZufǙs-NaN-8R|J7T\{o\(k5BX,"\*g<FT$#%#+y	}Ke`WNGD첃?_cei$HOq#)83_UUV!$/y()؟Z{>8ǈp;#)'Z7fEE/WH\{i3T :LhUvk*"[8)M:ݻ]Am@}luwФL3<BEh$n+׊ۛxsjyHE?MVgՎL4Qó!0VDoܿ\n٣iP9s| _áZO{@<a%*"98]Gi7p:C.|F1͔"rlC.P׺nTf.|Pl;v[#%%(౲Rd{ҹHʨs'?3bLzR#+y1G#+P`f@ha5!iGS"7lW=O@"#)+=Qρ?">=;	L'YgbS}AE.m(z`P/'69%ȉ{A6׋q2d#)Uʧ2M~T=Fݽ88w#N aq{bfm"#%=U8`h|瑦b6 h;A'_Y떖&#)DUz	7Թ!SL#%C=E|:NwhoxZ>#:#Ha#+8B:(^@pb2>CMҕ+Y).1m'ɘI0>U+1}*n@.$5a	'[_ڠZ9*h#%@N{#%07"[Q<|41W-L9v[h|#)X3t<sCoGSξRV}:Fo.ϩU}Gr1O`WVp)!i=V|og&!tnhl(+))8nM!?l(d߅44ʽڪ'Mj@$`a퐄bVbyM,k=Pz(oa:ޓN^n 8#~cg8P!!^/9ƈ@]iV.VU]mq$0}z|#%{#%3{Үg@)#%vCc9L4xQg<!ȷ-rWLuczz䷯	H?(A0ƳN6j@i!<"E#)'Pg*H,կr7%rqшh5kAyjݵUl8mׁ@#+>#N\N?9IEDRT0#+"|D}@\6zSBybdT!VV@"M䉮&&qoe	3bg8^d,3s2GBQD2"HH1G :H^^9/H~M2cEOc`FaN&e1H(!$ĚC֍5婪VhvCSdXiC`]HlI5(j	"xb2R#+"L`fy#+lGAAh;`yĨM#%ÌљF(#c0ޫJQtp5O ShjY((:ZA ~P}PptZت< QVA|l#)WJl$Le5|gvZj@dmkU]rb꫌xf#+itpPW}2>@%{BCT4Gۢ;vLAdD#+#%4`PcR!}M/%,-fx#)Hyї^|F@0sl&^⁕BiѪ0\b46!eS4fl'E-a1|7@4{kaom"4y`#%17tJV*=#+`'k^tH2n}cb	y6ZZfA2I#+9h܅UZZ#)j3@d m$1<pqfEmNi;*Na>ڜѐ!@vʄ	B#%q:WWgE)K.^vt"oL		*CGpIm%!j_	)W2{aZxbD":BmJnSٕE'}'Ћт_tޙa #AH%R#+w}tՃ>E@ D"""%#+QStr6X\Ўz=gE}QxB)KH114;,2rl6W#%~ p`zNQvyhX#9ʴ*RdD0#%~O>o88)c#%Qg]HL9S=t#)t9"Enʘװ#G/M#)N8%u^ޤºQV32Ç>Ňo+K#+\sc<&t?'LZ+qf=8?tK /'xT6+s,Fv&$MϷ\"#)Pгdh"i\.ʹk9	;evrm߱t<8ɚjjj#{ZarniO#%7uX6QIv+[8	r*BIUo"':>$+Pux$hw'/ӎS5ҕ\q![,h77e4uyP"3;Wi/Q0	h"Q!GiWC띈G0{qDU`EU緯ÙtFA(6lSzP<_&pv_2X%{NC%MEY	'#)~4v<|;R).ImylॴOFl5/ =#*y׫Y-[s$??m!0ik`j̖_++_.y1W@?@vݘ#%-L!agƼ@͛pX*ɢBf9R%xB@D#0U㠘#)~"e#$"~΀G:@y/;sv&}Xp&@Zg#)Cgո8u99_ϐp3<ʉ0ONioEj71n`'cspoC<`X\#+c>GqKdX1 *0eWi;'p>j^r!Aa<bm,t玜|M`>q>)-EI!5O׫=$maI#%X#+)4;e=ab_o֎rU]\$TXpP>i`!C}/#3`͋]^!Qp~Tz{GsB<v=#)̊V~y^e]BRhfQxMy;p8d[Wئh7%cYA앶m!ǌH$bԆ5CGhr/rUUU#%]O/͊$>rokDY:g,UuՄA7wp򼟦W&Çj#%~'rԺאb0ush"2=9o>ETv`^';[]sDw#%8CO}Qˋ1RRP*C /|#)K! KvC|PQ? F,E&4$sC>~}4fnkfg֩d[`pzX7=pm`0L5<"6g!//r!W5=S>i'-o.CAmYkLdWa("e`(xE4p7nhhDɌJH`#SHAZ@V@fV1()"%oo;U5%czە+"@3O6>B?IeJI0\tI~0r\$rUDIcA$^YQ#)wraD	o}@ Veɹ+/>OdEq;/?ۏ	k|<Z~&#)g#uW[:n*2}㥪ʧr[=la3όW2o Aa,d-"NMN!PUS}!'e@&g}Śg3H@TĀBTaWgkSM8D#)'1x%dg~7BbaaH̀|})Oqo,b's/<P2BECQ	#+gw}ܹ1DDDFd(;xI3dyb9PƲo39D#)\VO,ٴlW1#+Y)d#ԇ$!P gx~OkF#%v5c۩![	#)!&:ʚ)8p;"Z^o'sߗwqZ~!~MONZ3h>"RtR"u!hR0NK#+qA`)|T?Џo4Sw^.pXy#)-3->96j:Sjs9N>ʛƧ;ZkvBFtЈr*;;1r92'e0[2D||yjq-p*@iӮ?2ѷOen|KMۧl&qqRw:s5.[㊉ԮdHȊl>CX.BA#)"ɇ-ػ~7*lcɭul\pH͌L\0 LMBˍZ)~q֊kqԼ#)|(#)%82#4|0<UD2ܣGy}܉SE`J^#+b*#H"m\	N:(z{*+~cz0JɃnW{9?3~##)HܬASHMV6Wn,5YVwS)@hbNKۛ;rIMCn4]۔ͨ=z_WNWa>α[:{Y9^3>\uDDCOϤFӋ^WlMg{HKLGs4,tGxgX5=crdʖ/|sujMFchаD#N].i<ӎ9:upBP]{:z:璇/شu3UV*_Pdy'ؿ练Fph"㗓SŠK|ynxUl#)FrGtjgF~kz8EwjG/!<Ѧ5[7}O/N𠒿Ӵ>k?qKcH*%pyH<Xv&<	Ū̚ZOP_)728#%rgIzS5uh$xft6#qdƞB-/s>A;.hÚDn'vlHwVDWA,._UنH4"/dո1,Y>ɫVuC(fk#)}cWWw;O/e0Z`ϻk9AǅGܭq:].tq4 	2{,pA#%.>cwUL3#+$6#+PwNfԉZNPa!Hw;NlyqV;L|Eܱ`>^u|lD#%xX.$Z]h6z4A`ɐ߳<E#:4sC;"e.sߛV	mSl3V|ăL?LW#)s("(G2_̎W+ŭde`?}m'v@.Xk14*\*6?CI' RҨC!0du>_0LSxU[G`~ Z5bc߀#+'ۉnl*pQQ*1B5G\xnɽC=P'ɣ&#)5k=SNHAиGq<~	C:X!b1wrw#)sߏu9tzb)H.C@سr;/)w9w\Jy4t(F\aMI#S_4,\YZ73<Si*&d#+[j*36nhτSMT<gG=مL@@a0Т@`CXAJM&;(q"@Za4ߒ˛E FԞU[G/b`\0׮1o7Z.]E!{*Y/77'ӪO>O(x&ƥ)ryS$ʪ+0Qx2Fnd%*T D8UZbs#)!in$HBk}syXuuB>rTDV>B<!ƈعѻ>dʆNop29{yu`k;{K=a0%%̱;(l5#)l)y$UVBG!꽱[jė<>Q`;tO#i9HIg1G82$OmAVzo#)0o!QY8Zi#++.J$FaADɐ&Y٦#+l湘7Wop<MfJ`6&vvkZԁ]PD;gL@	v&=8ꏧȓ$5$3,z	\NQ!0#%fXbi+AT8r5J*&TЫ&鸃CW-	_/׻(;TwYq:4Ν:W˓o8$xOn'Λ4A#)YnpF׽mfw5Sa(F@1V:01``](ATG-iMX3f`yxۗeQ(˂Q!2j┻#%|MjӼ5z8&$;Me{nR	&D.3֝M K]	YzG`F_ D47d4bivF-	PeѤ5nK죑d{B8װ=>r@l67s#skxJ\̋(/M6aX}ZAIz>H9riQ~g9;t`L#),Hr!bah!llvL9HO-As68KnDv͋Ͱ 0g=σus,;E$ǄPG88!؍Aݛ?q{U	!-9q)=&3nlg|^nWPF$QS|@7#e|jT۔K'"	ؘhȁ:#%Y #XD,=̕)@h&2,fhNE+bWDTq 8m-/ѹnn+eQK#+jQ3׶24L(iO3s&\f\\n<̾	woU3ݝ (f.rDX, @C@7]hwYnL\9S#%Th=q[￦h~\*1݄K6"ꫧ[i;+VL3#)֦V <be2ALt[cgQin b^ЁP7Β3w7v̦)vP];$%>ɫ"i4Ŵ+sR1x#)ZZ%繞UQU,i#eL54ۋtd3"I7[B:Z"u+N[I!ƨR7ĦŀX#%V:[Ѣ@CE0t\H7w%<xz%ug?`=g g2cO{z8h}I̈́*̘{XtIAݣ[DWv&#%р:XYaȉ횱(ܤ&QD^j1-Jgv6WR ^6Ty 6#+2!*kLFXv;+BG-D#)>de	`8Ya7i:`6/b-r50I4cXB" ̱B.#%ԚñWrNm*qC&Z:/7MtuL@g`)ϬGx#тc1@5Ɛ2dLQ+"h@:lr	ebx./>Ia#+fR6H!C⚶ڙ+M#+ԥaO2j[*`&Dy83.*YP͍ZKwL,3#%7_s:hnfRXy%stRm#)Fy[*.ig(,}:RoT)Ogq#|d#){ڪ~ӳBGt3Aj(Ism]\Mc9bۭAd[b[BaNi"bFgPm	P@ibך2dp(3*536tĄpT=oyCC8&dS?TONnҷ3LXH!"?xVY":*pH6gB:WJKcr,XZsW#)fppga`h~>Dp|#+&&"2 ,F"d<ԇ>	D( w[uy^RNb:4,:<c#%AU2l5ʷ? #+,ZoUf\S#+AhK=}~~NRCowQЩN! io<IX$4o&PZE.@,b>md$AAUUQV<WRl8@HJI.3Q`>?|04=۩UCxKG=:W]h!:Ta 4 )?#)EdL|,~ PM@ާXsGA=R6#%  #%bde9i[Zxt6f"@RjTQDH_\\&5F!̀se:ydeG_? /ذ*',CSRD1Wftu>أue:.]8@uo(î:>f#+*G[<H@d	H@!N#%TEQXEF1Ph#%A^&>!pO7$,TK\ۅDmBO--U%:#)a)a@,<`I5*2;)w@`E<o#)(E뷏U^˜\I/95y;Jb>ו]uџF$ڷ[e&dחzu*7.,E=3\LRQ	'Ov}kEC=c#)nq2!0?"+YPb.9%*&Ӡmm08"+FUovr d8]c1R)4fsPxnP?{u׳!/oCHiNR<N@م94$2𔰡3J;ۑذ(0{3"q7R˹-ҏ0Dg֪?JD	0w7kc&=nlIq<Wc?n/Yfcf}XH^ԋ2Lm̵I?>>Da#+*Tv؞4RFaFHٙ !ziTg*'(j:	'^]e R!R3irֆFv,8#)oݧu͖UDFEG	;ԑJ]m61MTdTKlk#)j̅6SmdQBRN39[I;P|#%d2 #+p0d?ng/Sc	!7/J5W821зHxe ۲(Aɋ)!<˜YB*:	#)Qqgid+VN `As#$Wol*<]ۄ(UEM/(۝B$Ui,V28dH3Ѥ}$|FA@UPE6tN$};r$# 1"1ͱS**咹kDI;EB(2~*I;93Pއ&#+d#%`z9}P۽wM4oËMWRz^'5xe>^ C1nsB3#<6{}wmDI/	)2X-	PCӊ@Iu!E0*,E|Cmac7dѠRIDѰ~w [nfb	t	n_dz'G{8!#+TPj|=dnoݐNݢT#)p9=R[CCpm#%i#)%͎clLih9@jj0hcfX4]yFTSZ	$+wGj{V;(ݰp:D/:͕0@+T؍߽BA9<oPf7%u:jjsxt5z_숦ޮ*ԇzA`r7|N!1}VX UeJ҅5\[xq[#$m` U 6cL=9(;f#%T$-++q¥5`0ŒmV#+w$UARTT<T:h+`{O\ENzoB,~nh9BFSUEJŗtoèGbv줪,(s32#%fhgXy(2Λo*$vB"{wSkC`Xm0t0pGSF#%в	C5b7WoW?khF!2MU-]u%H<28.I,*H?fYsgFe'qK螎-iatŅ!q=c$w*8{q3<Ա0mDsW`._&(fƫB܎3<#ea0w^zU<-`OdΙXlUɪ:t o};~:ѫC?i#ս\=h<jMnRU:5"ektƚۥ<ﻗG#)\^6&#)`!nڮ2zlpYa}l;WBoK"CsXвUۇlեSA\xmI&oq*1PGX*jpÆ	#)T+*[1>ErZb#%V0\#)4UZAS7Fz`EXb\C#%:+#)W#a2sݺQv?& .װ'Hv9g-p½;[6xqjO#)<7$#)O;I-.ÜvIN;Jia'-	3_:F15J(+{~zOR,|H1/W#%gՏ<[RMI]|E3Hȃ\e2&X9܌ƃ!#)#)*.P -;BʁVT}MTԍdyX6㨫ˡw%Wdvp5Y\Yhm92|E$C_YzzFu[72wFV(iWͲide)65tdRwVֻ:nstG(,Ce7ԃloŒ 6	-bIˡ#+EFH1bsbqyAVn:q{῵yy)0'WL`!'"$)JC'B!#)yM~@Pky-C 7;ki<hݖ֊F8(д4f0Y+:k؀K#%ӊavd8baMeqhl#H;:)dB!P,i$VLPPBTm#)R6HNDZ#%IQT*2xACt	PKt-s,PClDa*Όp}ְ.<ol͠Zk%<NT.j<FxSJ4L^XI#+{.Z	 a#)9(-tPD;3;.IdT#)wvngjF,A:bq84h+˝#+#+4I_+3>~O5bߤgww~c\.'QbDZ(TIDy#fxŒF>5=c~νȘ5JKPNsqMB)+2F:N'gUgM|8ilZ<LQ8cCۏ2˟w}u>;UU'=;YgoQ#%nEkpBm.᲋ׅi(l.upC+E#	A<:҂>\ʁ#)"-RP9Y"qysJ(hf/&VDzJQE4ΒAb(7((2#%pa [bLaݬڍ-Tg%W1]XK6 xdX#%CI6VNյh!jA;;/nw>W%>/Y$sʆϗ5	bYBĎT]/kr.zMb\71Ť*0/Wz>fA\8u.l8>@"$bDv&c݌-[G.Ólu'e`YG=HjUF"߇#)GZ!#)(B"잎	$"!#%'Bx;LB/$#)x˶	t*mNqPgg[d#<w>&(~`pS#)ըsEc#%Rl]3-,3TŎ?)Mr \E A͋#%XƞfPilv`4LؑkL^a @X!*5	yA:D[?Է#)1.!nP<vXwu	<#%txh	t5c	PHޟ(ae7X_HC-7,EYKRdPFp!x5URp}ay@;H8	7X}c͇tvKJB8ȣCR9e&`&gB	p41Nx1c4j2":w;;4t6ְd^]KRB5WP#	25FXV#%{4mRvl<}.¯bK%(a0Nmjpd9̃~$]^5۞L;qV'۳<콨ȥ7K"mŐٿ<Ph+wb;c+gWtFbT6Xszۘ6]voVvh9., 3Iҋe\#%UdMD+PAP@N\W0n(`д1I6^g("b%Lc#+iEA(aY$5C-@1dP"wD[n8eoNїtb36kQ1p7Cӧa5$1YM=eQo4;a8F..S"xJa̰ʃ\Q EHDvxB.9DRת m8_qc@=Nc;^KpӋoS3)3ΣAތ gu#){x4$CJi[a,#+ÆL6Kds1>a劰{.x8[f3Vjh OIK0T0X	#+ ՉD`Gxo0wp'`+1+Hgf&[(v}=ϸ66P!Lb#)#h>hY@S#),"XP14$@"aH#%"0c =M-Dv$D1l7*H2HEHqc0[0Nv`a*O{P:QӜyg_h,dM5<Lu4Trm5GfIǆSs$(^ole+h1M3jb4?0!!!D:>u~[[,46ݼmrLkFūƷ5Z6Jbͥ^*[D$(J]c=`E:OZmZ%%{l#)o#D9Qu&vzA9$#ߚJaF AԆdRmI%m!(iP%+2F12VF)k,(FZMXH)%%FddbiMY	h2i,j3A#eT"vkZN)~ТۋL"}ُ͙quATcgw\#JyNיS@]'ׄ,Ŋ1%3Țr6_#%Q?|K7&\(nx>c39Rs[K^ZU84iO-zYt 9$QMz6c"@`l#)}@#)#%;ByP"KJ[4TeeTDQ1;+o[s))j?X64Z;E|FiiM"W=ZI%"ُ?x/iuu/C#zz/D>^_beCj{π`3ݽ7]W5"%܏}lhi4H	0%Lx#)te,5!m]'w;-ںbM-UY9z0NLSC|TY9N/%(a#)	ɪWL6q]t#Xl3[46'z50]I0(1O\w>9gΖ!k#)xލg)lx/YgrqM]]֥ESr;q(Zv`D#퐳羒q]yLfet]Zm$ZnWӑ{bfH#%QJfX?'qFvV]ߤfZ&`Amڱ`@:Fa7 XI~"hi#+=f#)F[ZOCzw4cE'hψPz#)3ra%&Pr>G;-h͊㸱FnhPٺ^bnཏQz$rHV>5Oo.6R[iu""O4kO(hacf'#^5cEl2Cay2^#)Ö]?¬ҥԦKĹt<(KԯJS{)95xe%B';#)f`s9ieDWC%Ծpbf.5<8ŃRSO{SCOkߙ1.Ltw/A#)RfsWLfKڝV-*Mlˍ9TH3o	]VΆ'g4,>3pݺCCp.W#jrF䡇w&.E^n$"&S'x~79'S'lcuynA]-sqeco3!cX	km0!v<QDS+XkA',2cwB?Np{Kn8ptήC^|nq'qJwόGL-MiPs{&Qɛ1ퟑˇ~S*oNgw::_csnC~dlCwLnc{q0nvN߁mn8p1OG<LcV鳋N(ю)t1b(e\Xbh͚&>Ũn1PF~BU#e1QZ&HņCHP曾*9)3HhUDVI#VCe0!aL+^f.+]QYt)xԨL.qnąƆfuzwjb.ɺ.x#).".vVͼʕ˺렎iM70Fn:Yвٍ	cȌ^NJ:o{͚lLY1Qxΐ.ad#1L"kO<& ;b@NhaJ^4trM4c$1,@d!L-3˵BshXX!r%ܩ3TkQueYHٮ2uݬ74Z)#!5ul8vt"dNM?.HD&n,rϞ`՚laҒk*,Zc#)(%h#)EuԆxX^./+f,uSid7kэc2cc>웏h׈NYWRL*Gܐ>C%l/F^{rJڊS&t#)ZBz.Ɂe2%&o5UuhL<qs0}F7w1Z+vd3d.Z2$*073ZZmYQX֧FzFLfG>eՆȈ3i1s#1r>:8ZڐrY[DSD0frQI#f\65reL)ׂ:,\CͣCd&!sLQ$NV3MF,Jfucu0L@%QHS5n:qC8Lnpm3I2#)iJ74jB#)%0yݕ^_^t\`tNxӨ1w}O9hDxplێ8z'1 GsŝWq")(7;8l㬱8#+Hw`I21Q#+i%JyI#+C%iߊP2(\aCǏ#)奠i\αGXأ:Hk*L$RDa`J/j6@MJ`j:VDIl-Yٳ&P7fqG'jȑ$8O3.#gS+`Á7ÊȻ2/v5*I\hJh!BP/OboIDsJpD7"|]cHz!T94]Fl`U#)Xͦ[gaD C`5[գ0d1ON|^T#+AInq:`"GV9(y>,	#,<#)pLo^4n[|Wkmcd8D8nE#)͔s1is#F[HpeD#+I FhA8SnЊ1/Xrx	##%eu<lb4#%Uj:\6EvhBzXBR!̓7W`m^NЉE	6M(2)A[0HkF8w"C.&orh:Q̌2pD04k#)L93bHu(IRc@#+v(tM,`v#+ự(tE4gtݻ)3" Wyˍ;M0#)nr,ZC#bJ,P""B#%@v	@P	5&%M(T`5zWx{rTM)R4IHIEb#Cx|׀`.tR`HH,d##%@V{  KԸL|>qlPkq9"_ADplX=mv{"ʁvK6998bm-,H$,FW4wB!P&zCN7#%n-#%qF).PIw#)nc2kZMP D#%S`^h%#)^LCQ/N:z\59΄,Y-fB_I"ml&P{;@_||wW"ϻ`i,4i+nbIBHlڇ s{ a#۱A77QHDqe"qK5.#r/<,gBQcbMKg3nd}fG{}=X30ZLk5౑"$)[JRcx	efWى̆`]PEяDd#+`Z\#'HbbU#CݚFEl{O.w-A(jx>*id6FҕZƉ*)iH) jRx=Ktܹ&A.flc}{8L`D- =XAQ#"}G'0 iAOb4a#+!*KP~2HI:"kuB#)k*ЛA(GFs$@@bu.h2.D	3Gp%}`dxDH(R&#I_֥˝0Q	yMcQMXM!Ztr5Fԉ؊dU+aY,0PƼWpL%^=(nWdKM+ff2*rX]u}ߗU\k(ic#%mƃmZ,ۥs{ó>h4wnQtLeiJA5LF 2/r!XM?k*@dQ}ClEsB$HIԍ`s(ԣy0YUIbWte#+#)	/NdA3Q1!e6~+KqNP6[O,ge	W#)BVEM#+D7c#)))SKK;HFDO%gHg*PUaa5#)<f6]s0Rʴ<l<5TFs$yoѦ_&&vwn#)lIʠX$͂0#+&D,8jt!,g:g"K`	A=:j4Y%v~g+ӲC0,(Ĳ2BWF	a!p5#%0]B(RIgTpv`3e?sx9x}մZ#R,@?f*R¢Î`ܠ)hs3#%0{d9jX=1<2Ed$FHۭ]m5Z-HQ Hz3CD&UZI'#+ Z5<#:b_a)kwG#)dN1@DATI,-]Uj\ͮ+f{Qb#:*s&%*`ʜqRp1IMW0۸Β҈Ss1jJzvЃdbĎTni.a!ؤ&FM@;#)(Dgt-lYIg)Y8s-s>D<XpC	R1VMR#%ZJŃ93:N(Q4^4(g%3oRK\O	&D1qKH靘t`2GÃkpܧ$1gagH,8!{[(#+,$#%PJ`#+$F'3V֓RCQ<ʓkjˍj)b!V@-@[4GO6LSzuڡ+|\kev9std]UWJJ]nL=yyRDi H6j%"G*뷍-+kSfI6V6fu-]+K4VT͚__||QVf4jHDY"@$Ay<MH:Kj@(M{J`2%HQ9Ѕal#)N^x Gy^zv:,;9j!e4#)=߫'`{B1W+d0i3;}o"P/uPXEP@}s6$gJCzϓ\P:	И`!h#)ԉAo`i(3M#+4iH@Г9TB0]Aa9Q08oP#+"SLi6QݛpkLD|`w@T1dmo6wԣm8qi5hp7_s/OTms"sLwQ#FSr-;yR1GЄ`;(s[,m%ڰg>ZL뒲#%f\в?D,R%j~BGZڪyY7PMm'(PD#%W̅t!x)*_#%Trҍ3>6$EVV'f#YJ%I]TH5P1[14ͩ%dX"0a65$ȩ5[lԱyQSmVDjآթTV*i1RVU"I#+Ԛŭ[$[䮩QaIjǞuᦓ,͖eõQ-*mWO;JW*f75kBUژ`Ϝx_*Jw	e,8?OSψ}4ݚL!xnq~n2r"z=(SEFH^h5k|h+LTM4Ze1m)*K_{[|HDUk᭭jum]*6k(ht&X7QH#%$@-%%N2[)62MY4R6dhU66RJ(m)JH&leSdJJ-I&&L)QԳHkL*5e*D$,I2hT1TLڃ"F&6ljYjiLmYVګB)SlQJ U)jkVUQUUbբMUڤ``&ʎA.<V0$wR=vfa߷n<h[ؼX7`6<I*O@yyxP$>EVe}9I:zБ(")/&&Fe23t*o;pLVɆKsnM\Lt?&666ً{~*<\JEy#%0꟠'?(/&ƴiɂ^O6|@64?)_ndIL.3A7X$Rĩ(:c!Mγ|ҷ!f8uV=Lgj7wqqXE};0yrj]&;%I`Q}YdQDZ]::Лpo$#+#:a'k,1B:J(^)E#)ELUADMQʣftE;4aaKԽ8-E#%uPh+|v"]#%#+m#%}hEҹh'0 M\!08dd"e~O3IUQ=s_1⅔X	CaRhXlN(cG9Mֵ#)~C|D;w{EP=z"3ޚfIƑ&L6 U5gzI@n?;*U\>wDQF?V"Ey:Z<"p4B%arȀ)F D16VM#%dMtl0-eDqRJ'ѓ4\jG!.FYoZ@Ch4Vhu|s&<v<nwra4icI_Ww#%PSxQ DXzr?ø7l|pTh%l&TDŚW;b&Rdz`nDk!L(c66:!f1`@F	1`c?g)%[j}?	pe`N~H5A75J6a->tiy.[JƵj0x#%k]PpUAA}+ovQI_e`iP!uIsk¸u˕&aCU-tѕdH1"LkJՊIH&t/˓X%'Q	$ М!2X5gZX=4b#j &ު**DI20z^϶f	$*C,Py\ (4Cwvl_VCГ(*B&ZM+CM1U^jtԴ7*`TeF5	)kt9A"bXfE2?#`TlZŤk.%[=惑IAɛ_!5ْ@@bTMǱĊ&8\{qx#)ߞ8BNH浨jvDtH@V|&5N7#;tSu˷$\; iiկv{ql'rWE*=^3D,q`Gg[3q=89LQ)JjjfS~^d@8QKAэR[(<$&n)Dy\!F~˖6A//;q+NF*F>:;7|u>7}\ CF-zkqR*mTNrϓ|y)aq&"ޏ]Lt؍<g܄w툔nTQ1CFZajZj1Uŏ<@]9<#+Cb//jmBYjV׮k1k\}b HantŪbad)!D,X!,vW螐w@D+3'{)#%N-;ޠn%d#$傏B,R]SA'#FvJJ(D6I(sTE=w\%xO<ںn|-Ŷ.:Ɣh!ڄ*")P:bf@>%˧=f>ovgbh.$3RMpE:tDZ#F5jb(MlB~hqP,)CXNRIlkW(lE͢guҖk~w5Ėjmn+ȥ\'mdVU-mz4RoLF3޳xNYdIl2"it<@dstjd|18!CiH!f؟i5#)"p}q#+o58<ECE#%b)AU5>81<s3#D6![jV@"D(	dj4Eݶ?f1l"#+ca&uCG*Aa3!o/unNT9$REŋS'߷<`wv.I;C-D'?nJ2ZQ+x̒~7>6iwGuFXo;"]$I!tU{m"fl#Nn/fxѲ}NsoDt_UlftmCUMa`!fD=yoT"szQ8;; PFq/!5FUňiSVӠ6BMkYs2CG=E~ScpRAaD"`TR DDE!AEf#%lY!x%DB@$"P#%>"eiv#[c52`u(򎡦Ɩ4-{˳l;4jyEe8E*	wQ;1jeTU=g©,(<ϓ͆DD4i>=:0G"!:H޼l|<ewԼ.|ďnr\OR}D;y#%^A0F1kp(PЊkz3]|vBLeM2#%RObi_(aDB{ƒ!L))J761']O"Du6l800\$-6HS6ڲ20#)R,:=468qYR)Tci/|ubל֫c[6&KTA+ #Ki2(SV^#)f!"5b	c.a]`TqفW6ōT-:ώD^Nr-ARmnZL}^=k}LbXcAi5i%Z7.ȻYa#Y\8QKhZL8¦ -E&% Vyqh*mD) )&]ᷠk(:#"e6yϝX'.ޚI~q3	S3jQ*7yݯ.u#)ŉ?2Pf'#ъ{4<EpU#)}h!`zT@k "J*Dnk%h[TW\&+F.V۩QV#mk&5򮖖ۀ-bʠ$UX0͊9TJ-	tn7KȰ1ɃO=ڔssj<6"QDV@#+Z!EE5.YtՓSG.oǣ=oϘQM>S{ꁈEDZ=os\JRu#+`ȑ*ZY/Z$Mk6f.P#%SLbT@RZݦyFRM)`XلjQ;#%#+-wQB~\;MCDZ0F&# `bOPS9 @DppLe8*KB)*9> ȒWY'QGDL?uߔ73!&y%HC־"3۾<g0efjR|8X@mڑ|@{'~SRɛm{46碏fc#%r!Г{ۈ[#T&F@ßWMw#%O.yARU#+,LTѶSK4i[M+)ɬ	bDc#)u덦oJ#%ʍ*۳RB!0Lۉ}FmԪLM@;QJqp<∫#)!f39֙Q^#.F@q)Y6T.0Fd6Gڼ=	v0:I&hÇ/췯YVx22!	"#SL8luGN6llj5fRجC	Z'$4TfD'HnJ8֛g 9Ml1&A0nTQ$9rsYa#)s!Ǣk⍟KP?&uT625t#aohhrٞ;ԟL62tOHzjk@峐YVϝB*FjM$%#Im-Iё~݉4%EK?}UͶfU6dEEjC55mek)Q6#hVm#)5feUEb)Q#)O~m'-#)!A#%9(?HT5$TJaQjj5٪+t	@X<oF76AI5&>U~5ɮS7򲾍s(%PZ`wQO\Oo: (ݴ`ܧ?UAxd#%#)EL#%tx>Y3HbR<#+"TZ}.AB@"*W/g;H3;9\4*b:#%OC<E3WxF0gC9-ɓG=psK@DFo>_DN׉J#\M<Mm.Go#%FBVh-3Lq[3#)gq>HS#).]fi$X	Cx:BT`-wrLv{b ӪkF`8pP8"OmFiA#%t\K&5yNT!_[+a{E#%#)\SIYwmra>L_RRV6i@1Gc	χlk>[ەb45!Y\*A#+90cn02#)2;SxYeY&Z`i#"iXA:RRGO!]U'T$P)aFpDi4ow	9 mb裳XAH~0΁	A*BS"HeDHA$4w"mW},!ϛ=lTihB)$$x#+c'`uhAĩ;5xO .N-r̚W=#DAt a#+s,"X(BzN~V;;Ӷ;̔;	RBE	HઈPW)IΟ3ϣx\BsW6g͙吞Pi4a&X1%FrJnv)nt@dD"eHȰΔeҊ7tz1$Wb4@-J<0LEnAPm6-iiJjt.ֶ66]ZnA%$a7L>-3zEa83kGVw{ڭPX#@%CXwd4M,ѐ3e:={A>I7%/MzqPqP{wtk~xf6m-%e:<>.ޔ`^s[>i	8WjM96ՈHQöY`|XQlo!HX#)3	U!K_;뱌H0:ZJo{1JF:Sݶl|50.Xgs#)d3eDfl獁.@ZJxI.Ɗ"BlZ%ņʐ!c#%YPwL؈:xzgW֊1ݼݩ&.Eg,{6GCCpTDTMs!ѹN+0V%k{[\S#%4Ų8߷#%y>3{WV }K4Wnͼ(M)Vם[Λc]㶻ak]mIV	ĔR**ePH|~ð(7uV.Bw&mET	#+}~`QijA=ic+H#Z&֛β	m\Hd+ϧJ/2K&F4rhzcIFBJЂ5HM\&Zb|4ɭS0Ue91pG7&Cn#Md0"B@#)A76#)\K٤nK!epC8O<1NÈnMBBF.֗wWKlDw0p{zEN^6Om[*84S%m<#%}="RX@:3jRѦTmJjJSk~tJӺlQ"H	u0荏5-7t6[E>AZf1eΚiLc%g}AaF`BF6	qaEg8	$KXHUd];fbI#)4I62l#)271]u7mMmq fhR7 r:qA^74[/nbŞ/,;&aS*ٙBTiKWfkhZ$	L#Еu[=9Fގ<v;F0;haa3헾c_aDѧowgT<O#%~kFI¡Pz c4F*ȣr[3L;Juaq˙dRqZ`BOrd`܇!>mG)`'Ʉ/js>~pjϒ=	ncV|^yv;ck[օDEA#%*J; lk~}*/H6Yrg(ad#+1mhTb`8n:<;{S[Z߷SM_uҞD0*<b#)f&2t1$h4M|fp뷝QA*\낶+O_$xnZy砽Vъi7>;YܜO4#)X\Y@GhReul$!b8qp6<[~~-h͐ҍh󝾯Xa${8Ԅ(Qg!FޭEh  bnm4,֦V6[fUUt/$DQȂ=΃$;xkCORaÄb6"`$q[&,(^R#k.}jOqJ7fۑwh:07ZiRJ-E\#)_Chr@ZBEaQXh<Ϫ՝HƟ!;#)=ҵ#+&]S4/gg7+%}`٠x]f#+P5`6ld#)TXԻ0#%͋l*<(w~U42C+et\\SQcΘ1$EZT22[)9_O(usbi#)F(IͶ	HPsBݥA#I#%&IIh.#)e)^H{#%܂8ʚKɄ-p,M87wʦi?GgvwqXLruC"RꊀRI7θ:^Sn<dZsƷé~%rT:CB#)<#)C"n^"0T5ߗuOL-/ex<ZU}5~yk&'=FQt#+L9u\{B9Y#)0lм#(9"?R>7С)6Aɦg,c@-ˠ~TmJ&Sp81&R);.,;_8肭IC[#%[pI-HA(bƭ^6صQjiQ$(]N=oG)TH&.UPͭ#ڜ:zMQzHQC`:dgs(ۺ+}ǞpAΟ5p9ndQ#+ʇ(D(J¶+A=Hvxk)6Phy)y}^A1 E#+!GHBr"8"!&8H*878UУ&gzJn5Pv	>$s2\1vս,Z&۴߳{m0JhHCw$}P5x⥠ѹ#p>h7S E!%Dm_CTk2}DuHIeХY)#+[Jlč̏cYVAJ[@eYabR{attCuWH+AVuwvqweYRdչbb>_R+U4a67}ZY9.#)UQÜCOP$T{}|9ke9tZqIwf3h/v)M8W9zci]rh9d̗a3׭xXIlchJfIVFI ˰KV\}Ih١Fv):Jw6׋u.,mwWlm2bA@WĘ	e=#+Ƙؚxv)+)=[F5#+!F3(1(#)D#+wn|u}sih`k9 H#)6Y+oWe2tκwv]'o{D,R#+pҔVYe1FZKKYbRJ2ci*#+Mh-F&KKu"lQc+#)ey||vhbXVDV\FJȡi1M`j&7YH\.+Th.mRT(ѡ:Eһc0I a}Dh4@SpZaŏ!aLmq?B(SBR%J:pViQVmy)Be XdA"+ 2Nj6hF@k#+lH"#+MK+%BбD46]X44ZKJ#+H#)[qc1цo.lG1!FRc+8a4@cjM&h3߾MikovI0֬iEKIc1m#Ua#)Cbef"zMhX7ATo#+^xA;.[2	~[)#+dþ*Qq#)Ed04ĶG褙AJK|jB^Cu4oJ#)r$1.QDͤ"B/TUr0S!;cJˑXlP'跮7l2?gMivh8dMPHv`iu;cde#+)ߒb0BRi&0j! &"aB& c(Ҥ*F01p#6/NHg=>A6J|i`gu+|T}lb5a>!4~r4m8R#cDɯZڵU*6OaC|H"G#+4y;)Cŧ1M{Y#M!y!=%C^%,)(g54OEfz6fk߅)q#+F^mm(,&h""7rM!D1$9k;j4Uܭ2I{n9#t.#)QZH#+vkpq)\gs#)o3zF'5QӞHypjRK+NLJ#>n<*m8b~TRj\"5Bq'#)_m"7w62xݒ53 _@yvV^L)|hl%RUkj->3BZKd2#%"{$i	5,)rTcJIoZɼmvV-X&x6-F]Ik*܌xڊY,XS\S[+W-smҭ&mۆZi#)%ZI	`VPqctze#yJkaF˔izQ A#%THPLQ`,\ ueȜ#+nJe #BK^߾LXR5 (&Y#%XACxS6{C()űk̴`hhJ̤5l)0S!P#+Gӥݡ<~ذ C`*1I@46Խ#9<\"?ۈLٌ#%D$%2}^)FޭW^+ty+T&nR6-m+%n2e{ZJDMC6c F$%*C(#%$d@$w̛0b֎Ҝξ~!mBy]اUS|ws0d6-ݭOpWie!1a~X5[fbŌcTlcU=0#)#)!Lj՘Rl&0c'az\-[=ˤFpg>\\"[#)	wb"=nUQu3\;vj(ϙغ3A#)7>^3g2]PJu#U؝/9&݅ܚ	h0ȖKiu"IƀV3#+vF3z8FMn/{Dvb3#^A69[R-E9'{.rkmd-F5'$	GH4rouƪ-\uPeNA>Qq>>#%zYFV $J=傢e#%#+ XdD4j#%ҐG#%HS)1*l[W۳c%h 1)Fe$&#)$ö^fR4l	jQfc%@aED*%ZL'Aͅ`0L@.)-WT.eB	ъA`F0DgQ )H^v{!#}vSa7kuČYq'.\OF1V#+]u_&A@#%a1#%ʹ"	2#+OKH;wd=cZ=HD	CB;w0#)fT0x?*|Ӷ~Q3~KijOGj#w}3.14&I'<lQ40oɲi|}ɔ\"@:̬gӸ=At#>}04~ F+/@PRx-#m"D~hP~Vh[l%yaPw{Ѝ{4`"$K#%#%5PK!F@(D#%DhR!#%D*ȣa!Q)#%k}bzJ:#%XU(JV2#)D	B1ːSi3K-ihd%P5u0ʈc)U[5bAot֓huyGK;.mۤWKżm^(榕ֹfX.+ncZݭFTSړ&hyq]u)\9ٱhZH!Q86QK=0	{Gdt~=~-F0AVz.#%'s.?֣#%:ڂr(6#%R#)O#'.MvU5[эmXUVz3Deݽ?'kқlk3{s@dD*g%'"F#%No+	  "*$hԘdI !5B#):TlQYRK<q,TUF>%QTj0Q!#)V@1Z-^U^mI&#U6}MOuշj"iAOӤ65#+!#+%iDĽT@S)T(#+l`MOM`7 iY#%#+1"!T0`[s"QX 0E D!d#%BB ?`<Dڮ}U0SJRUSZ*^DW`jgƹȻP	Nq\#)BB#)Y7#)f2f&`F1_ \ 0pgBE/拮3ed0CPp#)l#)Q٭3&mhzkFQFt@qk0UF	Ǆ"E#%\H!VU	7UY#%<QVӬSf̐j	X`]#)0zw淈mGXU##+L	 0HߑN_#+QVjX;X9#+rd$FࣜE2B岸	uUFsa,d˕c	t|b+y{ZT@PnF%B(d	#%Ԥݻrm<G-KQxQHa(1A@pU5b(B3c#)ȞS$c	 l 9Dz7ADBR$d ޸*"S#+Ȑ4m<m\]/4V۵7!'qE|N>%?D|؟pXgbJ.=4-%E(q|٤\g#r5+*^.wwޠBHF0cKOxn]ڄӀif#+(T<*LۜM幆No:NܵatH#+}A^i#+~}cyPtUA#%vރ /@Tfl[Klk2s:k <\loqo	' {Kk<oΧ>D,RFRͨ߻6	L>*j	_aH&hax\cCҦ7ACDz!X2x+RBxCA>CN[:7XIMnśz:2tVh2J`0Ѽi{]/wR!ÈqD7߸!l2BY#)*Bz)v7oUFsQq/dT;9#)&&%;VBY<Jaw֌#+#ZwrѦai)1X`8֎a޶m-0fQ2ΤDL9*;!לɇ}& 1T80J=9g5=.}Ke"w`qRZ)G\Lyd`=K[S#)<HM^y?yN$Rgc~_ŖY^VGPw3#+[\(09m1+7>5nQARǷCln:BMQ!OE,	a'9ߌw %#+{,JXepïv[=xEyйgI!Dn8HGis1#)U;8+ӾH}*T;"U񝸙dt#+1P#%ݚ"h"cg=H43Ɇn4$DmvPcXt<J<t2sb;]jkߌTTp`MI)	!>zn/h8hm~VhM&;Fy@!}I=_Ԯs'5VMAm.wxCs~;˵uLnX$LT5;Ew%D`dhviiA9^+*T	 qDqu;7F8#)#)^Lb'6yXIhWG"ap(6{ٶidTo:<URq2ċ%˩l|َL=jreXC6U]G	#%Ȍ3tHMJQq˩X݆_PV_#+[@' IZB**~p+0nPRA	FBCqjF}L8 H'0j{OQNt-8 f{Na==h_{G9PY4U3Fګe-KL\#"Hqx#+$#%RmtCf(TߑچaR:.3CfC沄-ͫAޯ@@U#+&@[|+>ZȀ$B'tFB0biۿiחbzT%-#+ǧLQXgBv/ƴ UJ'-KTdsv0dJTUl)s,2h63X[	@ I>KwT	%՟-?RBgo)w&FX,+0,<#U#)âҮbg{o	Z#%:C'aAԤaJQ	B!AN1M_rcw[+2s"/ci>D̈jO=Cdڌ8%W PnPD݆}A<#+HP?YѨOD0} rآF!їuE	Ja%B6j1e̺򵢑Do8TT"$)(1fSJM@B,ݲnxR!v#+(qPȣsDI$322Aa"5!2Q"6Y$%#J	!R4 o}uZw(|G|Nw;qNac"iL 7SX`Irkrҫ|1w,$à1 w.2r!$!|<Ƀd6qEv&tjVQ4ar29EAXacdd9ƌ.%Ţ#+La1hC[;6Ӥٓ}O͸K=cZ7\H_?Y:1[I'(ajVA.k͊^MM"IyA0ibmg%vI+˼Al/YjD,+(] xM#)(C計G&RЍ#)_1#)bmLnI.x_a|(Ba:$kCI~V%3VS6_HG]U4TkFqx*:BvCDiXYc)%56bceEh.mm{l*\A:%#VHRU4RIl!HV&6pdj)"M׾<"W@R9&W#+N<2ef#)IU"9*+꣍X#)6f1ѸPb ꯆޞskw6lzֳyDWy	v4BbmlLYtc鳗0NE[V%IiM 튵Va&A<QCX#%3ԒhHo,킈Ș%3Ԉ1FmdTuCt22WF0yF 5Lcg]jMfk@d0n#E]0R<G%XpADZ'C BeQ@#)16.4upMRTMqkz"ZCxAڭ,ʦ3Aud2P0feH͙֫Uwv6HC(@і3X mh֢g/Cl\`0D)bDrŦnYђz=l30h9vbhUH6Eץ1&Tk`STط7'C0c6;.x6.pc+&Q#)b7U!<VZ; xhLʚZ]]\j:*Ȉ.7b"!gRF0/	3#%ACh*1QAdT0/i,H4Op+k[ܮ[}.t*d?t5<+PaVVC{"ESbZf!@O_h?s^9#%<? 7f@;@׀WS3<{TqƊ6AQFap#)xEXA@H0Sy#%.X6 B'($;WM	ug0ұB"4)#+{	d.#%BiW6'l#+]]6u)-}BMDba`ǐ`ڋi))F楞D:1p:"ҝrLw_jom4ܻ;X	r##)u>Y;#%:)1u/4H#sfF\$_]Z0ȴ#+5g,F>nIu(*B5 5Υ8/4bZuCThOw=kX<B!k@l8S^çgR@gWGz1ڪ|XN'gx7a!Dd?}Vאm$u>Cc&)#dJXzIqˌ.G#%X.v\*m'D**;6n6zsOy݉dbN.v;1#+e%LQ "}YjIеQ;c=l3YrҪ"pb`0Zf#%FPپ&o'\gMf)#+BNbɠEPe*(ʯu#)sFkx*#)xsm^97ʼUb9[-V=	aPbF#)k""44h<LDts!*#%"#%*x[@#%H`r"Hۻߚx(Ws{" |s*#%a5?tB|Do"ȁUE2m4[uv[:-~o{BzEV+QVݭD֮!6i͕&dbDNb($"<>H6MT<Cj):mQOp@Z.G)3/DCڕ/s="=[C6|eS3RlEi!CfZfC-[lZmTjȤb$BV*֡7#+#%ɌDlD	K`aQlt̀а5w %h ,nd(6#)9*u	L%o马cmrT@Ecׄ Q|$B|>vc K@!Neܢ.]zMW6as8-7@dXyS+K:"4#%1#%zccdGQfc>3	3$-YCzbC!3GETub(wIXDмirfoenk#+ȪAZ %\q,Y6gT:Ƶ ("뎆	3hoj>}]O	`?L_Wk}Mǧo=aѽO]3סTYo&i8u9;B	Ɨ:i"!)>ORZםx3-J4ҧ6siʎP0D=nPE+վ/2vwL~(X+ߩaΞ{qɞf|]N)Tdc¥W2%p-'/xj"'@z/>mΎ)8ډfBSycc[A.^侍P!	?K*~rg{\ 1)v>xSnIR`0G@kǋFD$}r) ptT;u<|iҊ{;FIGҺ<a@$Oʂd+l+scjçZM<!`/J7c_oB퍿7G2ExFc\CQ*:QQY*Kss˯n]3=ӻc8eeo0M=\+5gu;٘kn;/s%뗸}00cFI)ne%d݌mٺE<t@+ZVlϗ4Cp&%!^S1mPn8K#+Nl1.эȎ#)&jӪ"oAzwO#)6M	֌F#SLj{V=Ƥ^<$Big5ZJn#)4rYO7@T856~H>=ٱx99M|{ܻdh}9m}흖)ا5n=neRip7;#+FlSlDzdO"Ҵx%Czҫᔙ:z6mҧĻV"#pe#+?#v>T<`ķdatB61jhvcj(3XL	YĆ̗;z=٤lC=-HO]F#)hW;=d2j+pz2ʆQ,l.#%H9tc8C^#+pqX<)xh^߁~ۼcMѩ[`DG40L|f^XAJ@1ӀtaB7#+8lhgmDݾjv^d\s:n] GAfE~)p	 D2tNꠧ4@\"#+(@m	36kL-<;:#+#%YҶT'2:1I:3k1Cf#+L8|{ؐ9@a#g(F_U	S1ZڬC,#)[{D2uÅb4a,J!mplf7ΜTyGJqԞk!.fzJp~e	:xL=qqTC츏s6QD1RYeߘқ,}6z?L%gIW3ڂ4#),e}<.̐S\A:z;FaQ$RmBD {s){pc=9ŝ/nn5żP(qqľpgLW5H>)6d:tZ4kS5A<h*NE`&8[,DB桰Vp8ۃX1ʸ-?TyChv4ĖJ&H^}-~p'8yt~GVoN|XFj='#.nHp%\zhN	b	bbՈ41j*SUI,rҌQJKpUN;zSeha#l3̬yeA+=Oc&9@&ٌ۩)#)BJ;a.ܴN)#+hg3tu{SCM hQkjYaՐ&aBpu,ŞUl=DO(eCqp0q/JU	M8qcNAz6c"h㳛Ki}-f	_Bo3>3=8ebjCO*~.>]%<ǝN;a^9HQ~:#%ӥ6x:.nʣI"?@iaQFdə-*#+cM*;vWTPksk۴E^koV1m~6!ne,*.R`*QUd*P@{No3t%;;#4~Ёxj#))ȶP#m"m_֊5H9Xɔ*[kǎ[$\4׎Ńi;dã0llY2|Ъ61#+RڛkgJ^|my4Pd$TFePQOR;^,f#&D<OWn^͚+x׷,NT!C9Z0cLqBgzYwXɺ@UKDj#2Yj2Z3Czi881lr7q.sR#CI#)p7 Phm2,u59377"nov#mE)ZڤM^Ef{&^b8v+PvCVRS#%j#)A#L\H6Pԁ54T  #)\K:f7˩RlZ!#%oOsB'mJWmҠ4H9	Z:I#ش0kg#%ZfڃT#)LQTP3xI#)+E#+BF狥r#3(Vs1VSVt"6a-)3 v(-w8|]XTE:0qcͨhRfXX+Bc9]N-Svh]5).Z	J0\p4clP(VaXI0rLNX*+qj#)f*#B(#CjҎԣUTڠPfA?U8l:>PD"{UqN鴪.N--91s[uޖ̥08fM/mY%#Lt2#)RhfwEX81[]O"OPQ^)B9Ìa%M}؈1;vpyzBs_ઊ0F"0P.]ѱ{J@*X>#+N	M%@$gPs#+G4bAmN&2(U1܁FH{}OjJkNeeHv-Sm^PzC/ŴX|^hOӰ+@A]l&E	h&^<_c,DVTpxm#CRU(S#)Ѯ1uѬ*."6"z̰=iD~#%vD#):9ԡHQ 6o-A#O׉';	\|O`Ґ-P=$A-%+"6j-$nZ`:kL'~C?!#)IVZQId#)3k,%SMcfbKI2dƖ[4TS(A%l5*Rԋ&XY	*1A^3;!}pmƃ:ͼfumT~l7G?){m&(,mY$G: Ίeƀ=L)]/X_q#+2D~ÙĞOr<ь@-_3F-Q6bߢ dI0DGdf=\g%h%뀀Կ$jŊi5kk#+L#VL;@#%BR>Id,#%˾A	__^ap]-ey7.2PzZj&rb(Ev9IbiX.1L$`.@-Ћ[S5Z%1T#+ƲQ0UԉƱHh'Վ-;ޒK#QđȮR,xw֟͐܈9f11#%0D1DlxI\ykk\˩#n2+#)xP8DKn7It6ԑhm#+,EIa$=ȷ$G*zCi`#JQH*X<ꬡLȜ&7dtpՠ2tJprhDv/o#%m/:Vw޽tHuxr(ۄ)ѳ3vCz{0ǻ<eWqRuoȃ˫^AIUE0Z&t`d,߀M&-z^'-#3>G7%tmXLUә3q"&#+.#%\˭x+i2Ћ:<h;kѯdRT	$_R\nNrCM[Sj-J]82Aq#~6Dhv+S@)3gPxՉAyk4#)PҌv*ڛPTdMLK=KTѩdbMj=,3]kQ#%hTfaAa+P1~(#?Mr+]}Ǵ8'uT<ŻEP]b3W>XѬN߳Aɭl,#[sQͺHlDzR'sw	[.BTU:+\~q5gFԲ4Ð$h#+!FT"6ozaBhH3jҰZALD#+sՔ̶_,|1d`̈IKcObJ6`ܶdMz66d Je,K}7в|#RҪ@]Y6CͰw@KTYTo;ϴp\HQ0QQ4#ţ6%52'"Rٛ\zm&&k#)#)g%#)8		0-;9fQN+|\d38АCҬUjY	Z$"y+R뮤.kHXݲ}+zЦb^7yHr lT!̳΍ًhgb%H&1 TdC(4&AdPLp#+L֑%\u.:J<Ljn<514spd r׊BsSk*m5hʐEqg\=K2aiP#%ur4"0-L:`4]qr:ӢTDDiTdt}<^2}HY85dO4w٢\ԉ3bNua[٘gD؊6@%j$e(rU	Fwj IY!WwxmQ-(&_s,#+k1btMa^(h|=j7bu]-߀#+]"/a4y^q%ql*io#+1n.)98o܌b	,xw8\7_.%M\Jgjq>qE,eb<8jr	FY&73&9kgK4(quc@8t[6<s^}00KU]@zGacbd3@;j!Q#%X:ՕSA&#+-@k{ꘃEtHst`Gcyl24MJ7!̰.ݑ$	 <ssOĂri'`M#%	ԓ=EG8mr^B2gŶEЖFtg|>I7til|Nf-	3M(hFVB3RO~<bp^b2 ˄vat|],\Q|\ib%)Fbtqtl})60L#~AwC$B,ʔCXwGKk~8[ٗD``m#+0bt0l)CLj6otsH0tzPm:N%J%#)T:fHHBv9Z8V5׹8$6qi7к.8^l}[Q Rh2Nc(q8^*:o`nbN0#)m5i#+41uM(IWJSMq[zw#+׬&3#%i<SIl}\Ch=nKIA.LkDcQ%79ADRYu,Lu(_`13j2#+)چ#)#)̆C`R(]`YIIUHU57jJH#+bdj\w4QQ*#H9]cr ja)^CTۨ坎\0DdKI7hS#%uHl:{G꿚IDQL$ߔr?.=C`DUuS`#%5W?ms痯=<t~>y6-qG,bSYOglRl#)iu-&r)G3n>~GLB@bT=E3=ua:(A$|M=ZeG7aF-,ViZC4u*%b.&&iҺJx5BYP@PZeUn^v)tN6DT1#)B@/#+/}~#+ }e$Ns7șW1}vǱtDK)?Sud|4: l&%T"`]A(cd !:{PNMƌY,JC(Q1䖺ם/7v+HB2Q#+J e1	FRf#kFYA:nUEXQ2```*KfTIC|A؞Aw7eZ#%l#)t>#)1DJgTLJ[e4S+Ϥbj¦m}3,%	N#a6C9EZ:#ґw}f! S<p#%&ޤ鮝dNy0CѨv*YT11-q#+nnb1S1NA-Ͳx*PnGAA{'X/n{+'2T,UH6d5Ҍʷ#+vppQP}Q#%@[TYBV%jJ|BD"#+BZ#+cJ[+#%,R!Ɉ$HP#)!F3'd#+A7l;V<驥}mie&QDoA)=81#%@$I]{Jʃ,7|E'}-+^ड2BW1 4a(&E)˙R[gwJ4U\֊5j̼]Bȡ8pH&`4EPLŴ1&@QPq,m!a=ѡXٶ;#)WiK	g>;#)-h)$$uȺ#)AUҀba$(Ld/+fgL(l}F}o@&U%N7^=b7Q‾FyBImGR%tgh׾:Hܡs*,ϗj=.ԁ|j{XD@JJj:Dw8&Ig>O'}ЌR	Q xFTiK52e0D	C-f3Pʆ+-])5kI#+RJydXZ`\qkX:kpчnH>Dln'`@Sv@4ɮhF_2MpP#&&!]a Ņ,Xg#)<P(&#ӝDPhCZZ3M"+G\9i`xkD#+kasvܡ[4-!4X01	c+j#)T"UIiaM㩩ewz"|mP@$&MFQrF7JaΥC#)fXh9,O茈jB^bK o\"ϗGq?WM!4<" 8 +O,'D*Q%a a$c$J){O\bcvŘN]fF?r5E\.̘3(ͺ]JAs̤"v{,'N8/orZy\"ɟް$HE:oѹ|}T<"|`m #+vR'`bk_V^_21""E}sylE+jйhllHlZnQZ)쩶[]aP{HЊq?yi  0aJSk_H)Að$Y	VW浫DRdI%di%67۪,C*5FiJiZ5oyB/^'B&d%-uh7\2i	΢G5TS")Q-fŴZZdZ@O|TTJ"[A6t|QfD_0A6lx?Oմ4$#)vEy !x3c%$O҃1Dk^AIIѧ!,+Ff`o(lHr~9|'4";	PDO`A(&bI[Rj6Ue6kQ+&#%͍&LQ(V`QU4y qߨ$k-s[a=#)Rf6jάܴlN~T*fA6D3Shk1:ɳ7.|H$,A_ʡAR%#)b,TЭx`* >#!0Z%	LXT ,L碚&6XBah>wmDjj5hƩ6#)	m6PZƭ٩~CkVY) is>mL	ށG]恪~ȴMqVXiW#+`֛#CGg#%wu	r=[rMU|O<]ʭ%#+A16"mub+B(.g$9ֵK61*1V&8WBFo%Ԥ?QA@Y\J|'X%l+v͊2+{RѻWy2Ż532JJ\YPm&ЬBe#+#)!z˱.iH#iERl]6[)Dܬ"x\Jǳ^T`0cث#)*,CDI|#)@AwYwo[v>|ii碡R.w;E#)F0U}s*#+kN8L'-U#(4~%'*$$@Co0}jgaembw>i&4dn|QJלi'GphB!ٷaԨoӆ("yǒv7fNފ*B%jȹ(V7L;YxA22.<^hUW3B`k.Qߦe̖2=oGCd&*I=-$"Q2	B\#s|S,)6qBRw=(}ʿ}dR*Lpl{ϑQ<ZR$jzm-)ʭm݈[/OFuk:4Ĝht\8	ΐj#)nql[dv0_#%#+D*$GE3p{kKu"8x<ؓmBGߒ1p39܉5{׵aڋAj>=GI (}2T(YD9<tg*e?&f`~u9$#%0Swfmbc]@!??__?x?ig=7/Wկ~wWߧ;~iXo?qT4?5*JTސ,*RG#%HBDMŉץ?wtɒL5Z <@:f垙	y5]mc>cMfb	l˲H#+3z^J]fRs"biٔ`P#+gv#՗?=SfPE?hKc#)Ab]#)	?I?@Iqi6p$&Bq1R{0B׶֘4#)d(lZ2(w-=O<5w}Yݲ*Ť)8fӄ2پ35Yw7%TCt#Ee6LHCң8cJḫy,%yqzitVHl3q8Avlx]lYLŐK4Dɦ\cYff|qC1y.DdNj͞2md#~jN]NڐYrxʳ[m%`U4'/ FṉaU(Ni5n`ɵׯ.ؔHc>L&h"2H(Rc{hI-H[õ`(p^@B#+IDsFuFQ$b[A}?dpPO#)۠_h9R#3anފ:Ze	MT(TFֲmI2e1]ZkɫYpH4H@0wei#+axȆwT@b({:>*=t쑌	!9'!G2}d'ĖRf-(1ҷm#+MZ52C%+:0sTJql~RpǤqjoXy:'##+LKa|1E2V#+Y0f"Z32FZ5{9R!IvTCFk	$Rܵ귊c׍^6ض5F%Fh2i&7<FG#+Pǉ$RiwpQ7uYKY&J=]v|QUFGADۮ("ȒԈ!Gz9Bxsa +$XHĈr;ι$$	#+AB'#)ںj_bf<BHbvzwe##)藀rՂxĢ_EBl5=0`Zw͊_wGւBv#+	U2>݇:Qwm秇C=|}#l<pLO}%Р]y	|5<ٸ/B'\3$&zN67#)7$97k҄yڡ!7og	&RKxT>yAS>dDc+%9:KpYk#DZ!^/,$	[<r1"mњp>#)Un5dk#gmUc~?21OPH#+#%iw
 #<==
-#-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1.4.11 (GNU/Linux)\n\niQIcBAABAgAGBQJTHvSFAAoJEGelZe39+Q5kWwkQALEljJFszU8FMMjKDlX0Au09\nOjr1yPRMFYwPfnotrbqPRpqDMs0oEhZXBxtYSpUPc6oQoIsJljYTMHfi0VTeSLV8\nw149AMLvKHcl0sPkdiJ24GyxNmUBirMETFTJ9aqKXbtJL42wv869vWWmfjOP2PKY\n12X0gUso7GZyMAQUu0bRr+4/OtBF0BiGSQ0p+CXNZoKXaZ31ug2ADTUTx4PudHHj\naf4FjBkHI5gdmNxaWUdq7yxWbWMh8ctDzXKnwIKqVsi072LF4IYqzwcBeBJnXOLR\n3Ixme3Dl/Z3AnFx4rUGEdslLpkmXJVQq1Yhsxzcjjm4gz7yJZllv0xi0b1WINoM0\ntFYXq048wtMZN1Be1Z5MO/um9C3ipJTXkaHWaVaCzsTuqq5NFL3LLxDYFCdmSyyq\nwSNmILbGYmI6MP/14S5sBJ96UMI7gOCf6NoHmyMrRTFbXuNu7lcWUFHWKa9TMdKK\nDaEnkGOLga6Sj+TnwagmSVBX3S6GFnQwYSHjfumABGYMZUpP4H9nvjn5EGnZlI4n\nLqgg2k7c2QWY0n+Bxn2bjtvRUXnoci1pam6OL/qGIURvFIPN9Wxrezg4IZtoX1yi\n9/YorArlleK7TD4/w84woH6XpvC10A0WSiqy648G8rQ5gKH1BbIserprcxtY97Od\n8o8Ri+hR4fwg3ys8dZD1\n=AcNa\n-----END PGP SIGNATURE-----\n
+#-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABCgAGBQJVmXvNAAoJEGelZe39+Q5kQQ0P/1Y3Bf/S8UW8KRHtVF7SFxE2\nvNg1CXzdnNV/feNB5HFzpMOuL6weIUjNSac8MfBigWOvb6Rnm+Y8o1yXO4g26qxd\n716qYWmiQQmz4lzylr8grMJwhwP2BO/UE7ksKQn1LzaW8FH8x/3RoWE7HnESVxri\n2Nt8UY7WwTwVXiSvQEC08kHr5EXpBIBjlIr6Zw5jTb0S+hBL1G/J8xq/It2omSwX\nFZNBmUpL++Vgp3Wb+gww3AyjTu58PdSrJPeJWP6Aq6Nf3HMJ50LF1URh79oj4uWF\nZJ2DM0peUye9M8zZs//nQqx9RLQG6+pWnfqMqKd7T91WnzsKAf/sy64QRCUEk6i3\n5y+YLt/VlKl/m9TKWr5W2HpL3+ODDBEoeUQZCTB/9uprtYM9pIMCilqiwdK1DI+o\njwrg1OxmV3ToP1BnYXtfsEp0Q84oaw+Qc2+bK94VkkRX4Efwy7zbxdMxi7JalqF7\nIiI4/GussYVyGJiRnOBRYE4bza5us47ojFKNSwlwn9H3a1VywptuNB76MXhD7AYA\nvQKrG7jyryBTpjFteQPMA5C7qnqMgXf49KAo10cZtBWFlSFUnhvodPS6aIEKeM1F\nHKMWp670D2KcWw7h5UYZtZOUZCbNFjWSHfgmyiq5X5xRwE1zv+FkXEwCqp9J8REA\nnxZmf3PQ/TH6TYLOAkQf\n=jBY5\n-----END PGP SIGNATURE-----\n
diff -Naur ns-3.23/waf-tools/boost.py ns-3.24/waf-tools/boost.py
--- ns-3.23/waf-tools/boost.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/waf-tools/boost.py	2015-09-15 11:18:44.000000000 -0700
@@ -30,18 +30,18 @@
 
 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-static and --boost-mt command-line arguments.
+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: 
+   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, 
+   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.
@@ -52,9 +52,10 @@
 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']
+			  '/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 = '''
@@ -111,14 +112,11 @@
 				   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-static', action='store_true',
-				   default=False, dest='boost_static',
-				   help='link with static boost libraries (.lib/.a)')
 	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 (dgsyp, d for debug),
+				   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)")
@@ -135,6 +133,8 @@
 
 @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)
@@ -147,7 +147,7 @@
 	if node:
 		try:
 			txt = node.read()
-		except (OSError, IOError):
+		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)
@@ -161,7 +161,7 @@
 	includes = k and k[0] or kw.get('includes', None)
 	if includes and self.__boost_get_version_file(includes):
 		return includes
-	for d in Utils.to_list(self.environ.get('INCLUDE', '')) + BOOST_INCLUDES:
+	for d in self.environ.get('INCLUDE', '').split(';') + BOOST_INCLUDES:
 		if self.__boost_get_version_file(d):
 			return d
 	if includes:
@@ -196,7 +196,9 @@
 		path = self.root.find_dir(libs)
 		files = path.ant_glob('*boost_*')
 	if not libs or not files:
-		for d in Utils.to_list(self.environ.get('LIB', [])) + BOOST_LIBS:
+		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_*')
@@ -227,15 +229,10 @@
 	according to the parameters
 	'''
 	path, files = self.__boost_get_libs_path(**kw)
-	t = []
-	if kw.get('mt', False):
-		t.append('mt')
-	if kw.get('abi', None):
-		t.append(kw['abi'])
-	tags = t and '(-%s)+' % '-'.join(t) or ''
+	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
+	toolset_pat = '(-%s[0-9]{0,3})' % toolset
+	version = '-%s' % self.env.BOOST_VERSION
 
 	def find_lib(re_lib, files):
 		for file in files:
@@ -249,27 +246,49 @@
 			name = name[3:]
 		return name[:name.rfind('.')]
 
-	libs = []
-	for lib in Utils.to_list(k and k[0] or kw.get('lib', None)):
-		py = (lib == 'python') and '(-py%s)+' % kw['python'] or ''
-		# Trying libraries, from most strict match to least one
-		for pattern in ['boost_%s%s%s%s%s' % (lib, toolset_pat, tags, py, version),
-						'boost_%s%s%s%s' % (lib, tags, py, version),
-						'boost_%s%s%s' % (lib, tags, version),
-						# Give up trying to find the right version
-						'boost_%s%s%s%s' % (lib, toolset_pat, tags, py),
-						'boost_%s%s%s' % (lib, tags, py),
-						'boost_%s%s' % (lib, tags)]:
-			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.end_msg('lib %s not found in %s' % (lib, path.abspath()))
-			self.fatal('The configuration failed')
+	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.end_msg('lib %s not found in %s' % (lib, path.abspath()))
+				self.fatal('The configuration failed')
+		return libs
 
-	return path.abspath(), libs
+	return  path.abspath(), match_libs(kw.get('lib', None), False), match_libs(kw.get('stlib', None), True)
 
 
 @conf
@@ -283,7 +302,10 @@
 	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)}
+	params = {
+		'lib': k and k[0] or kw.get('lib', None),
+		'stlib': kw.get('stlib', None)
+	}
 	for key, value in self.options.__dict__.items():
 		if not key.startswith('boost_'):
 			continue
@@ -293,47 +315,41 @@
 	var = kw.get('uselib_store', 'BOOST')
 
 	self.start_msg('Checking boost includes')
-        try:
-                self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
-                self.env.BOOST_VERSION = self.boost_get_version(inc)
-        except Errors.WafError:
-                self.end_msg("not found", 'YELLOW')
-                raise
-        #self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
-        #self.env.BOOST_VERSION = self.boost_get_version(inc)
+	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)
 	if Logs.verbose:
 		Logs.pprint('CYAN', '	path : %s' % self.env['INCLUDES_%s' % var])
 
-	if not params['lib']:
+	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')
-        try:
-                suffix = params.get('static', None) and 'ST' or ''
-                path, libs = self.boost_get_libs(**params)
-        except Errors.WafError:
-                self.end_msg("not found", 'YELLOW')
-                raise
-        #suffix = params.get('static', None) and 'ST' or ''
-        #path, libs = self.boost_get_libs(**params)
-	self.env['%sLIBPATH_%s' % (suffix, var)] = [path]
-	self.env['%sLIB_%s' % (suffix, var)] = 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')
 	if Logs.verbose:
 		Logs.pprint('CYAN', '	path : %s' % path)
-		Logs.pprint('CYAN', '	libs : %s' % libs)
+		Logs.pprint('CYAN', '	shared libs : %s' % libs)
+		Logs.pprint('CYAN', '	static libs : %s' % stlibs)
 
 
 	def try_link():
-		if 'system' in params['lib']:
+		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 'thread' in params['lib']:
+		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']:
+		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']
@@ -378,3 +394,18 @@
 			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 ns-3.23/waf-tools/cflags.py ns-3.24/waf-tools/cflags.py
--- ns-3.23/waf-tools/cflags.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/waf-tools/cflags.py	2015-09-15 11:18:44.000000000 -0700
@@ -131,6 +131,8 @@
 	'msvc': msvc,
 	'icc': icc,
 	'icpc': icc,
+	'clang': gcc,
+	'clang++': gcc,
 }
 
 profiles = {
@@ -151,8 +153,8 @@
 			     "Build profiles control the default compilation flags"
 			     " used for C/C++ programs, if CCFLAGS/CXXFLAGS are not"
 			     " set set in the environment. [Allowed Values: %s]"
-			     % ", ".join([repr(p) for p in profiles.keys()])),
-		       choices=profiles.keys(),
+			     % ", ".join([repr(p) for p in list(profiles.keys())])),
+		       choices=list(profiles.keys()),
 		       dest='build_profile')
 
 def configure(conf):
diff -Naur ns-3.23/waf-tools/clang_compilation_database.py ns-3.24/waf-tools/clang_compilation_database.py
--- ns-3.23/waf-tools/clang_compilation_database.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.24/waf-tools/clang_compilation_database.py	2015-09-15 11:18:44.000000000 -0700
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+# 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
+from waflib.Tools import c, cxx
+
+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 ns-3.23/waf-tools/command.py ns-3.24/waf-tools/command.py
--- ns-3.23/waf-tools/command.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/waf-tools/command.py	2015-09-15 11:18:44.000000000 -0700
@@ -21,8 +21,8 @@
 	def __str__(self):
 		"string to display to the user"
 		env = self.env
-		src_str = ' '.join([a.nice_path(env) for a in self.inputs])
-		tgt_str = ' '.join([a.nice_path(env) for a in self.outputs])
+		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:
@@ -80,17 +80,17 @@
 		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, basestring):
+				if isinstance(cmd.stdin, str):
 					cmd.stdin = self._subst_arg(cmd.stdin, 'in', namespace)
-				if isinstance(cmd.stdout, basestring):
+				if isinstance(cmd.stdout, str):
 					cmd.stdout = self._subst_arg(cmd.stdout, 'out', namespace)
-				if isinstance(cmd.stderr, basestring):
+				if isinstance(cmd.stderr, str):
 					cmd.stderr = self._subst_arg(cmd.stderr, 'out', namespace)
-				for argI in xrange(len(cmd.argv)):
+				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.iteritems():
+					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):
diff -Naur ns-3.23/waf-tools/misc.py ns-3.24/waf-tools/misc.py
--- ns-3.23/waf-tools/misc.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/waf-tools/misc.py	2015-09-15 11:18:44.000000000 -0700
@@ -32,7 +32,7 @@
 	outfile = tsk.outputs[0].abspath()
 	try:
 		shutil.copy2(infile, outfile)
-	except (OSError, IOError):
+	except EnvironmentError:
 		return 1
 	else:
 		if tsk.chmod: os.chmod(outfile, tsk.chmod)
diff -Naur ns-3.23/waf-tools/relocation.py ns-3.24/waf-tools/relocation.py
--- ns-3.23/waf-tools/relocation.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/waf-tools/relocation.py	2015-09-15 11:18:44.000000000 -0700
@@ -12,7 +12,7 @@
 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
@@ -47,10 +47,10 @@
 		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))
+			print(("relocating the source directory %r -> %r" % (srcdir, self.top_dir)))
 			srcnode.children = {}
 
-			for (k, v) in d.children.items():
+			for (k, v) in list(d.children.items()):
 				srcnode.children[k] = v
 				v.parent = srcnode
 			d.children = {}
diff -Naur ns-3.23/waf-tools/shellcmd.py ns-3.24/waf-tools/shellcmd.py
--- ns-3.23/waf-tools/shellcmd.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/waf-tools/shellcmd.py	2015-09-15 11:18:44.000000000 -0700
@@ -14,6 +14,7 @@
 # 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
@@ -23,7 +24,7 @@
 env_var_rx = re.compile(r"^([a-zA-Z0-9_]+)=(\S+)$")
 
 def debug(message):
-    print >> sys.stderr, message
+    print(message, file=sys.stderr)
 
 
 if sys.platform == 'win32':
@@ -127,7 +128,7 @@
             tokens = shlex.split(command)
         debug("command: shlex: %r" % (tokens,))
 
-        BEGIN, COMMAND, CHDIR, STDERR, STDOUT, STDIN = range(6)
+        BEGIN, COMMAND, CHDIR, STDERR, STDOUT, STDIN = list(range(6))
         state = BEGIN
         self.current_command = None
         env_vars = dict()
@@ -215,7 +216,7 @@
         files_to_close = []
         piped_commands = []
         piped_commands_display = []
-        BEGIN, PIPE = range(2)
+        BEGIN, PIPE = list(range(2))
         state = BEGIN
         cwd = '.'
         while pipeline:
@@ -233,7 +234,7 @@
             cmd = node
             if verbose:
                 if cmd.env_vars:
-                    env_vars_str = ' '.join(['%s=%s' % (key, val) for key, val in cmd.env_vars.iteritems()])
+                    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))
@@ -295,7 +296,7 @@
                 try:
                     retval = self._exec_piped_commands(piped_commands)
                     if verbose:
-                        print "%s: exit code %i" % (' '.join(piped_commands_display), retval)
+                        print("%s: exit code %i" % (' '.join(piped_commands_display), retval))
                 finally:
                     for f in files_to_close:
                         if f is not dev_null:
@@ -318,10 +319,10 @@
                         files_to_close = []
                     if this_retval == 0:
                         if verbose:
-                            print "%s: exit code %i (|| is short-circuited)" % (' '.join(piped_commands_display), retval)
+                            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)
+                        print("%s: exit code %i (|| proceeds)" % (' '.join(piped_commands_display), retval))
                     state = BEGIN
                     piped_commands = []
                     piped_commands_display = []
@@ -336,10 +337,10 @@
                         files_to_close = []
                     if this_retval != 0:
                         if verbose:
-                            print "%s: exit code %i (&& is short-circuited)" % (' '.join(piped_commands_display), retval)
+                            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)
+                        print("%s: exit code %i (&& proceeds)" % (' '.join(piped_commands_display), retval))
                     state = BEGIN
                     piped_commands = []
                     piped_commands_display = []
@@ -349,7 +350,7 @@
 def _main():
     pipeline = Pipeline()
     pipeline.parse('./foo.py 2>&1 < xxx | cat && ls')
-    print pipeline.run()
+    print(pipeline.run())
 
 if __name__ == '__main__':
     _main()
diff -Naur ns-3.23/wscript ns-3.24/wscript
--- ns-3.23/wscript	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/wscript	2015-09-15 11:18:44.000000000 -0700
@@ -1,6 +1,7 @@
 ## -*- 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
@@ -54,7 +55,7 @@
 Configure.autoconfig = 0
 
 # the following two variables are used by the target "waf dist"
-VERSION = file("VERSION", "rt").read().strip()
+VERSION = open("VERSION", "rt").read().strip()
 APPNAME = 'ns'
 
 wutils.VERSION = VERSION
@@ -106,14 +107,27 @@
     # Print the list of module names in 3 columns.
     i = 1
     for name in names:
-        print name.ljust(25),
+        print(name.ljust(25), end=' ')
         if i == 3:
-                print
+                print()
                 i = 0
         i = i+1
 
     if i != 1:
-        print
+        print()
+
+# 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
@@ -232,46 +246,45 @@
         flag_str = 'flags ' + ' '.join(l)
     else:
         flag_str = 'flag ' + ' '.join(l)
-    if flag_str > 28:
+    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':
-        fname = 'test.cc'
         env.append_value('CXXFLAGS', flag)
     else:
-        fname = 'test.c'
         env.append_value('CFLAGS', flag)
 
     if linkflags is not None:
         env.append_value("LINKFLAGS", linkflags)
 
     try:
-        retval = conf.run_c_code(code='#include <stdio.h>\nint main() { return 0; }\n',
-                                 env=env, compile_filename=fname,
-                                 features=[mode, mode+'program'], execute=False)
+        retval = conf.check(compiler=mode, fragment='int main() { return 0; }', features='c', env=env)
     except Errors.ConfigurationError:
         ok = False
     else:
-        ok = (retval == 0)
+        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
@@ -281,6 +294,7 @@
     except conf.errors.ConfigurationError:
         return None
 
+
 def configure(conf):
     conf.load('relocation', tooldir=['waf-tools'])
 
@@ -292,12 +306,13 @@
     conf.env['NS3_OPTIONAL_FEATURES'] = []
 
     conf.load('compiler_c')
-    cc_string='.'.join(conf.env['CC_VERSION'])
+    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
 
@@ -311,9 +326,16 @@
         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')
+
     env['PLATFORM'] = sys.platform
     env['BUILD_PROFILE'] = Options.options.build_profile
     if Options.options.build_profile == "release":
@@ -342,7 +364,8 @@
         cxx = env['CXX']
         cxx_check_libstdcxx = cxx + ['-print-file-name=libstdc++.so']
         p = subprocess.Popen(cxx_check_libstdcxx, stdout=subprocess.PIPE)
-        libstdcxx_location = os.path.dirname(p.stdout.read().strip())
+        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)
@@ -468,15 +491,15 @@
         else:
             why_not_examples = "defaults to disabled"
 
-    env['EXAMPLE_DIRECTORIES'] = []
-    for dir in os.listdir('examples'):
-        if dir.startswith('.') or dir == 'CVS':
-            continue
-        if os.path.isdir(os.path.join('examples', dir)):
-            env['EXAMPLE_DIRECTORIES'].append(dir)
-
     conf.report_optional_feature("ENABLE_EXAMPLES", "Build 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:
@@ -531,12 +554,12 @@
             conf.env.append_value(confvar, value)
 
     # Write a summary of optional features status
-    print "---- Summary of optional NS-3 features:"
-    print "%-30s: %s%s%s" % ("Build profile", Logs.colors('GREEN'),
-                             Options.options.build_profile, Logs.colors('NORMAL'))
+    print("---- Summary of optional NS-3 features:")
+    print("%-30s: %s%s%s" % ("Build profile", Logs.colors('GREEN'),
+                             Options.options.build_profile, Logs.colors('NORMAL')))
     bld = wutils.bld
-    print "%-30s: %s%s%s" % ("Build directory", Logs.colors('GREEN'),
-                             Options.options.out, Logs.colors('NORMAL'))
+    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 conf.env['NS3_OPTIONAL_FEATURES']:
@@ -546,7 +569,7 @@
         else:
             status = 'not enabled (%s)' % reason_not_enabled
             color = 'RED'
-        print "%-30s: %s%s%s" % (caption, Logs.colors(color), status, Logs.colors('NORMAL'))
+        print("%-30s: %s%s%s" % (caption, Logs.colors(color), status, Logs.colors('NORMAL')))
 
 
 class SuidBuild_task(Task.Task):
@@ -558,14 +581,14 @@
         self.m_display = 'build-suid'
         try:
             program_obj = wutils.find_program(self.generator.name, self.generator.env)
-        except ValueError, ex:
+        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 >> sys.stderr, 'setting suid bit on executable ' + self.filename
+        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():
@@ -630,32 +653,38 @@
 def add_examples_programs(bld):
     env = bld.env
     if env['ENABLE_EXAMPLES']:
-        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))
+        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']]
-    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
+    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:
@@ -900,8 +929,8 @@
     if (env['PRINT_BUILT_MODULES_AT_END']):
 
         # Print the list of built modules.
-        print
-        print 'Modules built:'
+        print()
+        print('Modules built:')
         names_without_prefix = []
         for name in env['NS3_ENABLED_MODULES']:
             name1 = name[len('ns3-'):]
@@ -909,13 +938,13 @@
                 name1 += " (no Python)"
             names_without_prefix.append(name1)
         print_module_names(names_without_prefix)
-        print
+        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('Modules not built (see ns-3 tutorial for explanation):')
             print_module_names(env['MODULES_NOT_BUILT'])
-            print
+            print()
 
         # Set this so that the lists won't be printed until the next
         # build is done.
@@ -960,15 +989,13 @@
 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()
-
+        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)
 
@@ -1055,19 +1082,18 @@
 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()
+        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:
@@ -1119,7 +1145,7 @@
 
     _getVersion()
     doxygen_config = os.path.join('doc', 'doxygen.conf')
-    if subprocess.Popen([env['DOXYGEN'], doxygen_config]).wait():
+    if subprocess.Popen(env['DOXYGEN'] + [doxygen_config]).wait():
         Logs.error("Doxygen build returned an error.")
         raise SystemExit(1)
 
@@ -1137,10 +1163,10 @@
     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()
+        bld = Context.create_context("build")
+        bld.options = Options.options # provided for convenience
+        bld.cmd = "build"
+        bld.execute()
         _doxygen(bld)
 
 class Ns3SphinxContext(Context.Context):
@@ -1149,8 +1175,8 @@
     cmd = 'sphinx'
 
     def sphinx_build(self, path):
-        print
-        print "[waf] Building sphinx docs for " + path
+        print()
+        print("[waf] Building sphinx docs for " + path)
         if subprocess.Popen(["make", "SPHINXOPTS=-N", "-k",
                              "html", "singlehtml", "latexpdf" ],
                             cwd=path).wait() :
diff -Naur ns-3.23/wutils.py ns-3.24/wutils.py
--- ns-3.23/wutils.py	2015-05-13 11:05:27.000000000 -0700
+++ ns-3.24/wutils.py	2015-09-15 11:18:44.000000000 -0700
@@ -68,7 +68,7 @@
 
 def get_proc_env(os_env=None):
     env = bld.env
-    if sys.platform == 'linux2':
+    if sys.platform == 'linux2' or sys.platform == 'linux':
         pathvar = 'LD_LIBRARY_PATH'
     elif sys.platform == 'darwin':
         pathvar = 'DYLD_LIBRARY_PATH'
@@ -133,13 +133,13 @@
         else:
             try:
                 retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait()
-            except WindowsError, ex:
+            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).iteritems():
+            for name, val in vars(signal).items():
                 if len(name) > 3 and name[:3] == 'SIG' and name[3] != '_':
                     if val == -retval:
                         signame = name
@@ -167,7 +167,7 @@
 
         try:
             program_obj = find_program(program_name, env)
-        except ValueError, ex:
+        except ValueError as ex:
             raise WafError(str(ex))
 
         program_node = program_obj.path.find_or_declare(program_obj.target)
@@ -183,7 +183,7 @@
         program_name = program_string
         try:
             program_obj = find_program(program_name, env)
-        except ValueError, ex:
+        except ValueError as ex:
             raise WafError(str(ex))
 
         program_node = program_obj.path.find_or_declare(program_obj.target)
